summaryrefslogtreecommitdiff
path: root/common/lib/libprop/prop_stack.c
diff options
context:
space:
mode:
authorjoerg <joerg@NetBSD.org>2007-08-30 12:23:53 +0000
committerjoerg <joerg@NetBSD.org>2007-08-30 12:23:53 +0000
commit4deb593145a6d95f78a080aefb8cfc760bcddac9 (patch)
tree798627c927bc10e7c4639b8f24a47fcdaf82600a /common/lib/libprop/prop_stack.c
parentebcc6a8e1aa8ec2e8fd237a3d1512d620918c753 (diff)
Avoid using unbound amount of stack frames in prop_object_equal
by using a dynamic stack as well. Reorder arguments for the internalizer as the iteration is always present and should go before possibly NULL arguments. Reviewed by mjf@ and adrianp@
Diffstat (limited to 'common/lib/libprop/prop_stack.c')
-rw-r--r--common/lib/libprop/prop_stack.c40
1 files changed, 27 insertions, 13 deletions
diff --git a/common/lib/libprop/prop_stack.c b/common/lib/libprop/prop_stack.c
index 3b6c0c68309..a08118c2a44 100644
--- a/common/lib/libprop/prop_stack.c
+++ b/common/lib/libprop/prop_stack.c
@@ -1,4 +1,4 @@
-/* $NetBSD: prop_stack.c,v 1.1 2007/08/16 21:44:08 joerg Exp $ */
+/* $NetBSD: prop_stack.c,v 1.2 2007/08/30 12:23:54 joerg Exp $ */
/*-
* Copyright (c) 2007 Joerg Sonnenberger <joerg@NetBSD.org>.
@@ -40,7 +40,8 @@ _prop_stack_init(prop_stack_t stack)
}
bool
-_prop_stack_push(prop_stack_t stack, prop_object_t obj, void *obj_data, void *iter)
+_prop_stack_push(prop_stack_t stack, prop_object_t obj, void *data1,
+ void *data2, void *data3)
{
struct _prop_stack_extern_elem *eelem;
struct _prop_stack_intern_elem *ielem;
@@ -52,8 +53,9 @@ _prop_stack_push(prop_stack_t stack, prop_object_t obj, void *obj_data, void *it
return false;
eelem->object = obj;
- eelem->object_data = obj_data;
- eelem->iterator = iter;
+ eelem->object_data[0] = data1;
+ eelem->object_data[1] = data2;
+ eelem->object_data[2] = data3;
SLIST_INSERT_HEAD(&stack->extern_elems, eelem, stack_link);
@@ -65,8 +67,9 @@ _prop_stack_push(prop_stack_t stack, prop_object_t obj, void *obj_data, void *it
ielem = &stack->intern_elems[stack->used_intern_elems];
ielem->object = obj;
- ielem->object_data = obj_data;
- ielem->iterator = iter;
+ ielem->object_data[0] = data1;
+ ielem->object_data[1] = data2;
+ ielem->object_data[2] = data3;
++stack->used_intern_elems;
@@ -74,7 +77,8 @@ _prop_stack_push(prop_stack_t stack, prop_object_t obj, void *obj_data, void *it
}
bool
-_prop_stack_pop(prop_stack_t stack, prop_object_t *obj, void **obj_data, void **iter)
+_prop_stack_pop(prop_stack_t stack, prop_object_t *obj, void **data1,
+ void **data2, void **data3)
{
struct _prop_stack_extern_elem *eelem;
struct _prop_stack_intern_elem *ielem;
@@ -86,9 +90,14 @@ _prop_stack_pop(prop_stack_t stack, prop_object_t *obj, void **obj_data, void **
_PROP_ASSERT(stack->used_intern_elems == PROP_STACK_INTERN_ELEMS);
SLIST_REMOVE_HEAD(&stack->extern_elems, stack_link);
- *obj = eelem->object;
- *obj_data = eelem->object_data;
- *iter = eelem->iterator;
+ if (obj)
+ *obj = eelem->object;
+ if (data1)
+ *data1 = eelem->object_data[0];
+ if (data2)
+ *data2 = eelem->object_data[1];
+ if (data3)
+ *data3 = eelem->object_data[2];
_PROP_FREE(eelem, M_TEMP);
return true;
}
@@ -96,9 +105,14 @@ _prop_stack_pop(prop_stack_t stack, prop_object_t *obj, void **obj_data, void **
--stack->used_intern_elems;
ielem = &stack->intern_elems[stack->used_intern_elems];
- *obj = ielem->object;
- *obj_data = ielem->object_data;
- *iter = ielem->iterator;
+ if (obj)
+ *obj = ielem->object;
+ if (data1)
+ *data1 = ielem->object_data[0];
+ if (data2)
+ *data2 = ielem->object_data[1];
+ if (data3)
+ *data3 = ielem->object_data[2];
return true;
}