From: Roy Marples Date: Thu, 3 Jul 2014 14:23:32 +0000 (+0000) Subject: Accept \n as end of command on the control interface. X-Git-Tag: v6.4.1~28 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5ddec3d36cec965c32f544bee2bf6375459504b3;p=thirdparty%2Fdhcpcd.git Accept \n as end of command on the control interface. --- diff --git a/control.c b/control.c index d902b197..e043ccd8 100644 --- a/control.c +++ b/control.c @@ -52,8 +52,9 @@ static void control_handle_data(void *arg) { struct fd_list *l = arg, *lp, *last; - char buffer[1024], *e, *p, *argvp[255], **ap; + char buffer[1024], *e, *p, *argvp[255], **ap, *a; ssize_t bytes; + size_t len; int argc; bytes = read(l->fd, buffer, sizeof(buffer) - 1); @@ -79,14 +80,28 @@ control_handle_data(void *arg) buffer[bytes] = '\0'; p = buffer; e = buffer + bytes; - argc = 0; - ap = argvp; - while (p < e && (size_t)argc < sizeof(argvp)) { - argc++; - *ap++ = p; - p += strlen(p) + 1; + + /* Each command is \n terminated + * Each argument is NULL separated */ + while (p < e) { + argc = 0; + ap = argvp; + while (p < e) { + argc++; + if ((size_t)argc > sizeof(argvp)) { + errno = ENOBUFS; + return; + } + a = *ap++ = p; + len = strlen(p); + p += len + 1; + if (a[len - 1] == '\n') { + a[len - 1] = '\0'; + break; + } + } + dhcpcd_handleargs(l->ctx, l, argc, argvp); } - dhcpcd_handleargs(l->ctx, l, argc, argvp); } static void