From 1d835a4b7374e5f185d666bde1e3b0dbced86bd1 Mon Sep 17 00:00:00 2001 From: ultramage Date: Fri, 2 May 2008 09:27:03 +0000 Subject: Added a custom implementation of the va_copy macro for systems that don't provide it. Fixed varargs not being used correctly in foreach() calls in db.c (bugreport:551). git-svn-id: https://rathena.svn.sourceforge.net/svnroot/rathena/trunk@12682 54d463be-8e91-2dee-dedb-b68131a5f0ec --- src/common/db.c | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) (limited to 'src/common/db.c') diff --git a/src/common/db.c b/src/common/db.c index 07adf73f1..be2714603 100644 --- a/src/common/db.c +++ b/src/common/db.c @@ -1487,10 +1487,16 @@ static unsigned int db_obj_vgetall(DBMap* self, void **buf, unsigned int max, DB node = db->ht[i]; while (node) { parent = node->parent; - if (!(node->deleted) && match(node->key, node->data, args) == 0) { - if (buf && ret < max) - buf[ret] = node->data; - ret++; + if (!(node->deleted)) + { + va_list argscopy; + va_copy(argscopy, args); + if (match(node->key, node->data, argscopy) == 0) { + if (buf && ret < max) + buf[ret] = node->data; + ret++; + } + va_end(argscopy); } if (node->left) { node = node->left; @@ -1597,6 +1603,7 @@ static void *db_obj_vensure(DBMap* self, DBKey key, DBCreateData create, va_list } // Create node if necessary if (node == NULL) { + va_list argscopy; if (db->item_count == UINT32_MAX) { ShowError("db_vensure: item_count overflow, aborting item insertion.\n" "Database allocated at %s:%d", @@ -1633,7 +1640,9 @@ static void *db_obj_vensure(DBMap* self, DBKey key, DBCreateData create, va_list } else { node->key = key; } - node->data = create(key, args); + va_copy(argscopy, args); + node->data = create(key, argscopy); + va_end(argscopy); } data = node->data; db->cache = node; @@ -1860,7 +1869,12 @@ static int db_obj_vforeach(DBMap* self, DBApply func, va_list args) while (node) { parent = node->parent; if (!(node->deleted)) - sum += func(node->key, node->data, args); + { + va_list argscopy; + va_copy(argscopy, args); + sum += func(node->key, node->data, argscopy); + va_end(argscopy); + } if (node->left) { node = node->left; continue; @@ -1952,7 +1966,12 @@ static int db_obj_vclear(DBMap* self, DBApply func, va_list args) db_dup_key_free(db, node->key); } else { if (func) - sum += func(node->key, node->data, args); + { + va_list argscopy; + va_copy(argscopy, args); + sum += func(node->key, node->data, argscopy); + va_end(argscopy); + } db->release(node->key, node->data, DB_RELEASE_BOTH); node->deleted = 1; } -- cgit v1.2.3-60-g2f50