mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-16 06:53:03 +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>
|
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
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user