Wireshark-dev: Re: [Wireshark-dev] [Wireshark-commits] rev 44380: /trunk/epan/ /trunk/epan/: em
From: Gerald Combs <gerald@xxxxxxxxxxxxx>
Date: Thu, 09 Aug 2012 13:41:11 -0700
Attached is a patch that iterates over the key data instead of using recursion. Valgrind is happier with it but I'm not yet sure it functions correctly. On 8/9/12 1:33 PM, mmann78@xxxxxxxxxxxx wrote: > Does this patch help? If not, I would consider blaming guids_add_guid > for not initializing the key member of the emem_tree_key_t structure. > Even though I think either would be caught by > the DISSECTOR_ASSERT_NOT_REACHED macro. Also, are there warning for > emem_tree_lookup32_array() as well? > -----Original Message----- > From: Jeff Morriss <jeff.morriss.ws@xxxxxxxxx> > To: wireshark-dev <wireshark-dev@xxxxxxxxxxxxx> > Sent: Thu, Aug 9, 2012 4:06 pm > Subject: Re: [Wireshark-dev] [Wireshark-commits] rev 44380: /trunk/epan/ > /trunk/epan/: emem.c > > mmann@xxxxxxxxxxxxx <mailto:mmann@xxxxxxxxxxxxx> wrote: >> http://anonsvn.wireshark.org/viewvc/viewvc.cgi?view=rev&revision=44380 >> >> User: mmann >> Date: 2012/08/09 06:59 AM >> >> Log: >> Make emem_tree_*32_array functions non-destructive. > > With this change Valgrind issues many, many warnings as Wireshark starts: > > ==10126== Conditional jump or move depends on uninitialised value(s) > ==10126== at 0x6071DEF: emem_tree_insert32_array (emem.c:1887) > ==10126== by 0x607874E: guids_add_guid (guid-utils.c:117) > ==10126== by 0x62638CE: dcerpc_init_uuid (packet-dcerpc.c:830) > ==10126== by 0x69E3061: register_all_protocol_handoffs (register.c:1360) > ==10126== by 0x6085CA2: proto_init (proto.c:401) > ==10126== by 0x6073565: epan_init (epan.c:113) > ==10126== by 0x418AE5: main (tshark.c:963) > ==10126== > ==10126== More than 100 errors detected. Subsequent errors > ==10126== will still be recorded, but in less detail than before. > > ___________________________________________________________________________ > Sent via: Wireshark-dev mailing list <wireshark-dev@xxxxxxxxxxxxx <mailto:wireshark-dev@xxxxxxxxxxxxx>> > Archives: http://www.wireshark.org/lists/wireshark-dev > Unsubscribe: https://wireshark.org/mailman/options/wireshark-dev > mailto:wireshark-dev-request@xxxxxxxxxxxxx?subject=unsubscribe > > > > ___________________________________________________________________________ > Sent via: Wireshark-dev mailing list <wireshark-dev@xxxxxxxxxxxxx> > Archives: http://www.wireshark.org/lists/wireshark-dev > Unsubscribe: https://wireshark.org/mailman/options/wireshark-dev > mailto:wireshark-dev-request@xxxxxxxxxxxxx?subject=unsubscribe >
Index: epan/emem.c
===================================================================
--- epan/emem.c (revision 44398)
+++ epan/emem.c (working copy)
@@ -1841,185 +1841,112 @@
/* insert a new node in the tree. if this node matches an already existing node
* then just replace the data for that node */
-static void
-emem_tree_insert32_array_local(emem_tree_t *se_tree, emem_tree_key_t *key, void *data)
-{
- emem_tree_t *next_tree;
- if((key[0].length<1)||(key[0].length>100)){
- DISSECTOR_ASSERT_NOT_REACHED();
- }
- if((key[0].length==1)&&(key[1].length==0)){
- emem_tree_insert32(se_tree, *key[0].key, data);
- return;
- }
-
- next_tree=lookup_or_insert32(se_tree, *key[0].key, create_sub_tree, se_tree, EMEM_TREE_NODE_IS_SUBTREE);
-
- if(key[0].length==1){
- key++;
- } else {
- key[0].length--;
- key[0].key++;
- }
- emem_tree_insert32_array_local(next_tree, key, data);
-}
-
void
emem_tree_insert32_array(emem_tree_t *se_tree, emem_tree_key_t *key, void *data)
{
- int key_count = 0;
- emem_tree_key_t *local_key = key,
- *copy_key;
+ emem_tree_t *insert_tree = NULL;
+ emem_tree_key_t *cur_key;
+ guint32 i, insert_key32;
- if((key[0].length<1)||(key[0].length>100)){
- DISSECTOR_ASSERT_NOT_REACHED();
- }
+ if(!se_tree || !key) return;
- /* Make a copy of the keys so the length isn't destroyed */
- while ((local_key->key != NULL) && (local_key->length != 0)) {
- key_count++;
- local_key++;
+ for (cur_key = key; cur_key->length > 0; cur_key++) {
+ if(cur_key->length > 100) {
+ DISSECTOR_ASSERT_NOT_REACHED();
+ }
+
+ for (i = 0; i < cur_key->length; i++) {
+ /* Insert using the previous key32 */
+ if (!insert_tree) {
+ insert_tree = se_tree;
+ } else {
+ insert_tree = lookup_or_insert32(insert_tree, insert_key32, create_sub_tree, se_tree, EMEM_TREE_NODE_IS_SUBTREE);
+ }
+ insert_key32 = cur_key->key[i];
+ }
}
- copy_key = ep_alloc(sizeof(emem_tree_key_t)*(key_count+1));
- local_key = copy_key;
- while ((key->key != NULL) && (key->length != 0)) {
- copy_key->length = key->length;
- copy_key->key = key->key;
- key++;
- copy_key++;
+ if(!insert_tree) {
+ /* We didn't get valid data. Should we return NULL instead? */
+ DISSECTOR_ASSERT_NOT_REACHED();
}
- /* "NULL terminate" the key */
- copy_key->length = 0;
- copy_key->key = NULL;
+ emem_tree_insert32(insert_tree, insert_key32, data);
- emem_tree_insert32_array_local(se_tree, local_key, data);
}
-static void *
-emem_tree_lookup32_array_local(emem_tree_t *se_tree, emem_tree_key_t *key)
-{
- emem_tree_t *next_tree;
-
- if(!se_tree || !key) return NULL; /* prevent searching on NULL pointer */
-
- if((key[0].length<1)||(key[0].length>100)){
- DISSECTOR_ASSERT_NOT_REACHED();
- }
- if((key[0].length==1)&&(key[1].length==0)){
- return emem_tree_lookup32(se_tree, *key[0].key);
- }
- next_tree=emem_tree_lookup32(se_tree, *key[0].key);
- if(!next_tree){
- return NULL;
- }
- if(key[0].length==1){
- key++;
- } else {
- key[0].length--;
- key[0].key++;
- }
- return emem_tree_lookup32_array_local(next_tree, key);
-}
-
void *
emem_tree_lookup32_array(emem_tree_t *se_tree, emem_tree_key_t *key)
{
- int key_count = 0;
- emem_tree_key_t *local_key = key,
- *copy_key;
+ emem_tree_t *lookup_tree = NULL;
+ emem_tree_key_t *cur_key;
+ guint32 i, lookup_key32;
if(!se_tree || !key) return NULL; /* prevent searching on NULL pointer */
- if((key[0].length<1)||(key[0].length>100)){
- DISSECTOR_ASSERT_NOT_REACHED();
- }
+ for (cur_key = key; cur_key->length > 0; cur_key++) {
+ if(cur_key->length > 100) {
+ DISSECTOR_ASSERT_NOT_REACHED();
+ }
- /* Make a copy of the keys so the length isn't destroyed */
- while ((local_key->key != NULL) && (local_key->length != 0)) {
- key_count++;
- local_key++;
+ for (i = 0; i < cur_key->length; i++) {
+ /* Lookup using the previous key32 */
+ if (!lookup_tree) {
+ lookup_tree = se_tree;
+ } else {
+ lookup_tree = emem_tree_lookup32(lookup_tree, lookup_key32);
+ if (!lookup_tree) {
+ return NULL;
+ }
+ }
+ lookup_key32 = cur_key->key[i];
+ }
}
- copy_key = ep_alloc(sizeof(emem_tree_key_t)*(key_count+1));
- local_key = copy_key;
- while ((key->key != NULL) && (key->length != 0)) {
- copy_key->length = key->length;
- copy_key->key = key->key;
- key++;
- copy_key++;
- }
-
- /* "NULL terminate" the key */
- copy_key->length = 0;
- copy_key->key = NULL;
-
- return emem_tree_lookup32_array_local(se_tree, local_key);
-}
-
-static void *
-emem_tree_lookup32_array_le_local(emem_tree_t *se_tree, emem_tree_key_t *key)
-{
- emem_tree_t *next_tree;
-
- if(!se_tree || !key) return NULL; /* prevent searching on NULL pointer */
-
- if((key[0].length<1)||(key[0].length>100)){
+ if(!lookup_tree) {
+ /* We didn't get valid data. Should we return NULL instead? */
DISSECTOR_ASSERT_NOT_REACHED();
}
- if((key[0].length==1)&&(key[1].length==0)){ /* last key in key array */
- return emem_tree_lookup32_le(se_tree, *key[0].key);
- }
- next_tree=emem_tree_lookup32(se_tree, *key[0].key);
- /* key[0].key not found so find le and return */
- if(!next_tree)
- return emem_tree_lookup32_le(se_tree, *key[0].key);
- /* key[0].key found so inc key pointer and try again */
- if(key[0].length==1){
- key++;
- } else {
- key[0].length--;
- key[0].key++;
- }
- return emem_tree_lookup32_array_le_local(next_tree, key);
+ return emem_tree_lookup32(lookup_tree, lookup_key32);
}
void *
emem_tree_lookup32_array_le(emem_tree_t *se_tree, emem_tree_key_t *key)
{
- int key_count = 0;
- emem_tree_key_t *local_key = key,
- *copy_key;
+ emem_tree_t *lookup_tree = NULL;
+ emem_tree_key_t *cur_key;
+ guint32 i, lookup_key32;
if(!se_tree || !key) return NULL; /* prevent searching on NULL pointer */
- if((key[0].length<1)||(key[0].length>100)){
- DISSECTOR_ASSERT_NOT_REACHED();
- }
+ for (cur_key = key; cur_key->length > 0; cur_key++) {
+ if(cur_key->length > 100) {
+ DISSECTOR_ASSERT_NOT_REACHED();
+ }
- /* Make a copy of the keys so the length isn't destroyed */
- while ((local_key->key != NULL) && (local_key->length != 0)) {
- key_count++;
- local_key++;
+ for (i = 0; i < cur_key->length; i++) {
+ /* Lookup using the previous key32 */
+ if (!lookup_tree) {
+ lookup_tree = se_tree;
+ } else {
+ lookup_tree = emem_tree_lookup32_le(lookup_tree, lookup_key32);
+ if (!lookup_tree) {
+ return NULL;
+ }
+ }
+ lookup_key32 = cur_key->key[i];
+ }
}
- copy_key = ep_alloc(sizeof(emem_tree_key_t)*(key_count+1));
- local_key = copy_key;
- while ((key->key != NULL) && (key->length != 0)) {
- copy_key->length = key->length;
- copy_key->key = key->key;
- key++;
- copy_key++;
+ if(!lookup_tree) {
+ /* We didn't get valid data. Should we return NULL instead? */
+ DISSECTOR_ASSERT_NOT_REACHED();
}
- /* "NULL terminate" the key */
- copy_key->length = 0;
- copy_key->key = NULL;
+ return emem_tree_lookup32_le(lookup_tree, lookup_key32);
- return emem_tree_lookup32_array_le_local(se_tree, local_key);
}
/* Strings are stored as an array of uint32 containing the string characters
- References:
- Prev by Date: Re: [Wireshark-dev] [Wireshark-commits] rev 44380: /trunk/epan/ /trunk/epan/: emem.c
- Next by Date: Re: [Wireshark-dev] Kasumi code (Was: rev 44384: ... kasumi.h ...)
- Previous by thread: Re: [Wireshark-dev] [Wireshark-commits] rev 44380: /trunk/epan/ /trunk/epan/: emem.c
- Next by thread: [Wireshark-dev] FSF address in source files (Was: [Wireshark-commits] rev 44417: ...)
- Index(es):