Wireshark-dev: Re: [Wireshark-dev] [Wireshark-commits] rev 20209: /trunk/epan/ftypes/ /trunk/ep
From: Guy Harris <guy@xxxxxxxxxxxx>
Date: Sun, 24 Dec 2006 12:46:08 -0800
Jaap Keuter wrote:
It failed to build across the board, so I backed out the change, giving ronnie the time to check in a working version.
"Working version" probably involves, at least with current versions of PCRE, setting PCRE's allocate function to ep_alloc() and its free function to a no-op function. (I'm not sure what should be done about the "frame allocate" function.) See attached patch.
Index: epan/ftypes/ftype-pcre.c =================================================================== --- epan/ftypes/ftype-pcre.c (revision 20210) +++ epan/ftypes/ftype-pcre.c (working copy) @@ -32,6 +32,7 @@ #endif #include <ftypes-int.h> +#include <epan/emem.h> #ifdef HAVE_LIBPCRE @@ -47,10 +48,10 @@ const char *pcre_error_text; int pcre_error_offset; - tuple = g_malloc(sizeof(pcre_tuple_t)); - tuple->string = g_strdup(value); /* The RE as string */ + tuple = ep_alloc(sizeof(pcre_tuple_t)); + tuple->string = ep_strdup(value); /* The RE as string */ tuple->ex = NULL; - /* Compile the RE */ + /* Compile the RE; it will be stored in ep allocated memory */ tuple->re = pcre_compile( value, /* pattern */ 0, /* PCRE options */ @@ -58,23 +59,24 @@ &pcre_error_offset, /* Start offset of error in pattern */ NULL /* Default char tables (C locale) */ ); + if (pcre_error_text) { - tuple->error = g_strdup_printf("In regular expression \"%s\":\n" + tuple->error = ep_strdup_printf("In regular expression \"%s\":\n" "%s (character position %d)", value, pcre_error_text, pcre_error_offset); return tuple; } else { tuple->error = NULL; } - /* Study the RE */ + /* Study the RE; it will be stored in ep allocated memory */ tuple->ex = pcre_study(tuple->re, 0, &pcre_error_text); if (pcre_error_text) { if (tuple->error) { - tuple->error = g_strdup_printf("In regular expression \"%s\":\n" + tuple->error = ep_strdup_printf("In regular expression \"%s\":\n" "%s. %s", value, tuple->error, pcre_error_text); } else { - tuple->error = g_strdup_printf("In regular expression \"%s\":\n" + tuple->error = ep_strdup_printf("In regular expression \"%s\":\n" "%s", value, pcre_error_text); } @@ -83,39 +85,16 @@ } static void -pcre_tuple_free(pcre_tuple_t *tuple) -{ - if (tuple) { - if (tuple->string) g_free(tuple->string); - if (tuple->re) g_free(tuple->re); - if (tuple->ex) g_free(tuple->ex); - if (tuple->error) g_free(tuple->error); - g_free(tuple); - } -} - -static void pcre_fvalue_new(fvalue_t *fv) { fv->value.re = NULL; } -static void -pcre_fvalue_free(fvalue_t *fv) -{ - if (fv->value.re) { - pcre_tuple_free(fv->value.re); - } -} - /* Generate a FT_PCRE from a parsed string pattern. * Uses the specified logfunc() to report errors. */ static gboolean val_from_string(fvalue_t *fv, char *pattern, LogFunc logfunc) { - /* Free up the old value, if we have one */ - pcre_fvalue_free(fv); - fv->value.re = pcre_tuple_new(pattern); if (fv->value.re->error) { logfunc(fv->value.re->error); @@ -129,8 +108,6 @@ static gboolean val_from_unparsed(fvalue_t *fv, char *pattern, gboolean allow_partial_value _U_, LogFunc logfunc) { - /* Free up the old value, if we have one */ - pcre_fvalue_free(fv); g_assert(! allow_partial_value); fv->value.re = pcre_tuple_new(pattern); @@ -161,8 +138,6 @@ pcre_fvalue_set(fvalue_t *fv, gpointer value, gboolean already_copied) { g_assert(value != NULL); - /* Free up the old value, if we have one */ - pcre_fvalue_free(fv); g_assert(! already_copied); fv->value.re = pcre_tuple_new(value); } @@ -173,6 +148,16 @@ return fv->value.re; } +/* + * Free routine - we set up the pcre library to use ep_alloc() to allocate + * memory, so we don't need to explicitly free the memory and thus need a + * free routine that does nothing. + */ +static void +noop_free(void *mem _U_) +{ +} + void ftype_register_pcre(void) { @@ -182,7 +167,7 @@ "Compiled Perl-Compatible Regular Expression object", /* pretty_name */ 0, /* wire_size */ pcre_fvalue_new, /* new_value */ - pcre_fvalue_free, /* free_value */ + NULL, /* free_value */ val_from_unparsed, /* val_from_unparsed */ val_from_string, /* val_from_string */ pcre_to_repr, /* val_to_string_repr */ @@ -211,6 +196,13 @@ NULL, /* len */ NULL, /* slice */ }; + + /* + * Set PCRE's allocator to be ep_alloc. That means there's + * no explicit free operation. + */ + pcre_malloc = ep_alloc; + pcre_free = noop_free; ftype_register(FT_PCRE, &pcre_type); }
- References:
- Prev by Date: Re: [Wireshark-dev] [Wireshark-commits] rev 20209: /trunk/epan/ftypes/ /trunk/epan/ftypes/: ftype-pcre.c
- Next by Date: [Wireshark-dev] String Handling API
- Previous by thread: Re: [Wireshark-dev] [Wireshark-commits] rev 20209: /trunk/epan/ftypes/ /trunk/epan/ftypes/: ftype-pcre.c
- Next by thread: Re: [Wireshark-dev] [Wireshark-commits] rev 20196: /trunk/ /trunk/: make-version.pl
- Index(es):