From: Nick Mathewson Date: Tue, 9 Nov 2004 06:40:32 +0000 (+0000) Subject: Separate is-recognized-option from get-option-value, since NULL is ambiguous and... X-Git-Tag: debian-version-0.0.8+0.0.9pre5-1~50 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=48a0b6c476dee067685a66a955cdffc8a37ea9d3;p=thirdparty%2Ftor.git Separate is-recognized-option from get-option-value, since NULL is ambiguous and returning "" misrepresents. svn:r2731 --- diff --git a/src/or/config.c b/src/or/config.c index 0843e855a2..7d405b63e6 100644 --- a/src/or/config.c +++ b/src/or/config.c @@ -255,7 +255,7 @@ options_act(void) { if (options->command != CMD_RUN_TOR) return 0; - if (set_max_file_descriptors(get_options()->MaxConn) < 0) + if (set_max_file_descriptors(options->MaxConn) < 0) return -1; /* Configure the log(s) */ @@ -542,6 +542,14 @@ config_reset_line(or_options_t *options, const char *key) option_reset(options, var); } +/** Return true iff key is a valid configuration option. */ +int +config_option_is_recognized(const char *key) +{ + config_var_t *var = config_find_option(key); + return (var != NULL); +} + /** Return a canonicalized list of the options assigned for key. */ struct config_line_t * @@ -551,6 +559,7 @@ config_get_assigned_option(or_options_t *options, const char *key) const void *value; char buf[32]; struct config_line_t *result; + tor_assert(options && key); var = config_find_option(key); if (!var) { @@ -583,7 +592,13 @@ config_get_assigned_option(or_options_t *options, const char *key) switch(var->type) { case CONFIG_TYPE_STRING: - result->value = tor_strdup(*(char**)value ? *(char**)value : ""); + if (*(char**)value) { + result->value = tor_strdup(*(char**)value); + } else { + tor_free(result->key); + tor_free(result); + return NULL; + } break; case CONFIG_TYPE_UINT: /* XXX This means every or_options_t uint or bool element @@ -633,6 +648,7 @@ static int config_assign(or_options_t *options, struct config_line_t *list, int reset) { struct config_line_t *p; + tor_assert(options); /* pass 1: normalize keys */ for (p = list; p; p = p->next) { diff --git a/src/or/control.c b/src/or/control.c index bc5cfeea82..57ef6f484e 100644 --- a/src/or/control.c +++ b/src/or/control.c @@ -146,7 +146,7 @@ send_control_message(connection_t *conn, uint16_t type, uint16_t len, { char buf[4]; tor_assert(conn); - tor_assert(len || !body); + tor_assert(len || !body || !strlen(body)); tor_assert(type <= _CONTROL_CMD_MAX_RECOGNIZED); set_uint32(buf, htons(len)); set_uint32(buf+2, htons(type)); @@ -249,11 +249,13 @@ handle_control_getconf(connection_t *conn, uint16_t body_len, const char *body) answers = smartlist_create(); SMARTLIST_FOREACH(questions, const char *, q, { - struct config_line_t *answer = config_get_assigned_option(options,q); - if (!answer) { + int recognized = config_option_is_recognized(q); + if (!recognized) { send_control_error(conn, ERR_UNRECOGNIZED_CONFIG_KEY, body); goto done; } else { + struct config_line_t *answer = config_get_assigned_option(options,q); + while (answer) { struct config_line_t *next; size_t alen = strlen(answer->key)+strlen(answer->value)+2; diff --git a/src/or/or.h b/src/or/or.h index 79094c5de5..fafc1e5461 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -1106,6 +1106,7 @@ void config_parse_exit_policy(struct config_line_t *cfg, struct exit_policy_t **dest); void exit_policy_free(struct exit_policy_t *p); const char *get_data_directory(void); +int config_option_is_recognized(const char *key); struct config_line_t *config_get_assigned_option(or_options_t *options, const char *key); struct config_line_t *config_line_prepend(struct config_line_t *front,