Have "range_convert_range()" dynamically allocate a string large enough
to hold the representation of the range, rather than imposing a fixed-size limit on the string. Check for overflow in "strtoul()" - and use "strtoul()" rather than "strtol()" for range members. Clean up indentation. Get rid of an unnecessary include in <epan/range.h>. svn path=/trunk/; revision=12323
This commit is contained in:
parent
01f041efc2
commit
a053ee960e
|
@ -2149,11 +2149,13 @@ write_pref(gpointer data, gpointer user_data)
|
|||
|
||||
case PREF_RANGE:
|
||||
{
|
||||
char range_string[MAXRANGESTRING];
|
||||
char *range_string;
|
||||
|
||||
range_string = range_convert_range(*pref->varp.range);
|
||||
fprintf(arg->pf, "# A string denoting an positive integer range (e.g., \"1-20,30-40\").\n");
|
||||
fprintf(arg->pf, "%s.%s: %s\n", arg->module->name, pref->name,
|
||||
range_convert_range(*pref->varp.range, range_string));
|
||||
range_string);
|
||||
g_free(range_string);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
68
epan/range.c
68
epan/range.c
|
@ -31,6 +31,7 @@
|
|||
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include <glib.h>
|
||||
|
||||
|
@ -141,13 +142,14 @@ convert_ret_t range_convert_str(range_t **rangep, const gchar *es,
|
|||
range->ranges[range->nranges].low = 1;
|
||||
} else if (isdigit((unsigned char)c)) {
|
||||
/* Subrange starts with the specified number */
|
||||
val = strtol(p, &endp, 10);
|
||||
errno = 0;
|
||||
val = strtoul(p, &endp, 10);
|
||||
if (p == endp) {
|
||||
/* That wasn't a valid number. */
|
||||
g_free(range);
|
||||
return CVT_SYNTAX_ERROR;
|
||||
}
|
||||
if (val > G_MAXUINT32) {
|
||||
if (errno == ERANGE || val > G_MAXUINT32) {
|
||||
/* That was valid, but it's too big. */
|
||||
g_free(range);
|
||||
return CVT_NUMBER_TOO_BIG;
|
||||
|
@ -179,23 +181,24 @@ convert_ret_t range_convert_str(range_t **rangep, const gchar *es,
|
|||
range->ranges[range->nranges].high = max_value;
|
||||
} else if (isdigit((unsigned char)c)) {
|
||||
/* Subrange ends with the specified number. */
|
||||
val = strtoul(p, &endp, 10);
|
||||
if (p == endp) {
|
||||
/* That wasn't a valid number. */
|
||||
g_free(range);
|
||||
return CVT_SYNTAX_ERROR;
|
||||
}
|
||||
if (val > G_MAXUINT32) {
|
||||
/* That was valid, but it's too big. */
|
||||
g_free(range);
|
||||
return CVT_NUMBER_TOO_BIG;
|
||||
}
|
||||
p = endp;
|
||||
range->ranges[range->nranges].high = val;
|
||||
errno = 0;
|
||||
val = strtoul(p, &endp, 10);
|
||||
if (p == endp) {
|
||||
/* That wasn't a valid number. */
|
||||
g_free(range);
|
||||
return CVT_SYNTAX_ERROR;
|
||||
}
|
||||
if (errno == ERANGE || val > G_MAXUINT32) {
|
||||
/* That was valid, but it's too big. */
|
||||
g_free(range);
|
||||
return CVT_NUMBER_TOO_BIG;
|
||||
}
|
||||
p = endp;
|
||||
range->ranges[range->nranges].high = val;
|
||||
|
||||
/* Skip white space. */
|
||||
while ((c = *p) == ' ' || c == '\t')
|
||||
p++;
|
||||
/* Skip white space. */
|
||||
while ((c = *p) == ' ' || c == '\t')
|
||||
p++;
|
||||
} else {
|
||||
/* Neither empty nor a number. */
|
||||
g_free(range);
|
||||
|
@ -291,25 +294,32 @@ range_foreach(range_t *range, void (*callback)(guint32 val))
|
|||
}
|
||||
}
|
||||
|
||||
/* This function converts a range_t to a (caller-provided) string. */
|
||||
/* This function converts a range_t to a (g_malloc()-allocated) string. */
|
||||
char *
|
||||
range_convert_range(range_t *range, char *string)
|
||||
range_convert_range(range_t *range)
|
||||
{
|
||||
guint32 i, k;
|
||||
GString *str;
|
||||
guint32 i;
|
||||
gboolean prepend_comma = FALSE;
|
||||
char *string;
|
||||
|
||||
k = 0;
|
||||
string[k] = '\0';
|
||||
str = g_string_new("");
|
||||
|
||||
for (i=0; i < range->nranges; i++) {
|
||||
if (i != 0)
|
||||
string[k++] = ',';
|
||||
if (prepend_comma)
|
||||
g_string_append_c(str, ',');
|
||||
|
||||
k += sprintf(&string[k], "%d-%d", range->ranges[i].low,
|
||||
range->ranges[i].high);
|
||||
if (range->ranges[i].low == range->ranges[i].high)
|
||||
g_string_sprintfa(str, "%u", range->ranges[i].low);
|
||||
else
|
||||
g_string_sprintfa(str, "%u-%u", range->ranges[i].low,
|
||||
range->ranges[i].high);
|
||||
prepend_comma = TRUE;
|
||||
}
|
||||
|
||||
return(string);
|
||||
|
||||
string = str->str;
|
||||
g_string_free(str, FALSE);
|
||||
return string;
|
||||
}
|
||||
|
||||
/* Create a copy of a range. */
|
||||
|
|
|
@ -30,10 +30,6 @@
|
|||
|
||||
#include <glib.h>
|
||||
|
||||
#include <epan/frame_data.h>
|
||||
|
||||
#define MAXRANGESTRING 255
|
||||
|
||||
typedef struct range_admin_tag {
|
||||
guint32 low;
|
||||
guint32 high;
|
||||
|
@ -65,7 +61,7 @@ extern gboolean ranges_are_equal(range_t *a, range_t *b);
|
|||
|
||||
extern void range_foreach(range_t *range, void (*callback)(guint32 val));
|
||||
|
||||
extern char *range_convert_range(range_t *range, char *string);
|
||||
extern char *range_convert_range(range_t *range);
|
||||
|
||||
extern range_t *range_copy(range_t *src);
|
||||
|
||||
|
|
|
@ -204,15 +204,16 @@ pref_show(pref_t *pref, gpointer user_data)
|
|||
|
||||
case PREF_RANGE:
|
||||
{
|
||||
char range_string[MAXRANGESTRING];
|
||||
char *range_string;
|
||||
|
||||
if (pref->saved_val.range != NULL)
|
||||
g_free(pref->saved_val.range);
|
||||
pref->saved_val.range = range_copy(*pref->varp.range);
|
||||
range_convert_range(*pref->varp.range, range_string);
|
||||
range_string = range_convert_range(*pref->varp.range);
|
||||
pref->control = create_preference_entry(main_tb, pref->ordinal,
|
||||
label_string, pref->description,
|
||||
range_string);
|
||||
g_free(range_string);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue