From 2852de1c90d5bc72493bcdfb8b6df8b24ff2e9d4 Mon Sep 17 00:00:00 2001 From: paul Date: Fri, 17 Sep 2004 06:52:16 +0000 Subject: 2004-09-17 Paul Jakma * vtysh.c: (vtysh_client_execute) trailling NULLs can be arbitrarily split across reads, dont get confused by this and block forever. --- vtysh/vtysh.c | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) (limited to 'vtysh/vtysh.c') diff --git a/vtysh/vtysh.c b/vtysh/vtysh.c index 45596b29..b50424af 100644 --- a/vtysh/vtysh.c +++ b/vtysh/vtysh.c @@ -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; -- cgit v1.2.1