summaryrefslogtreecommitdiff
path: root/hash.c
diff options
context:
space:
mode:
authorMike Hommey <glandium@debian.org>2008-01-19 17:16:58 +0100
committerMike Hommey <glandium@debian.org>2008-01-19 17:16:58 +0100
commitfc760252aba4054a612dd20b803d0c7c19713064 (patch)
tree088f8e29a5ed82c5417869894c17ba72f715d7a6 /hash.c
parentc69572cb9f2467259a73de64c08e141f21f17fa8 (diff)
downloadlibxml2-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.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/hash.c b/hash.c
index e92a5a0..22f9bb4 100644
--- a/hash.c
+++ b/hash.c
@@ -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;
}
}
}