# HG changeset patch # User Olaf Wintermann # Date 1667986672 -3600 # Node ID 437562f5681dd1f1776bf7457b59dbd7055d0249 # Parent 0b42a35d6add622ce6682e87152d32b42019b694 use realloc instead of malloc in object_add_directive diff -r 0b42a35d6add -r 437562f5681d src/server/util/object.c --- a/src/server/util/object.c Tue Nov 08 22:35:18 2022 +0100 +++ b/src/server/util/object.c Wed Nov 09 10:37:52 2022 +0100 @@ -56,25 +56,22 @@ } -void object_add_directive(httpd_object *obj, directive *dir, int dt) { +int object_add_directive(httpd_object *obj, directive *dir, int dt) { dtable *l = object_get_dtable(obj, dt); // allocate space for the new directive - - //l->dirs = realloc(l->dirs, (l->ndir+1)*sizeof(void*)); - // TODO: use realloc - - directive **drs = pool_malloc(obj->pool, (l->ndir+1)*sizeof(void*)); - for(int i=0;indir;i++) { - drs[i] = l->dirs[i]; + if(l->ndir >= l->alloc) { + l->alloc += 8; + directive **drs = pool_realloc(obj->pool, l->dirs, (l->alloc)*sizeof(void*)); + if(!drs) { + l->alloc -= 8; + return -1; + } + l->dirs = drs; } - if(l->dirs != NULL) { - pool_free(obj->pool, l->dirs); - } - l->dirs = drs; - + // add directive - l->dirs[l->ndir] = dir; - l->ndir++; + l->dirs[l->ndir++] = dir; + return 0; } diff -r 0b42a35d6add -r 437562f5681d src/server/util/object.h --- a/src/server/util/object.h Tue Nov 08 22:35:18 2022 +0100 +++ b/src/server/util/object.h Wed Nov 09 10:37:52 2022 +0100 @@ -69,6 +69,7 @@ struct dtable { directive **dirs; int ndir; + int alloc; }; struct httpd_object { @@ -132,7 +133,7 @@ /* * adds a directive to the object with the type dt (enum RequestPhase) */ -void object_add_directive(httpd_object *obj, directive *dir, int dt); +int object_add_directive(httpd_object *obj, directive *dir, int dt); /* * get a list of all directives with a specific type