ss: Make leading ":" always optional for sport and dport

The sport and dport conditions in expressions were inconsistent on
whether there should be a ":" at the beginning of the port when only a
port was provided depending on the family. The link and netlink
families required a ":" to work. The vsock family required the ":"
to be absent. The inet and inet6 families work with or without a leading
":".

This makes the leading ":" optional in all cases, so if sport or dport
are used, then it works with a leading ":" or without one, as inet and
inet6 did.

Signed-off-by: Thayne McCombs <astrothayne@gmail.com>
Signed-off-by: David Ahern <dsahern@kernel.org>
This commit is contained in:
Thayne McCombs 2021-02-14 01:09:13 -07:00 committed by David Ahern
parent 33e2471e8f
commit c7897ec2a6

View File

@ -2111,6 +2111,18 @@ static void vsock_set_inet_prefix(inet_prefix *a, __u32 cid)
memcpy(a->data, &cid, sizeof(cid)); memcpy(a->data, &cid, sizeof(cid));
} }
static char* find_port(char *addr, bool is_port)
{
char *port = NULL;
if (is_port)
port = addr;
else
port = strchr(addr, ':');
if (port && *port == ':')
*port++ = '\0';
return port;
}
void *parse_hostcond(char *addr, bool is_port) void *parse_hostcond(char *addr, bool is_port)
{ {
char *port = NULL; char *port = NULL;
@ -2152,17 +2164,16 @@ void *parse_hostcond(char *addr, bool is_port)
if (fam == AF_PACKET) { if (fam == AF_PACKET) {
a.addr.family = AF_PACKET; a.addr.family = AF_PACKET;
a.addr.bitlen = 0; a.addr.bitlen = 0;
port = strchr(addr, ':'); port = find_port(addr, is_port);
if (port) { if (port) {
*port = 0; if (*port && strcmp(port, "*")) {
if (port[1] && strcmp(port+1, "*")) { if (get_integer(&a.port, port, 0)) {
if (get_integer(&a.port, port+1, 0)) { if ((a.port = xll_name_to_index(port)) <= 0)
if ((a.port = xll_name_to_index(port+1)) <= 0)
return NULL; return NULL;
} }
} }
} }
if (addr[0] && strcmp(addr, "*")) { if (!is_port && addr[0] && strcmp(addr, "*")) {
unsigned short tmp; unsigned short tmp;
a.addr.bitlen = 32; a.addr.bitlen = 32;
@ -2176,19 +2187,18 @@ void *parse_hostcond(char *addr, bool is_port)
if (fam == AF_NETLINK) { if (fam == AF_NETLINK) {
a.addr.family = AF_NETLINK; a.addr.family = AF_NETLINK;
a.addr.bitlen = 0; a.addr.bitlen = 0;
port = strchr(addr, ':'); port = find_port(addr, is_port);
if (port) { if (port) {
*port = 0; if (*port && strcmp(port, "*")) {
if (port[1] && strcmp(port+1, "*")) { if (get_integer(&a.port, port, 0)) {
if (get_integer(&a.port, port+1, 0)) { if (strcmp(port, "kernel") == 0)
if (strcmp(port+1, "kernel") == 0)
a.port = 0; a.port = 0;
else else
return NULL; return NULL;
} }
} }
} }
if (addr[0] && strcmp(addr, "*")) { if (!is_port && addr[0] && strcmp(addr, "*")) {
a.addr.bitlen = 32; a.addr.bitlen = 32;
if (nl_proto_a2n(&a.addr.data[0], addr) == -1) if (nl_proto_a2n(&a.addr.data[0], addr) == -1)
return NULL; return NULL;
@ -2201,21 +2211,13 @@ void *parse_hostcond(char *addr, bool is_port)
a.addr.family = AF_VSOCK; a.addr.family = AF_VSOCK;
if (is_port) port = find_port(addr, is_port);
port = addr;
else {
port = strchr(addr, ':');
if (port) {
*port = '\0';
port++;
}
}
if (port && strcmp(port, "*") && if (port && strcmp(port, "*") &&
get_u32((__u32 *)&a.port, port, 0)) get_u32((__u32 *)&a.port, port, 0))
return NULL; return NULL;
if (addr[0] && strcmp(addr, "*")) { if (!is_port && addr[0] && strcmp(addr, "*")) {
a.addr.bitlen = 32; a.addr.bitlen = 32;
if (get_u32(&cid, addr, 0)) if (get_u32(&cid, addr, 0))
return NULL; return NULL;