diff options
| author | joerg <joerg@NetBSD.org> | 2007-08-30 12:23:53 +0000 |
|---|---|---|
| committer | joerg <joerg@NetBSD.org> | 2007-08-30 12:23:53 +0000 |
| commit | 4deb593145a6d95f78a080aefb8cfc760bcddac9 (patch) | |
| tree | 798627c927bc10e7c4639b8f24a47fcdaf82600a /common/lib/libprop/prop_stack.c | |
| parent | ebcc6a8e1aa8ec2e8fd237a3d1512d620918c753 (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.c | 40 |
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; } |
