Fix incorrect handling of multiple local commands in a single read.
@@ -316,7 +316,7 @@ local_notify_all_1(struct local_socket *s)
int
local_read(struct local_socket *s)
{
- int rc;
+ int rc, n;
char *eol;
char reply[100] = "ok\n";
const char *message = NULL;
@@ -336,11 +336,13 @@ local_read(struct local_socket *s)
return rc;
s->n += rc;
+ while(s->n > 0) {
eol = memchr(s->buf, '\n', s->n);
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) {
case CONFIG_ACTION_DONE:
break;
@@ -368,15 +370,16 @@ local_read(struct local_socket *s)
if(reply[0] != '\0') {
rc = write_timeout(s->fd, reply, strlen(reply));
- if(rc < 0)
+ if(rc < 0) {
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) {
- memmove(s->buf, eol + 1, s->n - (eol + 1 - s->buf));
- s->n -= (eol + 1 - s->buf);
- } else {
- s->n = 0;
+ if(s->n == 0) {
free(s->buf);
s->buf = NULL;
}
