summaryrefslogtreecommitdiff
path: root/epan/range.c
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/range.c
parent01f041efc2587b3d88d163d34792e6c623b17078 (diff)
downloadwireshark-a053ee960ecb3d93f68537e090d18792bf9be3f2.tar.gz
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/range.c')
-rw-r--r--epan/range.c72
1 files changed, 41 insertions, 31 deletions
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. */