diff options
author | Mike Hommey <glandium@debian.org> | 2008-01-19 17:16:58 +0100 |
---|---|---|
committer | Mike Hommey <glandium@debian.org> | 2008-01-19 17:16:58 +0100 |
commit | fc760252aba4054a612dd20b803d0c7c19713064 (patch) | |
tree | 088f8e29a5ed82c5417869894c17ba72f715d7a6 /hash.c | |
parent | c69572cb9f2467259a73de64c08e141f21f17fa8 (diff) | |
download | libxml2-fc760252aba4054a612dd20b803d0c7c19713064.tar.gz |
Load /tmp/libxml2-2.6.31 intoupstream/2.6.31.dfsg
libxml2/branches/upstream/current.
Diffstat (limited to 'hash.c')
-rw-r--r-- | hash.c | 15 |
1 files changed, 13 insertions, 2 deletions
@@ -828,7 +828,7 @@ xmlHashScan(xmlHashTablePtr table, xmlHashScanner f, void *data) { */ void xmlHashScanFull(xmlHashTablePtr table, xmlHashScannerFull f, void *data) { - int i; + int i, nb; xmlHashEntryPtr iter; xmlHashEntryPtr next; @@ -844,10 +844,21 @@ xmlHashScanFull(xmlHashTablePtr table, xmlHashScannerFull f, void *data) { iter = &(table->table[i]); while (iter) { next = iter->next; + nb = table->nbElems; if ((f != NULL) && (iter->payload != NULL)) f(iter->payload, data, iter->name, iter->name2, iter->name3); - iter = next; + if (nb != table->nbElems) { + /* table was modified by the callback, be careful */ + if (iter == &(table->table[i])) { + if (table->table[i].valid == 0) + iter = NULL; + if (table->table[i].next != next) + iter = &(table->table[i]); + } else + iter = next; + } else + iter = next; } } } |