mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-16 08:32:45 +00:00
bgpd: Validate large-community-list against UINT_MAX
Signed-off-by: Donatas Abraitis <donatas.abraitis@gmail.com>
This commit is contained in:
parent
a123bd4ad6
commit
5bd66e2dcc
@ -27,6 +27,7 @@
|
|||||||
#include "filter.h"
|
#include "filter.h"
|
||||||
#include "stream.h"
|
#include "stream.h"
|
||||||
#include "jhash.h"
|
#include "jhash.h"
|
||||||
|
#include "frrstr.h"
|
||||||
|
|
||||||
#include "bgpd/bgpd.h"
|
#include "bgpd/bgpd.h"
|
||||||
#include "bgpd/bgp_community.h"
|
#include "bgpd/bgp_community.h"
|
||||||
@ -1026,6 +1027,33 @@ struct lcommunity *lcommunity_list_match_delete(struct lcommunity *lcom,
|
|||||||
return lcom;
|
return lcom;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Helper to check if every octet do not exceed UINT_MAX */
|
||||||
|
static int lcommunity_list_valid(const char *community)
|
||||||
|
{
|
||||||
|
int octets = 0;
|
||||||
|
char **splits;
|
||||||
|
int num;
|
||||||
|
|
||||||
|
frrstr_split(community, ":", &splits, &num);
|
||||||
|
|
||||||
|
for (int i = 0; i < num; i++) {
|
||||||
|
if (strtoul(splits[i], NULL, 10) > UINT_MAX)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (strlen(splits[i]) == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
octets++;
|
||||||
|
XFREE(MTYPE_TMP, splits[i]);
|
||||||
|
}
|
||||||
|
XFREE(MTYPE_TMP, splits);
|
||||||
|
|
||||||
|
if (octets < 3)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
/* Set lcommunity-list. */
|
/* Set lcommunity-list. */
|
||||||
int lcommunity_list_set(struct community_list_handler *ch, const char *name,
|
int lcommunity_list_set(struct community_list_handler *ch, const char *name,
|
||||||
const char *str, int direct, int style)
|
const char *str, int direct, int style)
|
||||||
@ -1054,6 +1082,9 @@ int lcommunity_list_set(struct community_list_handler *ch, const char *name,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (str) {
|
if (str) {
|
||||||
|
if (!lcommunity_list_valid(str))
|
||||||
|
return COMMUNITY_LIST_ERR_MALFORMED_VAL;
|
||||||
|
|
||||||
if (style == LARGE_COMMUNITY_LIST_STANDARD)
|
if (style == LARGE_COMMUNITY_LIST_STANDARD)
|
||||||
lcom = lcommunity_str2com(str);
|
lcom = lcommunity_str2com(str);
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user