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:
Guy Harris 2004-10-17 01:31:36 +00:00
parent 01f041efc2
commit a053ee960e
4 changed files with 47 additions and 38 deletions

View File

@ -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;
}

View File

@ -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. */

View File

@ -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);

View File

@ -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;
}