Skip to content

Commit

Permalink
keepalived: fix service config problem caused by using the uninitiali…
Browse files Browse the repository at this point in the history
…zed local variable

Signed-off-by: ywc689 <[email protected]>
  • Loading branch information
ywc689 committed Nov 28, 2022
1 parent aea3b54 commit 1d7850d
Show file tree
Hide file tree
Showing 6 changed files with 51 additions and 50 deletions.
1 change: 1 addition & 0 deletions include/conf/inet.h
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,7 @@ static inline int inet_addr_range_parse(const char *param,
port1 = port2 = NULL;
}

*af = 0;
memset(range, 0, sizeof(*range));

if (strlen(ip1) && inet_pton(AF_INET6, ip1, &range->min_addr.in6) > 0) {
Expand Down
35 changes: 35 additions & 0 deletions include/conf/match.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,41 @@ static inline bool is_empty_match(const struct dp_vs_match *match)
return !memcmp(match, &zero_match, sizeof(*match));
}

static inline int dp_vs_match_parse(const char *srange, const char *drange,
const char *iifname, const char *oifname,
int af, struct dp_vs_match *match)
{
int s_af = 0, d_af = 0, err;

memset(match, 0, sizeof(*match));

if (srange && strlen(srange)) {
err = inet_addr_range_parse(srange, &match->srange, &s_af);
if (err != EDPVS_OK)
return err;
}

if (drange && strlen(drange)) {
err = inet_addr_range_parse(drange, &match->drange, &d_af);
if (err != EDPVS_OK)
return err;
}

if (s_af && d_af && s_af != d_af) {
return EDPVS_INVAL;
}
match->af = s_af | d_af;

if (af && match->af && af != match->af) {
return EDPVS_INVAL;
}

snprintf(match->iifname, IFNAMSIZ, "%s", iifname ? : "");
snprintf(match->oifname, IFNAMSIZ, "%s", oifname ? : "");

return EDPVS_OK;
}

static inline int parse_match(const char *pattern, uint8_t *proto,
struct dp_vs_match *match)
{
Expand Down
4 changes: 0 additions & 4 deletions include/ipvs/service.h
Original file line number Diff line number Diff line change
Expand Up @@ -101,10 +101,6 @@ dp_vs_service_lookup(int af, uint16_t protocol,
const struct dp_vs_match *match,
bool *outwall, lcoreid_t cid);

int dp_vs_match_parse(const char *srange, const char *drange,
const char *iifname, const char *oifname,
int af, struct dp_vs_match *match);

void dp_vs_service_bind(struct dp_vs_dest *dest, struct dp_vs_service *svc);

void dp_vs_service_unbind(struct dp_vs_dest *dest);
Expand Down
33 changes: 0 additions & 33 deletions src/ipvs/ip_vs_service.c
Original file line number Diff line number Diff line change
Expand Up @@ -341,39 +341,6 @@ __dp_vs_service_match_get(int af, const struct rte_mbuf *mbuf, bool *outwall, lc
return NULL;
}

int dp_vs_match_parse(const char *srange, const char *drange,
const char *iifname, const char *oifname,
int af, struct dp_vs_match *match)
{
int err;

memset(match, 0, sizeof(*match));

if (srange && strlen(srange)) {
err = inet_addr_range_parse(srange, &match->srange, &match->af);
if (err != EDPVS_OK)
return err;
}

if (drange && strlen(drange)) {
err = inet_addr_range_parse(drange, &match->drange, &match->af);
if (err != EDPVS_OK)
return err;
}

if (match->af && af && match->af != af)
return EDPVS_INVAL;

// no range param
if (!match->af)
match->af = af;

snprintf(match->iifname, IFNAMSIZ, "%s", iifname ? : "");
snprintf(match->oifname, IFNAMSIZ, "%s", oifname ? : "");

return EDPVS_OK;
}

static struct dp_vs_service *
__dp_vs_service_match_find(int af, uint8_t proto, const struct dp_vs_match *match,
lcoreid_t cid)
Expand Down
8 changes: 4 additions & 4 deletions tools/keepalived/keepalived/check/check_data.c
Original file line number Diff line number Diff line change
Expand Up @@ -610,10 +610,10 @@ alloc_vs(const char *param1, const char *param2)
new->hash_target = 0;
new->bps = 0;
new->limit_proportion = 100;
memset(new->srange, 0, 256);
memset(new->drange, 0, 256);
memset(new->iifname, 0, IFNAMSIZ);
memset(new->oifname, 0, IFNAMSIZ);
memset(new->srange, 0, sizeof(new->srange));
memset(new->drange, 0, sizeof(new->drange));
memset(new->iifname, 0, sizeof(new->iifname));
memset(new->oifname, 0, sizeof(new->oifname));

list_add(check_data->vs, new);
}
Expand Down
20 changes: 11 additions & 9 deletions tools/keepalived/keepalived/check/ipvswrapper.c
Original file line number Diff line number Diff line change
Expand Up @@ -753,7 +753,7 @@ ipvs_blklst_cmd(int cmd, dpvs_service_compat_t *srule, virtual_server_t * vs)
/* Fill IPVS rule with root vs infos */
static void ipvs_set_srule(int cmd, dpvs_service_compat_t *srule, virtual_server_t *vs)
{
int af;
int af = 0;
/* Clean service rule */
memset(srule, 0, sizeof(dpvs_service_compat_t));

Expand All @@ -766,14 +766,16 @@ static void ipvs_set_srule(int cmd, dpvs_service_compat_t *srule, virtual_server
srule->limit_proportion = vs->limit_proportion;
srule->conn_timeout = vs->conn_timeout;

inet_addr_range_parse(vs->srange, &srule->match.srange, &af);
inet_addr_range_parse(vs->drange, &srule->match.drange, &af);
snprintf(srule->match.iifname, IFNAMSIZ, "%s", vs->iifname);
snprintf(srule->match.oifname, IFNAMSIZ, "%s", vs->oifname);
srule->match.af = af;

if (!srule->af && (vs->srange[0] || vs->drange[0] || vs->iifname[0] || vs->oifname[0]))
srule->af = af;
if (vs->srange[0] || vs->drange[0] || vs->iifname[0] || vs->oifname[0]) {
if (dp_vs_match_parse(vs->srange, vs->drange, vs->iifname,
vs->oifname,vs->af, &srule->match) == EDPVS_OK) {
srule->af = srule->match.af;
} else {
memset(&srule->match, 0, sizeof(srule->match));
}
} else if (!vs->af) {
log_message(LOG_WARNING, "empty virtual server af\n");
}

if (vs->persistence_timeout &&
(cmd == IP_VS_SO_SET_ADD || cmd == IP_VS_SO_SET_DEL)) {
Expand Down

0 comments on commit 1d7850d

Please sign in to comment.