Index: ChangeLog =================================================================== RCS file: /cvs/mime/shared-mime-info/ChangeLog,v retrieving revision 1.67 diff -u -r1.67 ChangeLog --- ChangeLog 26 Nov 2004 22:13:04 -0000 1.67 +++ ChangeLog 26 Nov 2004 22:20:39 -0000 @@ -1,5 +1,10 @@ 2004-11-26 Christophe Fergeau + * update-mime-database.c: (parse_int_value), (match_offset): use + strtoul when reading an unsigned long, not strtol, fixes #1506 + +2004-11-26 Christophe Fergeau + * update-mime-database.c: (parse_int_value): take value endianness into account when reading the "mask" tag, fixes #1507. Index: update-mime-database.c =================================================================== RCS file: /cvs/mime/shared-mime-info/update-mime-database.c,v retrieving revision 1.32 diff -u -r1.32 update-mime-database.c --- update-mime-database.c 26 Nov 2004 22:13:04 -0000 1.32 +++ update-mime-database.c 26 Nov 2004 22:20:39 -0000 @@ -840,7 +840,14 @@ unsigned long value; int b; - value = strtol(in, &end, 0); + value = strtoul(in, &end, 0); + if (errno == ERANGE) { + g_set_error(error, MIME_ERROR, 0, + "Number out-of-range (%s should fit in %d bytes)", + in, bytes); + return; + } + if (*end != '\0') { g_set_error(error, MIME_ERROR, 0, "Value is not a number"); @@ -865,9 +872,17 @@ if (in_mask) { int b; - long mask; + unsigned long mask; - mask = strtol(in_mask, &end, 0); + mask = strtoul(in_mask, &end, 0); + if (errno == ERANGE) { + g_set_error(error, MIME_ERROR, 0, + "Mask out-of-range (%s should fit in %d bytes)", + in_mask, bytes); + return; + } + + if (*end != '\0') { g_set_error(error, MIME_ERROR, 0, @@ -1022,11 +1037,33 @@ } match->range_start = strtol(offset, &end, 10); + if (errno == ERANGE) { + char *number; + number = g_strndup(offset, end-offset); + g_set_error(error, MIME_ERROR, 0, + "Number out-of-range (%s should fit in 4 bytes)", + number); + g_free(number); + return; + } + if (*end == ':' && end[1] && match->range_start >= 0) { int last; + char *begin; + + begin = end + 1; + last = strtol(begin, &end, 10); + if (errno == ERANGE) { + char *number; + number = g_strndup(begin, end-begin); + g_set_error(error, MIME_ERROR, 0, + "Number out-of-range (%s should fit in 8 bytes)", + number); + g_free(number); + return; + } - last = strtol(end + 1, &end, 10); if (*end == '\0' && last >= match->range_start) match->range_length = last - match->range_start + 1; else