]> The Tcpdump Group git mirrors - libpcap/commitdiff
Factor port_pq_to_ipproto() out.
authorDenis Ovsienko <[email protected]>
Fri, 21 Mar 2025 16:07:07 +0000 (16:07 +0000)
committerDenis Ovsienko <[email protected]>
Sat, 22 Mar 2025 17:20:21 +0000 (17:20 +0000)
Replace four validation/mapping blocks with a function and one
parametrised message.

gencode.c

index be32973a013177de29437c42bbb830b74f72be49..75610662e2c84410d7f13b728b1a1ee2b376bef9 100644 (file)
--- a/gencode.c
+++ b/gencode.c
@@ -1059,6 +1059,23 @@ assert_maxval(compiler_state_t *cstate, const char *name,
 #define ERRSTR_802_11_ONLY_KW "'%s' is valid for 802.11 syntax only"
 #define ERRSTR_INVALID_QUAL "'%s' is not a valid qualifier for '%s'"
 
+// Validate a port/portrange proto qualifier and map to an IP protocol number.
+static int
+port_pq_to_ipproto(compiler_state_t *cstate, const int proto, const char *kw)
+{
+       switch (proto) {
+       case Q_UDP:
+               return IPPROTO_UDP;
+       case Q_TCP:
+               return IPPROTO_TCP;
+       case Q_SCTP:
+               return IPPROTO_SCTP;
+       case Q_DEFAULT:
+               return PROTO_UNDEF;
+       }
+       bpf_error(cstate, ERRSTR_INVALID_QUAL, pqkw(proto), kw);
+}
+
 int
 pcap_compile(pcap_t *p, struct bpf_program *program,
             const char *buf, int optimize, bpf_u_int32 mask)
@@ -7036,9 +7053,7 @@ gen_scode(compiler_state_t *cstate, const char *name, struct qual q)
                }
 
        case Q_PORT:
-               if (proto != Q_DEFAULT &&
-                   proto != Q_UDP && proto != Q_TCP && proto != Q_SCTP)
-                       bpf_error(cstate, "illegal qualifier of 'port'");
+               (void)port_pq_to_ipproto(cstate, proto, "port"); // validate only
                if (pcap_nametoport(name, &port, &real_proto) == 0)
                        bpf_error(cstate, "unknown port '%s'", name);
                if (proto == Q_UDP) {
@@ -7079,9 +7094,7 @@ gen_scode(compiler_state_t *cstate, const char *name, struct qual q)
                return b;
 
        case Q_PORTRANGE:
-               if (proto != Q_DEFAULT &&
-                   proto != Q_UDP && proto != Q_TCP && proto != Q_SCTP)
-                       bpf_error(cstate, "illegal qualifier of 'portrange'");
+               (void)port_pq_to_ipproto(cstate, proto, "portrange"); // validate only
                stringtoportrange(cstate, name, &port1, &port2, &real_proto);
                if (proto == Q_UDP) {
                        if (real_proto == IPPROTO_TCP)
@@ -7294,16 +7307,7 @@ gen_ncode(compiler_state_t *cstate, const char *s, bpf_u_int32 v, struct qual q)
                }
 
        case Q_PORT:
-               if (proto == Q_UDP)
-                       proto = IPPROTO_UDP;
-               else if (proto == Q_TCP)
-                       proto = IPPROTO_TCP;
-               else if (proto == Q_SCTP)
-                       proto = IPPROTO_SCTP;
-               else if (proto == Q_DEFAULT)
-                       proto = PROTO_UNDEF;
-               else
-                       bpf_error(cstate, "illegal qualifier of 'port'");
+               proto = port_pq_to_ipproto(cstate, proto, "port");
 
                if (v > 65535)
                        bpf_error(cstate, "illegal port number %u > 65535", v);
@@ -7316,16 +7320,7 @@ gen_ncode(compiler_state_t *cstate, const char *s, bpf_u_int32 v, struct qual q)
            }
 
        case Q_PORTRANGE:
-               if (proto == Q_UDP)
-                       proto = IPPROTO_UDP;
-               else if (proto == Q_TCP)
-                       proto = IPPROTO_TCP;
-               else if (proto == Q_SCTP)
-                       proto = IPPROTO_SCTP;
-               else if (proto == Q_DEFAULT)
-                       proto = PROTO_UNDEF;
-               else
-                       bpf_error(cstate, "illegal qualifier of 'portrange'");
+               proto = port_pq_to_ipproto(cstate, proto, "portrange");
 
                if (v > 65535)
                        bpf_error(cstate, "illegal port number %u > 65535", v);