mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-14 06:50:17 +00:00
[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:
parent
cdc2c3f98e
commit
15aa6a1a73
@ -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
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user