Merge branch 'master' into net-next
This commit is contained in:
commit
60509b997d
|
|
@ -133,6 +133,8 @@ void missarg(const char *) __attribute__((noreturn));
|
||||||
void invarg(const char *, const char *) __attribute__((noreturn));
|
void invarg(const char *, const char *) __attribute__((noreturn));
|
||||||
void duparg(const char *, const char *) __attribute__((noreturn));
|
void duparg(const char *, const char *) __attribute__((noreturn));
|
||||||
void duparg2(const char *, const char *) __attribute__((noreturn));
|
void duparg2(const char *, const char *) __attribute__((noreturn));
|
||||||
|
int check_ifname(const char *);
|
||||||
|
int get_ifname(char *, const char *);
|
||||||
int matches(const char *arg, const char *pattern);
|
int matches(const char *arg, const char *pattern);
|
||||||
int inet_addr_match(const inet_prefix *a, const inet_prefix *b, int bits);
|
int inet_addr_match(const inet_prefix *a, const inet_prefix *b, int bits);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -136,7 +136,7 @@ static void print_tunnel(struct ip6_tnl_parm2 *p)
|
||||||
static int parse_args(int argc, char **argv, int cmd, struct ip6_tnl_parm2 *p)
|
static int parse_args(int argc, char **argv, int cmd, struct ip6_tnl_parm2 *p)
|
||||||
{
|
{
|
||||||
int count = 0;
|
int count = 0;
|
||||||
char medium[IFNAMSIZ] = {};
|
const char *medium = NULL;
|
||||||
|
|
||||||
while (argc > 0) {
|
while (argc > 0) {
|
||||||
if (strcmp(*argv, "mode") == 0) {
|
if (strcmp(*argv, "mode") == 0) {
|
||||||
|
|
@ -180,7 +180,7 @@ static int parse_args(int argc, char **argv, int cmd, struct ip6_tnl_parm2 *p)
|
||||||
memcpy(&p->laddr, &laddr.data, sizeof(p->laddr));
|
memcpy(&p->laddr, &laddr.data, sizeof(p->laddr));
|
||||||
} else if (strcmp(*argv, "dev") == 0) {
|
} else if (strcmp(*argv, "dev") == 0) {
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
strncpy(medium, *argv, IFNAMSIZ - 1);
|
medium = *argv;
|
||||||
} else if (strcmp(*argv, "encaplimit") == 0) {
|
} else if (strcmp(*argv, "encaplimit") == 0) {
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
if (strcmp(*argv, "none") == 0) {
|
if (strcmp(*argv, "none") == 0) {
|
||||||
|
|
@ -273,7 +273,8 @@ static int parse_args(int argc, char **argv, int cmd, struct ip6_tnl_parm2 *p)
|
||||||
usage();
|
usage();
|
||||||
if (p->name[0])
|
if (p->name[0])
|
||||||
duparg2("name", *argv);
|
duparg2("name", *argv);
|
||||||
strncpy(p->name, *argv, IFNAMSIZ - 1);
|
if (get_ifname(p->name, *argv))
|
||||||
|
invarg("\"name\" not a valid ifname", *argv);
|
||||||
if (cmd == SIOCCHGTUNNEL && count == 0) {
|
if (cmd == SIOCCHGTUNNEL && count == 0) {
|
||||||
struct ip6_tnl_parm2 old_p = {};
|
struct ip6_tnl_parm2 old_p = {};
|
||||||
|
|
||||||
|
|
@ -285,7 +286,7 @@ static int parse_args(int argc, char **argv, int cmd, struct ip6_tnl_parm2 *p)
|
||||||
count++;
|
count++;
|
||||||
argc--; argv++;
|
argc--; argv++;
|
||||||
}
|
}
|
||||||
if (medium[0]) {
|
if (medium) {
|
||||||
p->link = ll_name_to_index(medium);
|
p->link = ll_name_to_index(medium);
|
||||||
if (p->link == 0) {
|
if (p->link == 0) {
|
||||||
fprintf(stderr, "Cannot find device \"%s\"\n", medium);
|
fprintf(stderr, "Cannot find device \"%s\"\n", medium);
|
||||||
|
|
|
||||||
|
|
@ -182,7 +182,7 @@ static int create_session(struct l2tp_parm *p)
|
||||||
if (p->peer_cookie_len)
|
if (p->peer_cookie_len)
|
||||||
addattr_l(&req.n, 1024, L2TP_ATTR_PEER_COOKIE,
|
addattr_l(&req.n, 1024, L2TP_ATTR_PEER_COOKIE,
|
||||||
p->peer_cookie, p->peer_cookie_len);
|
p->peer_cookie, p->peer_cookie_len);
|
||||||
if (p->ifname && p->ifname[0])
|
if (p->ifname)
|
||||||
addattrstrz(&req.n, 1024, L2TP_ATTR_IFNAME, p->ifname);
|
addattrstrz(&req.n, 1024, L2TP_ATTR_IFNAME, p->ifname);
|
||||||
|
|
||||||
if (rtnl_talk(&genl_rth, &req.n, NULL, 0) < 0)
|
if (rtnl_talk(&genl_rth, &req.n, NULL, 0) < 0)
|
||||||
|
|
@ -545,6 +545,8 @@ static int parse_args(int argc, char **argv, int cmd, struct l2tp_parm *p)
|
||||||
}
|
}
|
||||||
} else if (strcmp(*argv, "name") == 0) {
|
} else if (strcmp(*argv, "name") == 0) {
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
|
if (check_ifname(*argv))
|
||||||
|
invarg("\"name\" not a valid ifname", *argv);
|
||||||
p->ifname = *argv;
|
p->ifname = *argv;
|
||||||
} else if (strcmp(*argv, "remote") == 0) {
|
} else if (strcmp(*argv, "remote") == 0) {
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
|
|
|
||||||
31
ip/iplink.c
31
ip/iplink.c
|
|
@ -573,6 +573,8 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req,
|
||||||
req->i.ifi_flags &= ~IFF_UP;
|
req->i.ifi_flags &= ~IFF_UP;
|
||||||
} else if (strcmp(*argv, "name") == 0) {
|
} else if (strcmp(*argv, "name") == 0) {
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
|
if (check_ifname(*argv))
|
||||||
|
invarg("\"name\" not a valid ifname", *argv);
|
||||||
*name = *argv;
|
*name = *argv;
|
||||||
} else if (strcmp(*argv, "index") == 0) {
|
} else if (strcmp(*argv, "index") == 0) {
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
|
|
@ -848,6 +850,8 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req,
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
if (*dev)
|
if (*dev)
|
||||||
duparg2("dev", *argv);
|
duparg2("dev", *argv);
|
||||||
|
if (check_ifname(*argv))
|
||||||
|
invarg("\"dev\" not a valid ifname", *argv);
|
||||||
*dev = *argv;
|
*dev = *argv;
|
||||||
dev_index = ll_name_to_index(*dev);
|
dev_index = ll_name_to_index(*dev);
|
||||||
}
|
}
|
||||||
|
|
@ -870,7 +874,6 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req,
|
||||||
|
|
||||||
static int iplink_modify(int cmd, unsigned int flags, int argc, char **argv)
|
static int iplink_modify(int cmd, unsigned int flags, int argc, char **argv)
|
||||||
{
|
{
|
||||||
int len;
|
|
||||||
char *dev = NULL;
|
char *dev = NULL;
|
||||||
char *name = NULL;
|
char *name = NULL;
|
||||||
char *link = NULL;
|
char *link = NULL;
|
||||||
|
|
@ -960,13 +963,8 @@ static int iplink_modify(int cmd, unsigned int flags, int argc, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (name) {
|
if (name) {
|
||||||
len = strlen(name) + 1;
|
addattr_l(&req.n, sizeof(req),
|
||||||
if (len == 1)
|
IFLA_IFNAME, name, strlen(name) + 1);
|
||||||
invarg("\"\" is not a valid device identifier\n",
|
|
||||||
"name");
|
|
||||||
if (len > IFNAMSIZ)
|
|
||||||
invarg("\"name\" too long\n", name);
|
|
||||||
addattr_l(&req.n, sizeof(req), IFLA_IFNAME, name, len);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type) {
|
if (type) {
|
||||||
|
|
@ -1016,7 +1014,6 @@ static int iplink_modify(int cmd, unsigned int flags, int argc, char **argv)
|
||||||
|
|
||||||
int iplink_get(unsigned int flags, char *name, __u32 filt_mask)
|
int iplink_get(unsigned int flags, char *name, __u32 filt_mask)
|
||||||
{
|
{
|
||||||
int len;
|
|
||||||
struct iplink_req req = {
|
struct iplink_req req = {
|
||||||
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)),
|
.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg)),
|
||||||
.n.nlmsg_flags = NLM_F_REQUEST | flags,
|
.n.nlmsg_flags = NLM_F_REQUEST | flags,
|
||||||
|
|
@ -1029,13 +1026,8 @@ int iplink_get(unsigned int flags, char *name, __u32 filt_mask)
|
||||||
} answer;
|
} answer;
|
||||||
|
|
||||||
if (name) {
|
if (name) {
|
||||||
len = strlen(name) + 1;
|
addattr_l(&req.n, sizeof(req),
|
||||||
if (len == 1)
|
IFLA_IFNAME, name, strlen(name) + 1);
|
||||||
invarg("\"\" is not a valid device identifier\n",
|
|
||||||
"name");
|
|
||||||
if (len > IFNAMSIZ)
|
|
||||||
invarg("\"name\" too long\n", name);
|
|
||||||
addattr_l(&req.n, sizeof(req), IFLA_IFNAME, name, len);
|
|
||||||
}
|
}
|
||||||
addattr32(&req.n, sizeof(req), IFLA_EXT_MASK, filt_mask);
|
addattr32(&req.n, sizeof(req), IFLA_EXT_MASK, filt_mask);
|
||||||
|
|
||||||
|
|
@ -1265,6 +1257,8 @@ static int do_set(int argc, char **argv)
|
||||||
flags &= ~IFF_UP;
|
flags &= ~IFF_UP;
|
||||||
} else if (strcmp(*argv, "name") == 0) {
|
} else if (strcmp(*argv, "name") == 0) {
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
|
if (check_ifname(*argv))
|
||||||
|
invarg("\"name\" not a valid ifname", *argv);
|
||||||
newname = *argv;
|
newname = *argv;
|
||||||
} else if (matches(*argv, "address") == 0) {
|
} else if (matches(*argv, "address") == 0) {
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
|
|
@ -1355,6 +1349,8 @@ static int do_set(int argc, char **argv)
|
||||||
|
|
||||||
if (dev)
|
if (dev)
|
||||||
duparg2("dev", *argv);
|
duparg2("dev", *argv);
|
||||||
|
if (check_ifname(*argv))
|
||||||
|
invarg("\"dev\" not a valid ifname", *argv);
|
||||||
dev = *argv;
|
dev = *argv;
|
||||||
}
|
}
|
||||||
argc--; argv++;
|
argc--; argv++;
|
||||||
|
|
@ -1383,9 +1379,6 @@ static int do_set(int argc, char **argv)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newname && strcmp(dev, newname)) {
|
if (newname && strcmp(dev, newname)) {
|
||||||
if (strlen(newname) == 0)
|
|
||||||
invarg("\"\" is not a valid device identifier\n",
|
|
||||||
"name");
|
|
||||||
if (do_changename(dev, newname) < 0)
|
if (do_changename(dev, newname) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
dev = newname;
|
dev = newname;
|
||||||
|
|
|
||||||
|
|
@ -284,7 +284,8 @@ static int multiaddr_modify(int cmd, int argc, char **argv)
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
if (ifr.ifr_name[0])
|
if (ifr.ifr_name[0])
|
||||||
duparg("dev", *argv);
|
duparg("dev", *argv);
|
||||||
strncpy(ifr.ifr_name, *argv, IFNAMSIZ);
|
if (get_ifname(ifr.ifr_name, *argv))
|
||||||
|
invarg("\"dev\" not a valid ifname", *argv);
|
||||||
} else {
|
} else {
|
||||||
if (matches(*argv, "address") == 0) {
|
if (matches(*argv, "address") == 0) {
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
|
|
|
||||||
10
ip/iprule.c
10
ip/iprule.c
|
|
@ -472,11 +472,13 @@ static int iprule_list_flush_or_save(int argc, char **argv, int action)
|
||||||
} else if (strcmp(*argv, "dev") == 0 ||
|
} else if (strcmp(*argv, "dev") == 0 ||
|
||||||
strcmp(*argv, "iif") == 0) {
|
strcmp(*argv, "iif") == 0) {
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
strncpy(filter.iif, *argv, IFNAMSIZ);
|
if (get_ifname(filter.iif, *argv))
|
||||||
|
invarg("\"iif\"/\"dev\" not a valid ifname", *argv);
|
||||||
filter.iifmask = 1;
|
filter.iifmask = 1;
|
||||||
} else if (strcmp(*argv, "oif") == 0) {
|
} else if (strcmp(*argv, "oif") == 0) {
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
strncpy(filter.oif, *argv, IFNAMSIZ);
|
if (get_ifname(filter.oif, *argv))
|
||||||
|
invarg("\"oif\" not a valid ifname", *argv);
|
||||||
filter.oifmask = 1;
|
filter.oifmask = 1;
|
||||||
} else if (strcmp(*argv, "l3mdev") == 0) {
|
} else if (strcmp(*argv, "l3mdev") == 0) {
|
||||||
filter.l3mdev = 1;
|
filter.l3mdev = 1;
|
||||||
|
|
@ -695,10 +697,14 @@ static int iprule_modify(int cmd, int argc, char **argv)
|
||||||
} else if (strcmp(*argv, "dev") == 0 ||
|
} else if (strcmp(*argv, "dev") == 0 ||
|
||||||
strcmp(*argv, "iif") == 0) {
|
strcmp(*argv, "iif") == 0) {
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
|
if (check_ifname(*argv))
|
||||||
|
invarg("\"iif\"/\"dev\" not a valid ifname", *argv);
|
||||||
addattr_l(&req.n, sizeof(req), FRA_IFNAME,
|
addattr_l(&req.n, sizeof(req), FRA_IFNAME,
|
||||||
*argv, strlen(*argv)+1);
|
*argv, strlen(*argv)+1);
|
||||||
} else if (strcmp(*argv, "oif") == 0) {
|
} else if (strcmp(*argv, "oif") == 0) {
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
|
if (check_ifname(*argv))
|
||||||
|
invarg("\"oif\" not a valid ifname", *argv);
|
||||||
addattr_l(&req.n, sizeof(req), FRA_OIFNAME,
|
addattr_l(&req.n, sizeof(req), FRA_OIFNAME,
|
||||||
*argv, strlen(*argv)+1);
|
*argv, strlen(*argv)+1);
|
||||||
} else if (strcmp(*argv, "l3mdev") == 0) {
|
} else if (strcmp(*argv, "l3mdev") == 0) {
|
||||||
|
|
|
||||||
|
|
@ -60,7 +60,7 @@ static void set_tunnel_proto(struct ip_tunnel_parm *p, int proto)
|
||||||
static int parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p)
|
static int parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p)
|
||||||
{
|
{
|
||||||
int count = 0;
|
int count = 0;
|
||||||
char medium[IFNAMSIZ] = {};
|
const char *medium = NULL;
|
||||||
int isatap = 0;
|
int isatap = 0;
|
||||||
|
|
||||||
memset(p, 0, sizeof(*p));
|
memset(p, 0, sizeof(*p));
|
||||||
|
|
@ -139,7 +139,7 @@ static int parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p)
|
||||||
p->iph.saddr = htonl(INADDR_ANY);
|
p->iph.saddr = htonl(INADDR_ANY);
|
||||||
} else if (strcmp(*argv, "dev") == 0) {
|
} else if (strcmp(*argv, "dev") == 0) {
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
strncpy(medium, *argv, IFNAMSIZ - 1);
|
medium = *argv;
|
||||||
} else if (strcmp(*argv, "ttl") == 0 ||
|
} else if (strcmp(*argv, "ttl") == 0 ||
|
||||||
strcmp(*argv, "hoplimit") == 0 ||
|
strcmp(*argv, "hoplimit") == 0 ||
|
||||||
strcmp(*argv, "hlim") == 0) {
|
strcmp(*argv, "hlim") == 0) {
|
||||||
|
|
@ -178,7 +178,8 @@ static int parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p)
|
||||||
|
|
||||||
if (p->name[0])
|
if (p->name[0])
|
||||||
duparg2("name", *argv);
|
duparg2("name", *argv);
|
||||||
strncpy(p->name, *argv, IFNAMSIZ - 1);
|
if (get_ifname(p->name, *argv))
|
||||||
|
invarg("\"name\" not a valid ifname", *argv);
|
||||||
if (cmd == SIOCCHGTUNNEL && count == 0) {
|
if (cmd == SIOCCHGTUNNEL && count == 0) {
|
||||||
struct ip_tunnel_parm old_p = {};
|
struct ip_tunnel_parm old_p = {};
|
||||||
|
|
||||||
|
|
@ -216,7 +217,7 @@ static int parse_args(int argc, char **argv, int cmd, struct ip_tunnel_parm *p)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (medium[0]) {
|
if (medium) {
|
||||||
p->link = ll_name_to_index(medium);
|
p->link = ll_name_to_index(medium);
|
||||||
if (p->link == 0) {
|
if (p->link == 0) {
|
||||||
fprintf(stderr, "Cannot find device \"%s\"\n", medium);
|
fprintf(stderr, "Cannot find device \"%s\"\n", medium);
|
||||||
|
|
@ -465,9 +466,8 @@ static int do_prl(int argc, char **argv)
|
||||||
{
|
{
|
||||||
struct ip_tunnel_prl p = {};
|
struct ip_tunnel_prl p = {};
|
||||||
int count = 0;
|
int count = 0;
|
||||||
int devname = 0;
|
|
||||||
int cmd = 0;
|
int cmd = 0;
|
||||||
char medium[IFNAMSIZ] = {};
|
const char *medium = NULL;
|
||||||
|
|
||||||
while (argc > 0) {
|
while (argc > 0) {
|
||||||
if (strcmp(*argv, "prl-default") == 0) {
|
if (strcmp(*argv, "prl-default") == 0) {
|
||||||
|
|
@ -488,8 +488,9 @@ static int do_prl(int argc, char **argv)
|
||||||
count++;
|
count++;
|
||||||
} else if (strcmp(*argv, "dev") == 0) {
|
} else if (strcmp(*argv, "dev") == 0) {
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
strncpy(medium, *argv, IFNAMSIZ-1);
|
if (check_ifname(*argv))
|
||||||
devname++;
|
invarg("\"dev\" not a valid ifname", *argv);
|
||||||
|
medium = *argv;
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Invalid PRL parameter \"%s\"\n", *argv);
|
"Invalid PRL parameter \"%s\"\n", *argv);
|
||||||
|
|
@ -502,7 +503,7 @@ static int do_prl(int argc, char **argv)
|
||||||
}
|
}
|
||||||
argc--; argv++;
|
argc--; argv++;
|
||||||
}
|
}
|
||||||
if (devname == 0) {
|
if (!medium) {
|
||||||
fprintf(stderr, "Must specify device\n");
|
fprintf(stderr, "Must specify device\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
@ -513,9 +514,8 @@ static int do_prl(int argc, char **argv)
|
||||||
static int do_6rd(int argc, char **argv)
|
static int do_6rd(int argc, char **argv)
|
||||||
{
|
{
|
||||||
struct ip_tunnel_6rd ip6rd = {};
|
struct ip_tunnel_6rd ip6rd = {};
|
||||||
int devname = 0;
|
|
||||||
int cmd = 0;
|
int cmd = 0;
|
||||||
char medium[IFNAMSIZ] = {};
|
const char *medium = NULL;
|
||||||
inet_prefix prefix;
|
inet_prefix prefix;
|
||||||
|
|
||||||
while (argc > 0) {
|
while (argc > 0) {
|
||||||
|
|
@ -537,8 +537,9 @@ static int do_6rd(int argc, char **argv)
|
||||||
cmd = SIOCDEL6RD;
|
cmd = SIOCDEL6RD;
|
||||||
} else if (strcmp(*argv, "dev") == 0) {
|
} else if (strcmp(*argv, "dev") == 0) {
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
strncpy(medium, *argv, IFNAMSIZ-1);
|
if (check_ifname(*argv))
|
||||||
devname++;
|
invarg("\"dev\" not a valid ifname", *argv);
|
||||||
|
medium = *argv;
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"Invalid 6RD parameter \"%s\"\n", *argv);
|
"Invalid 6RD parameter \"%s\"\n", *argv);
|
||||||
|
|
@ -546,7 +547,7 @@ static int do_6rd(int argc, char **argv)
|
||||||
}
|
}
|
||||||
argc--; argv++;
|
argc--; argv++;
|
||||||
}
|
}
|
||||||
if (devname == 0) {
|
if (!medium) {
|
||||||
fprintf(stderr, "Must specify device\n");
|
fprintf(stderr, "Must specify device\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -176,7 +176,8 @@ static int parse_args(int argc, char **argv,
|
||||||
ifr->ifr_flags |= IFF_MULTI_QUEUE;
|
ifr->ifr_flags |= IFF_MULTI_QUEUE;
|
||||||
} else if (matches(*argv, "dev") == 0) {
|
} else if (matches(*argv, "dev") == 0) {
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
strncpy(ifr->ifr_name, *argv, IFNAMSIZ-1);
|
if (get_ifname(ifr->ifr_name, *argv))
|
||||||
|
invarg("\"dev\" not a valid ifname", *argv);
|
||||||
} else {
|
} else {
|
||||||
if (matches(*argv, "name") == 0) {
|
if (matches(*argv, "name") == 0) {
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
|
|
@ -184,7 +185,8 @@ static int parse_args(int argc, char **argv,
|
||||||
usage();
|
usage();
|
||||||
if (ifr->ifr_name[0])
|
if (ifr->ifr_name[0])
|
||||||
duparg2("name", *argv);
|
duparg2("name", *argv);
|
||||||
strncpy(ifr->ifr_name, *argv, IFNAMSIZ);
|
if (get_ifname(ifr->ifr_name, *argv))
|
||||||
|
invarg("\"name\" not a valid ifname", *argv);
|
||||||
}
|
}
|
||||||
count++;
|
count++;
|
||||||
argc--; argv++;
|
argc--; argv++;
|
||||||
|
|
|
||||||
|
|
@ -539,7 +539,7 @@ static int xfrm_state_modify(int cmd, unsigned int flags, int argc, char **argv)
|
||||||
|
|
||||||
xfrm_algo_parse((void *)&alg, type, name, key,
|
xfrm_algo_parse((void *)&alg, type, name, key,
|
||||||
buf, sizeof(alg.buf));
|
buf, sizeof(alg.buf));
|
||||||
len += alg.u.alg.alg_key_len;
|
len += alg.u.alg.alg_key_len / 8;
|
||||||
|
|
||||||
addattr_l(&req.n, sizeof(req.buf), type,
|
addattr_l(&req.n, sizeof(req.buf), type,
|
||||||
(void *)&alg, len);
|
(void *)&alg, len);
|
||||||
|
|
|
||||||
29
lib/utils.c
29
lib/utils.c
|
|
@ -20,6 +20,7 @@
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
#include <netdb.h>
|
#include <netdb.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
#include <asm/types.h>
|
#include <asm/types.h>
|
||||||
|
|
@ -699,6 +700,34 @@ void duparg2(const char *key, const char *arg)
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int check_ifname(const char *name)
|
||||||
|
{
|
||||||
|
/* These checks mimic kernel checks in dev_valid_name */
|
||||||
|
if (*name == '\0')
|
||||||
|
return -1;
|
||||||
|
if (strlen(name) >= IFNAMSIZ)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
while (*name) {
|
||||||
|
if (*name == '/' || isspace(*name))
|
||||||
|
return -1;
|
||||||
|
++name;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* buf is assumed to be IFNAMSIZ */
|
||||||
|
int get_ifname(char *buf, const char *name)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = check_ifname(name);
|
||||||
|
if (ret == 0)
|
||||||
|
strncpy(buf, name, IFNAMSIZ);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
int matches(const char *cmd, const char *pattern)
|
int matches(const char *cmd, const char *pattern)
|
||||||
{
|
{
|
||||||
int len = strlen(cmd);
|
int len = strlen(cmd);
|
||||||
|
|
|
||||||
|
|
@ -664,7 +664,8 @@ int main(int argc, char **argv)
|
||||||
struct ifreq ifr = {};
|
struct ifreq ifr = {};
|
||||||
|
|
||||||
for (i = 0; i < ifnum; i++) {
|
for (i = 0; i < ifnum; i++) {
|
||||||
strncpy(ifr.ifr_name, ifnames[i], IFNAMSIZ);
|
if (get_ifname(ifr.ifr_name, ifnames[i]))
|
||||||
|
invarg("not a valid ifname", ifnames[i]);
|
||||||
if (ioctl(udp_sock, SIOCGIFINDEX, &ifr)) {
|
if (ioctl(udp_sock, SIOCGIFINDEX, &ifr)) {
|
||||||
perror("ioctl(SIOCGIFINDEX)");
|
perror("ioctl(SIOCGIFINDEX)");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
|
|
|
||||||
|
|
@ -634,11 +634,10 @@ static int flower_parse_opt(struct filter_util *qu, char *handle,
|
||||||
} else if (matches(*argv, "skip_sw") == 0) {
|
} else if (matches(*argv, "skip_sw") == 0) {
|
||||||
flags |= TCA_CLS_FLAGS_SKIP_SW;
|
flags |= TCA_CLS_FLAGS_SKIP_SW;
|
||||||
} else if (matches(*argv, "indev") == 0) {
|
} else if (matches(*argv, "indev") == 0) {
|
||||||
char ifname[IFNAMSIZ] = {};
|
|
||||||
|
|
||||||
NEXT_ARG();
|
NEXT_ARG();
|
||||||
strncpy(ifname, *argv, sizeof(ifname) - 1);
|
if (check_ifname(*argv))
|
||||||
addattrstrz(n, MAX_MSG, TCA_FLOWER_INDEV, ifname);
|
invarg("\"indev\" not a valid ifname", *argv);
|
||||||
|
addattrstrz(n, MAX_MSG, TCA_FLOWER_INDEV, *argv);
|
||||||
} else if (matches(*argv, "vlan_id") == 0) {
|
} else if (matches(*argv, "vlan_id") == 0) {
|
||||||
__u16 vid;
|
__u16 vid;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -385,8 +385,7 @@ static int parse_ip6_addr(int *argc_p, char ***argv_p,
|
||||||
|
|
||||||
plen = addr.bitlen;
|
plen = addr.bitlen;
|
||||||
for (i = 0; i < plen; i += 32) {
|
for (i = 0; i < plen; i += 32) {
|
||||||
/* if (((i + 31) & ~0x1F) <= plen) { */
|
if (i + 31 < plen) {
|
||||||
if (i + 31 <= plen) {
|
|
||||||
res = pack_key(sel, addr.data[i / 32],
|
res = pack_key(sel, addr.data[i / 32],
|
||||||
0xFFFFFFFF, off + 4 * (i / 32), offmask);
|
0xFFFFFFFF, off + 4 * (i / 32), offmask);
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue