chiark / gitweb /
server/admin: Brown-paper-bag fix.
authorMark Wooding <mdw@distorted.org.uk>
Mon, 8 Dec 2008 20:14:24 +0000 (20:14 +0000)
committerMark Wooding <mdw@distorted.org.uk>
Mon, 8 Dec 2008 20:22:03 +0000 (20:22 +0000)
Commit 165efde7 changed a_resolve to not require a port number.
Unfortunately, I botched it and wrote a test for av[i + 1] as
av[i + i].  Result with i = 0: very different.

While investigating this bug, I became nervous about the number of
is-av[i]-null tests going on when str_qsplit doesn't actually guarantee
to leave a null terminator behind if it uses all the array slots.  So
I've allocated an extra slot and zeroed it explicitly.

server/admin.c

index 382baca97b7ea6e85c2705a477b72fbd127845ad..1a4d2a45c92b80f474441c4676d6ca325d382163 100644 (file)
@@ -1062,7 +1062,7 @@ static void a_resolve(admin *a, admin_resop *r, const char *tag,
   r->sa.sin.sin_family = AF_INET;
   r->sasz = sizeof(r->sa.sin);
   r->addr = xstrdup(av[i]);
   r->sa.sin.sin_family = AF_INET;
   r->sasz = sizeof(r->sa.sin);
   r->addr = xstrdup(av[i]);
-  if (!av[i + i])
+  if (!av[i + 1])
     pt = TRIPE_PORT;
   else {
     pt = strtoul(av[i + 1], &p, 0);
     pt = TRIPE_PORT;
   else {
     pt = strtoul(av[i + 1], &p, 0);
@@ -2025,7 +2025,7 @@ static void a_line(char *p, size_t len, void *vp)
 {
   admin *a = vp;
   const acmd *c;
 {
   admin *a = vp;
   const acmd *c;
-  char *av[16];
+  char *av[16 + 1];
   size_t ac;
 
   TIMER;
   size_t ac;
 
   TIMER;
@@ -2040,9 +2040,10 @@ static void a_line(char *p, size_t len, void *vp)
     }
     return;
   }
     }
     return;
   }
-  ac = str_qsplit(p, av, 16, 0, STRF_QUOTE);
+  ac = str_qsplit(p, av, N(av) - 1, 0, STRF_QUOTE);
   if (!ac)
     return;
   if (!ac)
     return;
+  av[ac] = 0;
   for (c = acmdtab; c->name; c++) {
     if (mystrieq(av[0], c->name)) {
       ac--;
   for (c = acmdtab; c->name; c++) {
     if (mystrieq(av[0], c->name)) {
       ac--;