Use ws_basetostru32(), rather than strtoul(), when parsing ranges.
Make ws_basetostru32(), and the other ws_baseto... routines, public, and use ws_basetostru32() when parsing ranges, to detect additional errors such as negative values. Addresses part of https://ask.wireshark.org/question/5538/preference-range/. Change-Id: I00fac97a198a237b01b5cd9406ea32c220f80972 Reviewed-on: https://code.wireshark.org/review/30266 Reviewed-by: Guy Harris <guy@alum.mit.edu>
This commit is contained in:
parent
075ef8029c
commit
5e019c6b8f
16
epan/range.c
16
epan/range.c
|
@ -13,6 +13,7 @@
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
@ -22,7 +23,8 @@
|
||||||
#include <epan/frame_data.h>
|
#include <epan/frame_data.h>
|
||||||
|
|
||||||
#include <epan/range.h>
|
#include <epan/range.h>
|
||||||
#include <stdio.h>
|
|
||||||
|
#include <wsutil/strtoi.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Size of the header of a range_t.
|
* Size of the header of a range_t.
|
||||||
|
@ -84,11 +86,11 @@ range_convert_str_work(wmem_allocator_t *scope, range_t **rangep, const gchar *e
|
||||||
range_t *range;
|
range_t *range;
|
||||||
guint nranges;
|
guint nranges;
|
||||||
const gchar *p;
|
const gchar *p;
|
||||||
char *endp;
|
const char *endp;
|
||||||
gchar c;
|
gchar c;
|
||||||
guint i;
|
guint i;
|
||||||
guint32 tmp;
|
guint32 tmp;
|
||||||
unsigned long val;
|
guint32 val;
|
||||||
|
|
||||||
if ( (rangep == NULL) || (es == NULL) )
|
if ( (rangep == NULL) || (es == NULL) )
|
||||||
return CVT_SYNTAX_ERROR;
|
return CVT_SYNTAX_ERROR;
|
||||||
|
@ -135,8 +137,8 @@ range_convert_str_work(wmem_allocator_t *scope, range_t **rangep, const gchar *e
|
||||||
} else if (g_ascii_isdigit(c)) {
|
} else if (g_ascii_isdigit(c)) {
|
||||||
/* Subrange starts with the specified number */
|
/* Subrange starts with the specified number */
|
||||||
errno = 0;
|
errno = 0;
|
||||||
val = strtoul(p, &endp, 0);
|
ws_basestrtou32(p, &endp, &val, 0);
|
||||||
if (p == endp) {
|
if (errno == EINVAL) {
|
||||||
/* That wasn't a valid number. */
|
/* That wasn't a valid number. */
|
||||||
wmem_free(scope, range);
|
wmem_free(scope, range);
|
||||||
return CVT_SYNTAX_ERROR;
|
return CVT_SYNTAX_ERROR;
|
||||||
|
@ -181,8 +183,8 @@ range_convert_str_work(wmem_allocator_t *scope, range_t **rangep, const gchar *e
|
||||||
} else if (g_ascii_isdigit(c)) {
|
} else if (g_ascii_isdigit(c)) {
|
||||||
/* Subrange ends with the specified number. */
|
/* Subrange ends with the specified number. */
|
||||||
errno = 0;
|
errno = 0;
|
||||||
val = strtoul(p, &endp, 0);
|
ws_basestrtou32(p, &endp, &val, 0);
|
||||||
if (p == endp) {
|
if (errno == EINVAL) {
|
||||||
/* That wasn't a valid number. */
|
/* That wasn't a valid number. */
|
||||||
wmem_free(scope, range);
|
wmem_free(scope, range);
|
||||||
return CVT_SYNTAX_ERROR;
|
return CVT_SYNTAX_ERROR;
|
||||||
|
|
|
@ -102,7 +102,7 @@ DEFINE_WS_STRTOI_BITS(32)
|
||||||
DEFINE_WS_STRTOI_BITS(16)
|
DEFINE_WS_STRTOI_BITS(16)
|
||||||
DEFINE_WS_STRTOI_BITS(8)
|
DEFINE_WS_STRTOI_BITS(8)
|
||||||
|
|
||||||
static gboolean ws_basestrtou64(const gchar* str, const gchar** endptr, guint64* cint, int base)
|
gboolean ws_basestrtou64(const gchar* str, const gchar** endptr, guint64* cint, int base)
|
||||||
{
|
{
|
||||||
gchar* end;
|
gchar* end;
|
||||||
guint64 val;
|
guint64 val;
|
||||||
|
@ -160,7 +160,7 @@ gboolean ws_hexstrtou64(const gchar* str, const gchar** endptr, guint64* cint)
|
||||||
}
|
}
|
||||||
|
|
||||||
#define DEFINE_WS_STRTOU_BITS(bits) \
|
#define DEFINE_WS_STRTOU_BITS(bits) \
|
||||||
static gboolean ws_basestrtou##bits(const gchar* str, const gchar** endptr, guint##bits* cint, int base) \
|
gboolean ws_basestrtou##bits(const gchar* str, const gchar** endptr, guint##bits* cint, int base) \
|
||||||
{ \
|
{ \
|
||||||
guint64 val; \
|
guint64 val; \
|
||||||
if (!ws_basestrtou64(str, endptr, &val, base)) { \
|
if (!ws_basestrtou64(str, endptr, &val, base)) { \
|
||||||
|
|
|
@ -61,6 +61,28 @@ WS_DLL_PUBLIC gboolean ws_hexstrtou32(const gchar* str, const gchar** endptr, gu
|
||||||
WS_DLL_PUBLIC gboolean ws_hexstrtou16(const gchar* str, const gchar** endptr, guint16* cint);
|
WS_DLL_PUBLIC gboolean ws_hexstrtou16(const gchar* str, const gchar** endptr, guint16* cint);
|
||||||
WS_DLL_PUBLIC gboolean ws_hexstrtou8 (const gchar* str, const gchar** endptr, guint8* cint);
|
WS_DLL_PUBLIC gboolean ws_hexstrtou8 (const gchar* str, const gchar** endptr, guint8* cint);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* \brief Convert a string in the specified base to an unsigned int, with
|
||||||
|
* error checks.
|
||||||
|
* \param str The string to convert
|
||||||
|
* \param endptr A pointer that will store a pointer to the first invalid
|
||||||
|
* character in str, allowing a number to be parsed even if there is trailing
|
||||||
|
* whitespace. If NULL, then the string is assumed to contain only valid
|
||||||
|
* characters (or it will error out).
|
||||||
|
* \param cint The converted integer
|
||||||
|
* \param base The base for the integer; 0 means "if it begins with 0x,
|
||||||
|
* it's hex, otherwise if it begins with 0, it's octal, otherwise it's
|
||||||
|
* decimal".
|
||||||
|
* \return TRUE if the conversion succeeds, FALSE otherwise.
|
||||||
|
* On error, errno is set to EINVAL for unrecognized input and ERANGE
|
||||||
|
* if the resulting number does not fit in the type.
|
||||||
|
*/
|
||||||
|
|
||||||
|
WS_DLL_PUBLIC gboolean ws_basestrtou64(const gchar* str, const gchar** endptr, guint64* cint, int base);
|
||||||
|
WS_DLL_PUBLIC gboolean ws_basestrtou32(const gchar* str, const gchar** endptr, guint32* cint, int base);
|
||||||
|
WS_DLL_PUBLIC gboolean ws_basestrtou16(const gchar* str, const gchar** endptr, guint16* cint, int base);
|
||||||
|
WS_DLL_PUBLIC gboolean ws_basestrtou8 (const gchar* str, const gchar** endptr, guint8* cint, int base);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
Loading…
Reference in New Issue