[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.
This commit is contained in:
Paul Jakma 2006-03-30 14:39:35 +00:00
parent cdc2c3f98e
commit 15aa6a1a73
2 changed files with 20 additions and 6 deletions

View File

@ -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> 2006-03-22 Paul Jakma <paul.jakma@sun.com>
* bgpd.c: (peer_free) release the per-peer workqueue when * bgpd.c: (peer_free) release the per-peer workqueue when

View File

@ -520,7 +520,7 @@ community_gettoken (const char *buf, enum community_token *token,
/* Unknown string. */ /* Unknown string. */
*token = community_token_unknown; *token = community_token_unknown;
return p; return NULL;
} }
/* Community value. */ /* Community value. */
@ -538,7 +538,7 @@ community_gettoken (const char *buf, enum community_token *token,
if (separator) if (separator)
{ {
*token = community_token_unknown; *token = community_token_unknown;
return p; return NULL;
} }
else else
{ {
@ -559,14 +559,14 @@ community_gettoken (const char *buf, enum community_token *token,
if (! digit) if (! digit)
{ {
*token = community_token_unknown; *token = community_token_unknown;
return p; return NULL;
} }
*val = community_high + community_low; *val = community_high + community_low;
*token = community_token_val; *token = community_token_val;
return p; return p;
} }
*token = community_token_unknown; *token = community_token_unknown;
return p; return NULL;
} }
/* convert string to community structure */ /* convert string to community structure */
@ -578,8 +578,10 @@ community_str2com (const char *str)
u_int32_t val; u_int32_t val;
enum community_token token; enum community_token token;
while ((str = community_gettoken (str, &token, &val))) do
{ {
str = community_gettoken (str, &token, &val);
switch (token) switch (token)
{ {
case community_token_val: case community_token_val:
@ -596,7 +598,7 @@ community_str2com (const char *str)
community_free (com); community_free (com);
break; break;
} }
} } while (str);
if (! com) if (! com)
return NULL; return NULL;