Commit b98fb201 authored by Juliusz Chroboczek's avatar Juliusz Chroboczek

Fix incorrect handling of multiple local commands in a single read.

parent 53518417
...@@ -316,7 +316,7 @@ local_notify_all_1(struct local_socket *s) ...@@ -316,7 +316,7 @@ local_notify_all_1(struct local_socket *s)
int int
local_read(struct local_socket *s) local_read(struct local_socket *s)
{ {
int rc; int rc, n;
char *eol; char *eol;
char reply[100] = "ok\n"; char reply[100] = "ok\n";
const char *message = NULL; const char *message = NULL;
...@@ -336,11 +336,13 @@ local_read(struct local_socket *s) ...@@ -336,11 +336,13 @@ local_read(struct local_socket *s)
return rc; return rc;
s->n += rc; s->n += rc;
while(s->n > 0) {
eol = memchr(s->buf, '\n', s->n); eol = memchr(s->buf, '\n', s->n);
if(eol == NULL) if(eol == NULL)
return 1; break;
n = eol + 1 - s->buf;
rc = parse_config_from_string(s->buf, eol + 1 - s->buf, &message); rc = parse_config_from_string(s->buf, n, &message);
switch(rc) { switch(rc) {
case CONFIG_ACTION_DONE: case CONFIG_ACTION_DONE:
break; break;
...@@ -368,15 +370,16 @@ local_read(struct local_socket *s) ...@@ -368,15 +370,16 @@ local_read(struct local_socket *s)
if(reply[0] != '\0') { if(reply[0] != '\0') {
rc = write_timeout(s->fd, reply, strlen(reply)); rc = write_timeout(s->fd, reply, strlen(reply));
if(rc < 0) if(rc < 0) {
goto fail; goto fail;
} }
}
if(s->n > n)
memmove(s->buf, s->buf + n, s->n - n);
s->n -= n;
}
if(s->n > eol + 1 - s->buf) { if(s->n == 0) {
memmove(s->buf, eol + 1, s->n - (eol + 1 - s->buf));
s->n -= (eol + 1 - s->buf);
} else {
s->n = 0;
free(s->buf); free(s->buf);
s->buf = NULL; s->buf = NULL;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment