]> git.puffer.fish Git - mirror/frr.git/commitdiff
2004-09-17 Paul Jakma <paul@dishone.st>
authorpaul <paul>
Fri, 17 Sep 2004 06:52:16 +0000 (06:52 +0000)
committerpaul <paul>
Fri, 17 Sep 2004 06:52:16 +0000 (06:52 +0000)
       * vtysh.c: (vtysh_client_execute) trailling NULLs can be arbitrarily
         split across reads, dont get confused by this and block forever.

vtysh/ChangeLog
vtysh/vtysh.c

index 54960e1abb23fde2fe3096c71bea739fec8e2ce1..1156afcd2d40001f3b7929608503c5e52b6c0fc7 100644 (file)
@@ -1,3 +1,8 @@
+2004-09-17 Paul Jakma <paul@dishone.st>
+
+       * vtysh.c: (vtysh_client_execute) trailling NULLs can be arbitrarily
+          split across reads, dont get confused by this and block forever.
+
 2004-09-13 Paul Jakma <paul@dishone.st>
 
        * Makefile.am: extract.pl isnt in srcdir, it's always in the builddir.
index 45596b2997001beb8df554d270ceae7442ce406a..b50424af15e7ee5f9fdf0f568e33ed450140ea05 100644 (file)
@@ -160,7 +160,8 @@ vtysh_client_execute (struct vtysh_client *vclient, char *line, FILE *fp)
   int ret;
   char buf[1001];
   int nbytes;
-  int i;
+  int i; 
+  int numnulls = 0;
 
   if (vclient->fd < 0)
     return CMD_SUCCESS;
@@ -187,16 +188,30 @@ vtysh_client_execute (struct vtysh_client *vclient, char *line, FILE *fp)
          buf[nbytes] = '\0';
          fprintf (fp, "%s", buf);
          fflush (fp);
-
-         if (nbytes >= 4)
-           {
-             i = nbytes - 4;
-             if (buf[i] == '\0' && buf[i + 1] == '\0' && buf[i + 2] == '\0')
-               {
-                 ret = buf[i + 3];
-                 break;
-               }
-           }
+         
+         /* check for trailling \0\0\0\0, even if split across reads */
+          if (nbytes >= 4) 
+            {
+              i = nbytes-4;
+              numnulls = 0;
+            }
+          else
+            i = 0;
+          
+          while (i < nbytes)
+            {
+              if (buf[i++] == '\0')
+                numnulls++;
+              else
+                {
+                  numnulls = 0;
+                  break;
+                }
+            }
+
+          /* got 3 or more trailling nulls? */
+          if (numnulls >= 3)
+            return CMD_SUCCESS;
        }
     }
   return ret;