From 063dd640e5e9235b1a04f49eee55e2101669578d Mon Sep 17 00:00:00 2001 From: Felipe Zimmerle Date: Wed, 19 Feb 2014 15:43:02 -0800 Subject: [PATCH] Adds internal error messages while parsing the configutarion Before this patch, if something went wrong while loading the configuration in memory, not in terms of syntax but other run time factors such as memory allocation, the webserver will refuse to start and no further message was given to the user. This patch adds "Internal Error messages" that are intend to let the user know more information about the problem that he/she is facing. --- apache2/re.c | 83 +++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 72 insertions(+), 11 deletions(-) diff --git a/apache2/re.c b/apache2/re.c index 952a7867..2d6e2465 100644 --- a/apache2/re.c +++ b/apache2/re.c @@ -780,13 +780,36 @@ static apr_status_t msre_parse_actions(msre_engine *engine, msre_actionset *acti msre_action *action; int i; - if (text == NULL) return -1; + + if (error_msg == NULL) { + return -1; + } + *error_msg = NULL; + + + if (text == NULL) { + *error_msg = apr_psprintf(engine->mp, "Internal error: " \ + "msre_parse_actions, variable text is NULL"); + return -1; + } /* Extract name & value pairs first */ vartable = apr_table_make(engine->mp, 10); - if (vartable == NULL) return -1; + if (vartable == NULL) { + *error_msg = apr_psprintf(engine->mp, "Internal error: " \ + "msre_parse_actions, failed to create vartable"); + + return -1; + } rc = msre_parse_generic(engine->mp, text, vartable, error_msg); - if (rc < 0) return rc; + if (rc < 0) { + if (*error_msg == NULL) + *error_msg = apr_psprintf(engine->mp, "Internal error: " \ + "msre_parse_actions, msre_parse_generic failed. Return " \ + "code: %d", rc); + + return rc; + } /* Loop through the table and create actions */ tarr = apr_table_elts(vartable); @@ -794,7 +817,12 @@ static apr_status_t msre_parse_actions(msre_engine *engine, msre_actionset *acti for (i = 0; i < tarr->nelts; i++) { /* Create action. */ action = msre_create_action(engine, telts[i].key, telts[i].val, error_msg); - if (action == NULL) return -1; + if (action == NULL) { + if (*error_msg == NULL) + *error_msg = apr_psprintf(engine->mp, "Internal error: " \ + "msre_parse_actions, msre_create_action failed."); + return -1; + } /* Initialise action (option). */ if (action->metadata->init != NULL) { @@ -932,12 +960,23 @@ static msre_var *msre_create_var(msre_ruleset *ruleset, const char *name, const msre_action *msre_create_action(msre_engine *engine, const char *name, const char *param, char **error_msg) { - msre_action *action = apr_pcalloc(engine->mp, sizeof(msre_action)); - if (action == NULL) return NULL; + msre_action *action = NULL; - if (error_msg == NULL) return NULL; + if (error_msg == NULL) { + return NULL; + } *error_msg = NULL; + + action = apr_pcalloc(engine->mp, sizeof(msre_action)); + + if (action == NULL) { + *error_msg = apr_psprintf(engine->mp, "Internal error: " \ + "msre_create_action, not able to allocate action"); + + return NULL; + } + /* Resolve action */ action->metadata = msre_resolve_action(engine, name); if (action->metadata == NULL) { @@ -1128,12 +1167,29 @@ int msre_parse_generic(apr_pool_t *mp, const char *text, apr_table_t *vartable, msre_actionset *msre_actionset_create(msre_engine *engine, const char *text, char **error_msg) { - msre_actionset *actionset = (msre_actionset *)apr_pcalloc(engine->mp, + msre_actionset *actionset = NULL; + + if (error_msg == NULL) { + return NULL; + } + + *error_msg = NULL; + + actionset = (msre_actionset *)apr_pcalloc(engine->mp, sizeof(msre_actionset)); - if (actionset == NULL) return NULL; + + if (actionset == NULL) { + *error_msg = apr_psprintf(engine->mp, "Internal error: " \ + "msre_actionset_create, not able to allocate msre_actionset"); + return NULL; + } actionset->actions = apr_table_make(engine->mp, 25); - if (actionset->actions == NULL) return NULL; + if (actionset->actions == NULL) { + *error_msg = apr_psprintf(engine->mp, "Internal error: " \ + "msre_actionset_create, not able to create actions table"); + return NULL; + } /* Metadata */ actionset->id = NOT_SET_P; @@ -1169,7 +1225,12 @@ msre_actionset *msre_actionset_create(msre_engine *engine, const char *text, /* Parse the list of actions, if it's present */ if (text != NULL) { - if (msre_parse_actions(engine, actionset, text, error_msg) < 0) { + int ret = msre_parse_actions(engine, actionset, text, error_msg); + if (ret < 0) { + if (*error_msg == NULL) + *error_msg = apr_psprintf(engine->mp, "Internal error: " \ + "msre_actionset_create, msre_parse_actions failed " \ + "without further information. Return code: %d", ret); return NULL; } }