diff options
author | Stig Bjørlykke <stig@bjorlykke.org> | 2011-10-28 20:30:41 +0000 |
---|---|---|
committer | Stig Bjørlykke <stig@bjorlykke.org> | 2011-10-28 20:30:41 +0000 |
commit | a52bf4edc51ae9d77e0da2087fc66c45793a1690 (patch) | |
tree | aa063674d5d2ccdca644912eb4f1b9e76db8b13f /epan/ftypes | |
parent | 3e241efba3e14ee07632c22ed5c7ee99b981a1e8 (diff) |
Simplified code for checking integer ranges.
svn path=/trunk/; revision=39660
Diffstat (limited to 'epan/ftypes')
-rw-r--r-- | epan/ftypes/ftype-integer.c | 134 |
1 files changed, 32 insertions, 102 deletions
diff --git a/epan/ftypes/ftype-integer.c b/epan/ftypes/ftype-integer.c index e2bfff2115..37348c5497 100644 --- a/epan/ftypes/ftype-integer.c +++ b/epan/ftypes/ftype-integer.c @@ -62,7 +62,8 @@ get_sinteger(fvalue_t *fv) static gboolean -uint32_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value _U_, LogFunc logfunc) +uint_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value _U_, LogFunc logfunc, + guint32 max) { unsigned long value; char *endptr; @@ -102,13 +103,10 @@ uint32_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value _U_, Lo } return FALSE; } - if (value > G_MAXUINT32) { - /* - * Fits in an unsigned long, but not in a guint32 - * (an unsigned long might be 64 bits). - */ + + if (value > max) { if (logfunc != NULL) - logfunc("\"%s\" causes an integer overflow.", s); + logfunc("\"%s\" too big for this field, maximum %u.", s, max); return FALSE; } @@ -117,52 +115,32 @@ uint32_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value _U_, Lo } static gboolean -uint24_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value, LogFunc logfunc) +uint32_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value, LogFunc logfunc) { - gboolean valid = uint32_from_unparsed (fv, s, allow_partial_value, logfunc); - - if (valid && (fv->value.uinteger > 0xFFFFFF)) { /* G_MAXUINT24 */ - if (logfunc != NULL) - logfunc("\"%s\" too big for this field, maximum %u.", - s, 0xFFFFFF); - return FALSE; - } + return uint_from_unparsed (fv, s, allow_partial_value, logfunc, G_MAXUINT32); +} - return valid; +static gboolean +uint24_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value, LogFunc logfunc) +{ + return uint_from_unparsed (fv, s, allow_partial_value, logfunc, 0xFFFFFF); } static gboolean uint16_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value, LogFunc logfunc) { - gboolean valid = uint32_from_unparsed (fv, s, allow_partial_value, logfunc); - - if (valid && (fv->value.uinteger > G_MAXUINT16)) { - if (logfunc != NULL) - logfunc("\"%s\" too big for this field, maximum %u.", - s, G_MAXUINT16); - return FALSE; - } - - return valid; + return uint_from_unparsed (fv, s, allow_partial_value, logfunc, G_MAXUINT16); } static gboolean uint8_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value, LogFunc logfunc) { - gboolean valid = uint32_from_unparsed (fv, s, allow_partial_value, logfunc); - - if (valid && (fv->value.uinteger > G_MAXUINT8)) { - if (logfunc != NULL) - logfunc("\"%s\" too big for this field, maximum %u.", - s, G_MAXUINT8); - return FALSE; - } - - return valid; + return uint_from_unparsed (fv, s, allow_partial_value, logfunc, G_MAXUINT8); } static gboolean -sint32_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value _U_, LogFunc logfunc) +sint_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value _U_, LogFunc logfunc, + gint32 max, gint32 min) { long value; char *endptr; @@ -204,22 +182,16 @@ sint32_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value _U_, Lo } return FALSE; } - if (value > G_MAXINT32) { - /* - * Fits in an long, but not in a gint32 - * (a long might be 64 bits). - */ + + if (value > max) { if (logfunc != NULL) - logfunc("\"%s\" causes an integer overflow.", s); + logfunc("\"%s\" too big for this field, maximum %d.", + s, max); return FALSE; - } - if (value < G_MININT32) { - /* - * Fits in a long, but not in a gint32 (a long might be - * 64 bits). - */ + } else if (value < min) { if (logfunc != NULL) - logfunc("\"%s\" causes an integer underflow.", s); + logfunc("\"%s\" too small for this field, minimum %d.", + s, min); return FALSE; } @@ -228,69 +200,27 @@ sint32_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value _U_, Lo } static gboolean -sint24_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value, LogFunc logfunc) +sint32_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value, LogFunc logfunc) { - gboolean valid = sint32_from_unparsed (fv, s, allow_partial_value, logfunc); - - if (valid) { - if (fv->value.sinteger > 0xFFFFFF) { /* G_MAXINT24 */ - if (logfunc != NULL) - logfunc("\"%s\" too big for this field, maximum %d.", - s, 0xFFFFFF); - return FALSE; - } else if (fv->value.sinteger < - (0xFFFFFF + 1)) { /* G_MININT24 */ - if (logfunc != NULL) - logfunc("\"%s\" too small for this field, minimum %d.", - s, - (0xFFFFFF + 1)); - return FALSE; - } - } + return sint_from_unparsed (fv, s, allow_partial_value, logfunc, G_MAXINT32, G_MININT32); +} - return valid; +static gboolean +sint24_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value, LogFunc logfunc) +{ + return sint_from_unparsed (fv, s, allow_partial_value, logfunc, 0xFFFFFF, -(0xFFFFFF + 1)); } static gboolean sint16_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value, LogFunc logfunc) { - gboolean valid = sint32_from_unparsed (fv, s, allow_partial_value, logfunc); - - if (valid) { - if (fv->value.sinteger > G_MAXINT16) { - if (logfunc != NULL) - logfunc("\"%s\" too big for this field, maximum %d.", - s, G_MAXINT16); - return FALSE; - } else if (fv->value.sinteger < G_MININT16) { - if (logfunc != NULL) - logfunc("\"%s\" too small for this field, minimum %d.", - s, G_MININT16); - return FALSE; - } - } - - return valid; + return sint_from_unparsed (fv, s, allow_partial_value, logfunc, G_MAXINT16, G_MININT16); } static gboolean sint8_from_unparsed(fvalue_t *fv, char *s, gboolean allow_partial_value, LogFunc logfunc) { - gboolean valid = sint32_from_unparsed (fv, s, allow_partial_value, logfunc); - - if (valid) { - if (fv->value.sinteger > G_MAXINT8) { - if (logfunc != NULL) - logfunc("\"%s\" too big for this field, maximum %d.", - s, G_MAXINT8); - return FALSE; - } else if (fv->value.sinteger < G_MININT8) { - if (logfunc != NULL) - logfunc("\"%s\" too small for this field, minimum %d.", - s, G_MININT8); - return FALSE; - } - } - - return valid; + return sint_from_unparsed (fv, s, allow_partial_value, logfunc, G_MAXINT8, G_MININT8); } static int |