aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2004-10-17 01:31:36 +0000
committerGuy Harris <guy@alum.mit.edu>2004-10-17 01:31:36 +0000
commita053ee960ecb3d93f68537e090d18792bf9be3f2 (patch)
tree5a047ba08d17c9aac823be4131180fa3ad02ecce /epan
parent01f041efc2587b3d88d163d34792e6c623b17078 (diff)
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
Diffstat (limited to 'epan')
-rw-r--r--epan/prefs.c6
-rw-r--r--epan/range.c72
-rw-r--r--epan/range.h6
3 files changed, 46 insertions, 38 deletions
diff --git a/epan/prefs.c b/epan/prefs.c
index bc39fb177f..d1ee89d106 100644
--- a/epan/prefs.c
+++ b/epan/prefs.c
@@ -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;
}
diff --git a/epan/range.c b/epan/range.c
index adf1591239..0c09626061 100644
--- a/epan/range.c
+++ b/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;
-
- /* Skip white space. */
- while ((c = *p) == ' ' || c == '\t')
- p++;
+ 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++;
} 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++] = ',';
-
- k += sprintf(&string[k], "%d-%d", range->ranges[i].low,
- range->ranges[i].high);
+ if (prepend_comma)
+ g_string_append_c(str, ',');
+
+ 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. */
diff --git a/epan/range.h b/epan/range.h
index de88cfb77a..f3ec4c2c3d 100644
--- a/epan/range.h
+++ b/epan/range.h
@@ -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);