diff options
author | Paul Jakma <paul.jakma@sun.com> | 2006-03-30 14:39:35 +0000 |
---|---|---|
committer | Paul Jakma <paul.jakma@sun.com> | 2006-03-30 14:39:35 +0000 |
commit | 15aa6a1a732eef1049dbc64d7ede9236772cafcf (patch) | |
tree | 0badfe99eedf29a4e8ef519123e91e96309ad300 | |
parent | cdc2c3f98e5652c06ad01eed6bfb5f93c168f817 (diff) |
[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.
-rw-r--r-- | bgpd/ChangeLog | 12 | ||||
-rw-r--r-- | bgpd/bgp_community.c | 14 |
2 files changed, 20 insertions, 6 deletions
diff --git a/bgpd/ChangeLog b/bgpd/ChangeLog index 26897f3c..2a442f27 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 3033db14..b419a203 100644 --- a/bgpd/bgp_community.c +++ b/bgpd/bgp_community.c @@ -520,7 +520,7 @@ community_gettoken (const char *buf, enum community_token *token, /* Unknown string. */ *token = community_token_unknown; - return p; + return NULL; } /* Community value. */ @@ -538,7 +538,7 @@ community_gettoken (const char *buf, enum community_token *token, if (separator) { *token = community_token_unknown; - return p; + return NULL; } else { @@ -559,14 +559,14 @@ community_gettoken (const char *buf, enum community_token *token, 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 @@ community_str2com (const char *str) 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_str2com (const char *str) community_free (com); break; } - } + } while (str); if (! com) return NULL; |