summaryrefslogtreecommitdiff
path: root/src/slist.c
diff options
context:
space:
mode:
authorrob 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
committerrob 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
commit66248d41ff0a8e1fa8d02160ef42dab6955dd6ef (patch)
tree12ecfce024f5cbaea70fb3b4b23869b117f0cabb /src/slist.c
parenta3e5ec9638c4f4c6ea08140e200f370e09f6cb6c (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.c42
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;