[bgpd] Fix infinite loop in community_str2com

2006-03-30 Paul Jakma <paul.jakma@sun.com>

	* bgp_community.c: (community_gettoken) Unknown token should
	  return NULL, to give a strong indication to callers that
	  the token no longer can be parsed, otherwise callers looping
	  on this function may have a hard time ending their loop.
	  (community_str2com) While loop around community_gettoken appears
	  to have been coded thinking that break statement would break
	  from the while{}, hence it could never exit for unknown token
	  case. Fix it to do..while, so it can use the NULL result from
	  community_gettoken easily.
diff --git a/bgpd/ChangeLog b/bgpd/ChangeLog
index 26897f3..2a442f2 100644
--- a/bgpd/ChangeLog
+++ b/bgpd/ChangeLog
@@ -1,3 +1,15 @@
+2006-03-30 Paul Jakma <paul.jakma@sun.com>
+
+	* bgp_community.c: (community_gettoken) Unknown token should
+	  return NULL, to give a strong indication to callers that
+	  the token no longer can be parsed, otherwise callers looping
+	  on this function may have a hard time ending their loop.
+	  (community_str2com) While loop around community_gettoken appears
+	  to have been coded thinking that break statement would break
+	  from the while{}, hence it could never exit for unknown token
+	  case. Fix it to do..while, so it can use the NULL result from
+	  community_gettoken easily.
+
 2006-03-22 Paul Jakma <paul.jakma@sun.com>
 
 	* bgpd.c: (peer_free) release the per-peer workqueue when
diff --git a/bgpd/bgp_community.c b/bgpd/bgp_community.c
index 3033db1..b419a20 100644
--- a/bgpd/bgp_community.c
+++ b/bgpd/bgp_community.c
@@ -520,7 +520,7 @@
 
       /* Unknown string. */
       *token = community_token_unknown;
-      return p;
+      return NULL;
     }
 
   /* Community value. */
@@ -538,7 +538,7 @@
 	      if (separator)
 		{
 		  *token = community_token_unknown;
-		  return p;
+		  return NULL;
 		}
 	      else
 		{
@@ -559,14 +559,14 @@
       if (! digit)
 	{
 	  *token = community_token_unknown;
-	  return p;
+	  return NULL;
 	}
       *val = community_high + community_low;
       *token = community_token_val;
       return p;
     }
   *token = community_token_unknown;
-  return p;
+  return NULL;
 }
 
 /* convert string to community structure */
@@ -578,8 +578,10 @@
   u_int32_t val;
   enum community_token token;
 
-  while ((str = community_gettoken (str, &token, &val))) 
+  do 
     {
+      str = community_gettoken (str, &token, &val);
+      
       switch (token)
 	{
 	case community_token_val:
@@ -596,7 +598,7 @@
 	    community_free (com);
 	  break;
 	}
-    }
+    } while (str);
   
   if (! com)
     return NULL;