diff options
| author | rob rob@31f1291d-b8d6-0310-a050-a5561fc1590b <rob rob@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864> | 2006-02-12 10:11:23 +0000 |
|---|---|---|
| committer | rob rob@31f1291d-b8d6-0310-a050-a5561fc1590b <rob rob@31f1291d-b8d6-0310-a050-a5561fc1590b@5417fbe8-f217-4b02-8779-1006273d7864> | 2006-02-12 10:11:23 +0000 |
| commit | 66248d41ff0a8e1fa8d02160ef42dab6955dd6ef (patch) | |
| tree | 12ecfce024f5cbaea70fb3b4b23869b117f0cabb /src/slist.c | |
| parent | a3e5ec9638c4f4c6ea08140e200f370e09f6cb6c (diff) | |
Applied patches by neno and trystan
git-svn-id: svn://svn.anope.org/anope/trunk@966 31f1291d-b8d6-0310-a050-a5561fc1590b
git-svn-id: http://anope.svn.sourceforge.net/svnroot/anope/trunk@691 5417fbe8-f217-4b02-8779-1006273d7864
Diffstat (limited to 'src/slist.c')
| -rw-r--r-- | src/slist.c | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/src/slist.c b/src/slist.c index 81bd62ab0..a154cc47e 100644 --- a/src/slist.c +++ b/src/slist.c @@ -131,7 +131,7 @@ int slist_delete_range(SList * slist, char *range, slist_delcheckcb_t cb, ...) { int count = 0, i, n1, n2; - va_list args; + va_list args, preserve; va_start(args, cb); @@ -149,15 +149,26 @@ int slist_delete_range(SList * slist, char *range, slist_delcheckcb_t cb, } for (i = n1; i <= n2 && i > 0 && i <= slist->count; i++) { + if (!slist->list[i - 1]) continue; - if (cb && !cb(slist, slist->list[i - 1], args)) + + /* copy this off the stack for safety's sake --nenolod */ + VA_COPY(preserve, args); + + if (cb && !cb(slist, slist->list[i - 1], preserve)) { + va_end(preserve); return -1; + } + /* if it's to be freed, lets free it */ if (slist->opts && slist->opts->freeitem) slist->opts->freeitem(slist, slist->list[i - 1]); slist->list[i - 1] = NULL; + /* and release the copied list */ + va_end(preserve); + count++; } @@ -193,7 +204,7 @@ int slist_delete_range(SList * slist, char *range, slist_delcheckcb_t cb, int slist_enum(SList * slist, char *range, slist_enumcb_t cb, ...) { int count = 0, i, res; - va_list args; + va_list args, preserve; va_start(args, cb); @@ -204,9 +215,18 @@ int slist_enum(SList * slist, char *range, slist_enumcb_t cb, ...) continue; } - res = cb(slist, i + 1, slist->list[i], args); - if (res < 0) + /* copy off stack for safety */ + VA_COPY(preserve, args); + + res = cb(slist, i + 1, slist->list[i], preserve); + if (res < 0) { + va_end(preserve); break; + } + + /* and release our copy */ + va_end(preserve); + count += res; } } else { @@ -230,10 +250,18 @@ int slist_enum(SList * slist, char *range, slist_enumcb_t cb, ...) continue; } - res = cb(slist, i, slist->list[i - 1], args); - if (res < 0) + /* copy off stack for safety */ + VA_COPY(preserve, args); + + res = cb(slist, i, slist->list[i - 1], preserve); + if (res < 0) { + va_end(preserve); break; + } count += res; + + /* and release our copy */ + va_end(preserve); } if (res < -1) break; |
