Merge branch 'bug5786_range_022' into maint-0.2.2

This commit is contained in:
Nick Mathewson 2012-05-10 15:38:57 -04:00
commit 79c4c8195a
3 changed files with 30 additions and 0 deletions

8
changes/bug5786_range Normal file
View File

@ -0,0 +1,8 @@
o Minor bugfixes:
- Make our number-parsing functions always treat too-large values
as an error, even when those values exceed the width of the
underlying type. Previously, if the caller provided these
functions with minima or maxima set to the extreme values of the
underlying integer type, these functions would return those
values on overflow rather than treating overflow as an error.
Fix for part of bug 5786; bugfix on Tor 0.0.9.

View File

@ -764,6 +764,9 @@ tor_digest256_is_zero(const char *digest)
/* Helper: common code to check whether the result of a strtol or strtoul or /* Helper: common code to check whether the result of a strtol or strtoul or
* strtoll is correct. */ * strtoll is correct. */
#define CHECK_STRTOX_RESULT() \ #define CHECK_STRTOX_RESULT() \
/* Did an overflow occur? */ \
if (errno == ERANGE) \
goto err; \
/* Was at least one character converted? */ \ /* Was at least one character converted? */ \
if (endptr == s) \ if (endptr == s) \
goto err; \ goto err; \
@ -800,6 +803,7 @@ tor_parse_long(const char *s, int base, long min, long max,
char *endptr; char *endptr;
long r; long r;
errno = 0;
r = strtol(s, &endptr, base); r = strtol(s, &endptr, base);
CHECK_STRTOX_RESULT(); CHECK_STRTOX_RESULT();
} }
@ -812,6 +816,7 @@ tor_parse_ulong(const char *s, int base, unsigned long min,
char *endptr; char *endptr;
unsigned long r; unsigned long r;
errno = 0;
r = strtoul(s, &endptr, base); r = strtoul(s, &endptr, base);
CHECK_STRTOX_RESULT(); CHECK_STRTOX_RESULT();
} }
@ -823,6 +828,7 @@ tor_parse_double(const char *s, double min, double max, int *ok, char **next)
char *endptr; char *endptr;
double r; double r;
errno = 0;
r = strtod(s, &endptr); r = strtod(s, &endptr);
CHECK_STRTOX_RESULT(); CHECK_STRTOX_RESULT();
} }
@ -836,6 +842,7 @@ tor_parse_uint64(const char *s, int base, uint64_t min,
char *endptr; char *endptr;
uint64_t r; uint64_t r;
errno = 0;
#ifdef HAVE_STRTOULL #ifdef HAVE_STRTOULL
r = (uint64_t)strtoull(s, &endptr, base); r = (uint64_t)strtoull(s, &endptr, base);
#elif defined(MS_WINDOWS) #elif defined(MS_WINDOWS)

View File

@ -283,6 +283,21 @@ test_util_strmisc(void)
test_assert(i == 1); test_assert(i == 1);
} }
{
/* Test tor_parse_* where we overflow/underflow the underlying type. */
/* This string should overflow 64-bit ints. */
#define TOOBIG "100000000000000000000000000"
test_eq(0L, tor_parse_long(TOOBIG, 10, LONG_MIN, LONG_MAX, &i, NULL));
test_eq(i, 0);
test_eq(0L, tor_parse_long("-"TOOBIG, 10, LONG_MIN, LONG_MAX, &i, NULL));
test_eq(i, 0);
test_eq(0UL, tor_parse_ulong(TOOBIG, 10, 0, ULONG_MAX, &i, NULL));
test_eq(i, 0);
test_eq(U64_LITERAL(0), tor_parse_uint64(TOOBIG, 10,
0, UINT64_MAX, &i, NULL));
test_eq(i, 0);
}
/* Test failing snprintf cases */ /* Test failing snprintf cases */
test_eq(-1, tor_snprintf(buf, 0, "Foo")); test_eq(-1, tor_snprintf(buf, 0, "Foo"));
test_eq(-1, tor_snprintf(buf, 2, "Foo")); test_eq(-1, tor_snprintf(buf, 2, "Foo"));