Fixed bug in experimental parsing function, that caused crash at reporting
of errors.
This commit is contained in:
+16
-15
@@ -224,10 +224,15 @@ int parse_message (char * str, Client * c)
|
|||||||
int argpos = 0;
|
int argpos = 0;
|
||||||
|
|
||||||
void close_arg () {
|
void close_arg () {
|
||||||
argv[argc][argpos] = 0;
|
if( argc == MAX_ARGUMENTS-1 ) {
|
||||||
argv[argc+1] = argv[argc] + argpos + 1;
|
error = 1;
|
||||||
argc ++;
|
}
|
||||||
argpos = 0;
|
else {
|
||||||
|
argv[argc][argpos] = 0;
|
||||||
|
argv[argc+1] = argv[argc] + argpos + 1;
|
||||||
|
argc ++;
|
||||||
|
argpos = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
debug( RPT_DEBUG, "%s( str=\"%.120s\", client=[%d] )", __FUNCTION__, str, c->sock );
|
debug( RPT_DEBUG, "%s( str=\"%.120s\", client=[%d] )", __FUNCTION__, str, c->sock );
|
||||||
@@ -238,7 +243,7 @@ int parse_message (char * str, Client * c)
|
|||||||
* the original string str.
|
* the original string str.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
while( state != ST_FINAL ) {
|
while( state != ST_FINAL && !error ) {
|
||||||
ch = str[pos++];
|
ch = str[pos++];
|
||||||
switch( state ) {
|
switch( state ) {
|
||||||
|
|
||||||
@@ -280,12 +285,6 @@ int parse_message (char * str, Client * c)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '\n':
|
case '\n':
|
||||||
if (used_quote) {
|
|
||||||
/* Just ad it */
|
|
||||||
argv[argc][argpos++] = ch;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* else go to case 0 */
|
|
||||||
case 0:
|
case 0:
|
||||||
if (used_quote) {
|
if (used_quote) {
|
||||||
error = 2;
|
error = 2;
|
||||||
@@ -297,7 +296,7 @@ int parse_message (char * str, Client * c)
|
|||||||
if (str[pos]) {
|
if (str[pos]) {
|
||||||
/* We solve quoted chars here right away */
|
/* We solve quoted chars here right away */
|
||||||
char * p;
|
char * p;
|
||||||
p = strchr( escape_chars, str[pos++] );
|
p = strchr( escape_chars, str[pos] );
|
||||||
if (p != NULL) {
|
if (p != NULL) {
|
||||||
/* Insert a replacement for the code */
|
/* Insert a replacement for the code */
|
||||||
argv[argc][argpos++] = escape_trans[(int)*p];
|
argv[argc][argpos++] = escape_trans[(int)*p];
|
||||||
@@ -306,12 +305,14 @@ int parse_message (char * str, Client * c)
|
|||||||
/* Copy char litterally */
|
/* Copy char litterally */
|
||||||
argv[argc][argpos++] = str[pos];
|
argv[argc][argpos++] = str[pos];
|
||||||
}
|
}
|
||||||
|
pos++;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
close_arg();
|
close_arg();
|
||||||
error = 2;
|
error = 2;
|
||||||
state = ST_FINAL;
|
state = ST_FINAL;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
case '\"':
|
case '\"':
|
||||||
case '{':
|
case '{':
|
||||||
if (!used_quote) {
|
if (!used_quote) {
|
||||||
@@ -341,7 +342,7 @@ int parse_message (char * str, Client * c)
|
|||||||
argv[argc] = NULL;
|
argv[argc] = NULL;
|
||||||
if (error) {
|
if (error) {
|
||||||
snprintf (errmsg, sizeof(errmsg), "huh? Could not parse command\n");
|
snprintf (errmsg, sizeof(errmsg), "huh? Could not parse command\n");
|
||||||
report( RPT_WARNING, "Could not parse command from client on socket %d: %s", __FUNCTION__, c->sock, str );
|
report( RPT_WARNING, "Could not parse command from client on socket %d: %.40s", c->sock, str );
|
||||||
sock_send_string (c->sock, errmsg);
|
sock_send_string (c->sock, errmsg);
|
||||||
free( arg_space );
|
free( arg_space );
|
||||||
return 0;
|
return 0;
|
||||||
@@ -359,12 +360,12 @@ int parse_message (char * str, Client * c)
|
|||||||
if (error == 1) {
|
if (error == 1) {
|
||||||
snprintf (errmsg, sizeof(errmsg), "huh? Invalid command \"%.40s\"\n", argv[0]);
|
snprintf (errmsg, sizeof(errmsg), "huh? Invalid command \"%.40s\"\n", argv[0]);
|
||||||
sock_send_string (c->sock, errmsg);
|
sock_send_string (c->sock, errmsg);
|
||||||
report( RPT_WARNING, "Invalid command from client on socket %d: %s", __FUNCTION__, c->sock, str );
|
report( RPT_WARNING, "Invalid command from client on socket %d: %.40s", c->sock, str );
|
||||||
}
|
}
|
||||||
else if (error) {
|
else if (error) {
|
||||||
snprintf (errmsg, sizeof(errmsg), "huh? Function returned error \"%.40s\"\n", argv[0]);
|
snprintf (errmsg, sizeof(errmsg), "huh? Function returned error \"%.40s\"\n", argv[0]);
|
||||||
sock_send_string (c->sock, errmsg);
|
sock_send_string (c->sock, errmsg);
|
||||||
report( RPT_WARNING, "Command function returned an error after command from client on socket %d: %s", __FUNCTION__, c->sock, str );
|
report( RPT_WARNING, "Command function returned an error after command from client on socket %d: %.40s", c->sock, str );
|
||||||
}
|
}
|
||||||
|
|
||||||
free( arg_space );
|
free( arg_space );
|
||||||
|
|||||||
Reference in New Issue
Block a user