]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
Accept \n as end of command on the control interface.
authorRoy Marples <roy@marples.name>
Thu, 3 Jul 2014 14:23:32 +0000 (14:23 +0000)
committerRoy Marples <roy@marples.name>
Thu, 3 Jul 2014 14:23:32 +0000 (14:23 +0000)
control.c

index d902b1970de2667aa8c46cf75e4416d58d7faa16..e043ccd81c1544d6a78fe53b57293ea9f7ee86ed 100644 (file)
--- 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