From e1504a252f1f8085f3d05014722b996a8f2234c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stefan=20B=C3=BChler?= Date: Sat, 27 Sep 2008 12:45:43 +0200 Subject: [PATCH] free value always from the calling function --- src/config_lua.c | 8 ++++++-- src/config_parser.rl | 4 ++++ src/lighttpd.c | 6 ++++-- src/plugin.c | 1 - src/plugin.h | 10 ++++++---- src/plugin_core.c | 10 ---------- 6 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/config_lua.c b/src/config_lua.c index 9e165cf..5d097ea 100644 --- a/src/config_lua.c +++ b/src/config_lua.c @@ -81,8 +81,10 @@ static int handle_server_action(lua_State *L) { val = lua_params_to_value(srv, L); /* TRACE(srv, "%s", "Creating action"); */ + a = sa->create_action(srv, sa->p, val); + value_free(val); - if (NULL == (a = sa->create_action(srv, sa->p, val))) { + if (NULL == a) { lua_pushstring(L, "creating action failed"); lua_error(L); } @@ -107,13 +109,15 @@ static int handle_server_setup(lua_State *L) { val = lua_params_to_value(srv, L); - TRACE(srv, "%s", "Calling setup"); + /* TRACE(srv, "%s", "Calling setup"); */ if (!ss->setup(srv, ss->p, val)) { + value_free(val); lua_pushstring(L, "setup failed"); lua_error(L); } + value_free(val); return 0; } diff --git a/src/config_parser.rl b/src/config_parser.rl index dd67ac5..7407dd9 100644 --- a/src/config_parser.rl +++ b/src/config_parser.rl @@ -502,6 +502,7 @@ else { /* normal assignment */ a = option_action(srv, name->data.string->str, val); + value_free(val); if (a == NULL) return FALSE; @@ -598,12 +599,15 @@ if (ctx->in_setup_block) { /* we are in the setup { } block, call setups and don't append to action list */ if (!call_setup(srv, name->data.string->str, val)) { + value_free(val); return FALSE; } + value_free(val); } else { al = g_queue_peek_head(ctx->action_list_stack); a = create_action(srv, name->data.string->str, val); + value_free(val); if (a == NULL) return FALSE; diff --git a/src/lighttpd.c b/src/lighttpd.c index f446c3f..5923632 100644 --- a/src/lighttpd.c +++ b/src/lighttpd.c @@ -110,12 +110,14 @@ int main(int argc, char *argv[]) { if (test_config) return 0; - TRACE(srv, "%s", "Test!"); + /* TRACE(srv, "%s", "Test!"); */ server_loop_init(srv); server_start(srv); - config_parser_finish(srv, ctx_stack, TRUE); + if (!luaconfig) + config_parser_finish(srv, ctx_stack, TRUE); + server_free(srv); g_free(config_path); diff --git a/src/plugin.c b/src/plugin.c index 8670687..279c0b1 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -206,7 +206,6 @@ gboolean parse_option(server *srv, const char *name, value *val, option_set *mar if (!sopt->parse_option) { mark->value = value_extract(val); - value_free(val); } else { if (!sopt->parse_option(srv, sopt->p, sopt->module_index, val, &mark->value)) { /* errors should be logged by parse function */ diff --git a/src/plugin.h b/src/plugin.h index 1f3365d..09c1a95 100644 --- a/src/plugin.h +++ b/src/plugin.h @@ -95,7 +95,8 @@ struct plugin_setup { struct server_option { plugin *p; - /** the plugin must free the _content_ of the value (e.g. with option_free) + /** the value is freed with value_free after the parse call, so you + * probably want to extract the content via value_extract* * val is zero to get the global default value if nothing is specified * save result in value * @@ -138,6 +139,7 @@ LI_API gboolean plugin_register(server *srv, const gchar *name, PluginInit init) LI_API void plugin_free(server *srv, plugin *p); LI_API void server_plugins_free(server *srv); +/** free val after call (val may be modified by parser) */ LI_API gboolean parse_option(server *srv, const char *name, value *val, option_set *mark); LI_API void release_option(server *srv, option_set *mark); /**< Does not free the option_set memory */ @@ -145,13 +147,13 @@ LI_API void plugins_prepare_callbacks(server *srv); LI_API void plugins_handle_close(connection *con); /* Needed for config frontends */ -/** For parsing 'somemod.option = "somevalue"' */ +/** For parsing 'somemod.option = "somevalue"', free value after call */ LI_API action* option_action(server *srv, const gchar *name, value *value); /** For parsing 'somemod.action value', e.g. 'rewrite "/url" => "/destination"' - * You need to free the value after it (it should be of type NONE then) + * free value after call */ LI_API action* create_action(server *srv, const gchar *name, value *value); -/** For setup function, e.g. 'listen "127.0.0.1:8080"' */ +/** For setup function, e.g. 'listen "127.0.0.1:8080"'; free value after call */ LI_API gboolean call_setup(server *srv, const char *name, value *val); LI_API gboolean plugins_load_default_options(server *srv); diff --git a/src/plugin_core.c b/src/plugin_core.c index 4dd84ae..1600d14 100644 --- a/src/plugin_core.c +++ b/src/plugin_core.c @@ -43,7 +43,6 @@ static action* core_list(server *srv, plugin* p, value *val) { action_acquire(oa->data.val_action.action); g_array_append_val(a->data.list, oa->data.val_action.action); } - value_free(val); return a; } @@ -89,7 +88,6 @@ static action* core_when(server *srv, plugin* p, value *val) { action_acquire(val_act->data.val_action.action); if (act_else) action_acquire(act_else); a = action_new_condition(val_cond->data.val_cond.cond, val_act->data.val_action.action, act_else); - value_free(val); return a; } @@ -117,7 +115,6 @@ static action* core_set(server *srv, plugin* p, value *val) { return NULL; } a = option_action(srv, val_name->data.string->str, val_val); - value_free(val); return a; } @@ -152,7 +149,6 @@ static action* core_physical(server *srv, plugin* p, value *val) { } docroot = (GString*) value_extract_ptr(val); - value_free(val); return action_new_function(core_handle_physical, core_physical_free, docroot); } @@ -350,7 +346,6 @@ static gboolean core_listen(server *srv, plugin* p, value *val) { } TRACE(srv, "will listen to '%s'", val->data.string->str); - value_free(val); return TRUE; } @@ -415,7 +410,6 @@ static gboolean core_workers(server *srv, plugin* p, value *val) { ERROR(srv, "workers already called with '%i', overwriting", srv->worker_count); } srv->worker_count = workers; - value_free(val); return TRUE; } @@ -453,8 +447,6 @@ static gboolean core_option_log_parse(server *srv, plugin *p, size_t ndx, value } } - value_free(val); - return TRUE; } @@ -479,8 +471,6 @@ static gboolean core_option_log_timestamp_parse(server *srv, plugin *p, size_t n if (!val) return TRUE; oval->ptr = log_timestamp_new(srv, value_extract(val).string); - value_free(val); - return TRUE; }