Fix two bugs: first, "extendcircuit" would crash if you gave it a purpose.

Second, if you give an unknown purpose, it would say:
552 Unknown purpose "purpose=foo"
Now it just says
552 Unknown purpose "foo"


svn:r8412
This commit is contained in:
Roger Dingledine 2006-09-18 04:24:41 +00:00
parent 7c325df016
commit 4920b9d1cc

View File

@ -1671,20 +1671,23 @@ handle_control_getinfo(control_connection_t *conn, uint32_t len,
return 0; return 0;
} }
/** If <b>string</b> contains a recognized purpose (for /** If *<b>string</b> contains a recognized purpose (for
* circuits if <b>for_circuits</b> is 1, else for routers), * circuits if <b>for_circuits</b> is 1, else for routers),
* possibly prefaced with the string "purpose=", then assign it * possibly prefaced with the string "purpose=", then assign it
* and return 0. Otherwise return -1. */ * and return 0. Otherwise return -1.
*
* If it's prefaced with "purpose=", then set *<b>string</b> to
* the remainder of the string. */
static int static int
get_purpose(char *string, int for_circuits, uint8_t *purpose) get_purpose(char **string, int for_circuits, uint8_t *purpose)
{ {
if (!strcmpstart(string, "purpose=")) if (!strcmpstart(*string, "purpose="))
string += strlen("purpose="); *string += strlen("purpose=");
if (!strcmp(string, "general")) if (!strcmp(*string, "general"))
*purpose = for_circuits ? CIRCUIT_PURPOSE_C_GENERAL : *purpose = for_circuits ? CIRCUIT_PURPOSE_C_GENERAL :
ROUTER_PURPOSE_GENERAL; ROUTER_PURPOSE_GENERAL;
else if (!strcmp(string, "controller")) else if (!strcmp(*string, "controller"))
*purpose = for_circuits ? CIRCUIT_PURPOSE_CONTROLLER : *purpose = for_circuits ? CIRCUIT_PURPOSE_CONTROLLER :
ROUTER_PURPOSE_GENERAL; ROUTER_PURPOSE_GENERAL;
else { /* not a recognized purpose */ else { /* not a recognized purpose */
@ -1748,18 +1751,20 @@ handle_control_extendcircuit(control_connection_t *conn, uint32_t len,
} }
smartlist_split_string(router_nicknames, smartlist_get(args,1), ",", 0, 0); smartlist_split_string(router_nicknames, smartlist_get(args,1), ",", 0, 0);
if (zero_circ && smartlist_len(args)>2) {
char *purp = smartlist_get(args,2);
if (get_purpose(&purp, 1, &intended_purpose) < 0) {
connection_printf_to_buf(conn, "552 Unknown purpose \"%s\"\r\n", purp);
SMARTLIST_FOREACH(args, char *, cp, tor_free(cp));
smartlist_free(args);
goto done;
}
}
SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); SMARTLIST_FOREACH(args, char *, cp, tor_free(cp));
smartlist_free(args); smartlist_free(args);
if (!zero_circ && !circ) { if (!zero_circ && !circ) {
goto done; goto done;
} }
if (zero_circ && smartlist_len(args)>2) {
if (get_purpose(smartlist_get(args,2), 1, &intended_purpose) < 0) {
connection_printf_to_buf(conn, "552 Unknown purpose \"%s\"\r\n",
(char *)smartlist_get(args,2));
goto done;
}
}
} }
routers = smartlist_create(); routers = smartlist_create();
@ -1872,10 +1877,12 @@ handle_control_setpurpose(control_connection_t *conn, int for_circuits,
} }
} }
if (get_purpose(smartlist_get(args,1), for_circuits, &new_purpose) < 0) { {
connection_printf_to_buf(conn, "552 Unknown purpose \"%s\"\r\n", char *purp = smartlist_get(args,1);
(char *)smartlist_get(args,1)); if (get_purpose(&purp, for_circuits, &new_purpose) < 0) {
goto done; connection_printf_to_buf(conn, "552 Unknown purpose \"%s\"\r\n", purp);
goto done;
}
} }
if (for_circuits) if (for_circuits)
@ -2017,9 +2024,10 @@ handle_control_postdescriptor(control_connection_t *conn, uint32_t len,
smartlist_split_string(args, body, " ", smartlist_split_string(args, body, " ",
SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0); SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
if (smartlist_len(args)) { if (smartlist_len(args)) {
if (get_purpose(smartlist_get(args,0), 0, &purpose) < 0) { char *purp = smartlist_get(args,0);
if (get_purpose(&purp, 0, &purpose) < 0) {
connection_printf_to_buf(conn, "552 Unknown purpose \"%s\"\r\n", connection_printf_to_buf(conn, "552 Unknown purpose \"%s\"\r\n",
(char *)smartlist_get(args,0)); purp);
SMARTLIST_FOREACH(args, char *, cp, tor_free(cp)); SMARTLIST_FOREACH(args, char *, cp, tor_free(cp));
smartlist_free(args); smartlist_free(args);
return 0; return 0;