From 7a2b0102f115b4590e6b37b69f6b6218b890e1e9 Mon Sep 17 00:00:00 2001 From: Pari Nannapaneni Date: Tue, 11 Nov 2008 23:02:43 +0000 Subject: [PATCH] Patch by Ryan Brindley -- Make sure that manager refuses any duplicate 'new category' requests in updateconfig git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@156017 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- main/manager.c | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/main/manager.c b/main/manager.c index 9292c739e4..d86130f298 100644 --- a/main/manager.c +++ b/main/manager.c @@ -81,6 +81,7 @@ enum error_type { UNSPECIFIED_CATEGORY, UNSPECIFIED_ARGUMENT, FAILURE_ALLOCATION, + FAILURE_NEWCAT, FAILURE_DELCAT, FAILURE_EMPTYCAT, FAILURE_UPDATE, @@ -1286,17 +1287,24 @@ static enum error_type handle_updates(struct mansession *s, const struct message struct ast_str *str1 = ast_str_create(16), *str2 = ast_str_create(16); enum error_type result = 0; - for (x = 0; x < 100000; x++) { + for (x = 0; x < 100000; x++) { //100000 = the max number of allowed updates + 1 unsigned int object = 0; snprintf(hdr, sizeof(hdr), "Action-%06d", x); action = astman_get_header(m, hdr); - if (ast_strlen_zero(action)) - break; + if (ast_strlen_zero(action)) // breaks the for loop if no action header + break; // this could cause problems if actions come in misnumbered + snprintf(hdr, sizeof(hdr), "Cat-%06d", x); cat = astman_get_header(m, hdr); + if (ast_strlen_zero(cat)) { //every action needs a category + result = UNSPECIFIED_CATEGORY; + break; + } + snprintf(hdr, sizeof(hdr), "Var-%06d", x); var = astman_get_header(m, hdr); + snprintf(hdr, sizeof(hdr), "Value-%06d", x); value = astman_get_header(m, hdr); @@ -1304,13 +1312,16 @@ static enum error_type handle_updates(struct mansession *s, const struct message object = 1; value++; } + snprintf(hdr, sizeof(hdr), "Match-%06d", x); match = astman_get_header(m, hdr); + snprintf(hdr, sizeof(hdr), "Line-%06d", x); line = astman_get_header(m, hdr); + if (!strcasecmp(action, "newcat")) { - if (ast_strlen_zero(cat)) { - result = UNSPECIFIED_CATEGORY; + if (ast_category_get(cfg,cat)) { //check to make sure the cat doesn't + result = FAILURE_NEWCAT; //already exist break; } if (!(category = ast_category_new(cat, dfn, -1))) { @@ -1322,7 +1333,7 @@ static enum error_type handle_updates(struct mansession *s, const struct message } else ast_category_insert(cfg, category, match); } else if (!strcasecmp(action, "renamecat")) { - if (ast_strlen_zero(cat) || ast_strlen_zero(value)) { + if (ast_strlen_zero(value)) { result = UNSPECIFIED_ARGUMENT; break; } @@ -1332,25 +1343,17 @@ static enum error_type handle_updates(struct mansession *s, const struct message } ast_category_rename(category, value); } else if (!strcasecmp(action, "delcat")) { - if (ast_strlen_zero(cat)) { - result = UNSPECIFIED_CATEGORY; - break; - } if (ast_category_delete(cfg, cat)) { result = FAILURE_DELCAT; break; } } else if (!strcasecmp(action, "emptycat")) { - if (ast_strlen_zero(cat)) { - result = UNSPECIFIED_CATEGORY; - break; - } if (ast_category_empty(cfg, cat)) { result = FAILURE_EMPTYCAT; break; } } else if (!strcasecmp(action, "update")) { - if (ast_strlen_zero(cat) || ast_strlen_zero(var)) { + if (ast_strlen_zero(var)) { result = UNSPECIFIED_ARGUMENT; break; } @@ -1363,7 +1366,7 @@ static enum error_type handle_updates(struct mansession *s, const struct message break; } } else if (!strcasecmp(action, "delete")) { - if (ast_strlen_zero(cat) || (ast_strlen_zero(var) && ast_strlen_zero(line))) { + if ((ast_strlen_zero(var) && ast_strlen_zero(line))) { result = UNSPECIFIED_ARGUMENT; break; } @@ -1376,7 +1379,7 @@ static enum error_type handle_updates(struct mansession *s, const struct message break; } } else if (!strcasecmp(action, "append")) { - if (ast_strlen_zero(cat) || ast_strlen_zero(var)) { + if (ast_strlen_zero(var)) { result = UNSPECIFIED_ARGUMENT; break; } @@ -1392,7 +1395,7 @@ static enum error_type handle_updates(struct mansession *s, const struct message v->object = 1; ast_variable_append(category, v); } else if (!strcasecmp(action, "insert")) { - if (ast_strlen_zero(cat) || ast_strlen_zero(var) || ast_strlen_zero(line)) { + if (ast_strlen_zero(var) || ast_strlen_zero(line)) { result = UNSPECIFIED_ARGUMENT; break; } @@ -1482,6 +1485,9 @@ static int action_updateconfig(struct mansession *s, const struct message *m) case FAILURE_ALLOCATION: astman_send_error(s, m, "Memory allocation failure, this should not happen"); break; + case FAILURE_NEWCAT: + astman_send_error(s, m, "Create category did not complete successfully"); + break; case FAILURE_DELCAT: astman_send_error(s, m, "Delete category did not complete successfully"); break;