Bug 217620 - ipfw flow specification parsing
Summary: ipfw flow specification parsing
Status: Closed FIXED
Alias: None
Product: Base System
Classification: Unclassified
Component: bin (show other bugs)
Version: 11.0-STABLE
Hardware: Any Any
: --- Affects Only Me
Assignee: Andrey V. Elsukov
URL:
Keywords: patch
Depends on:
Blocks:
 
Reported: 2017-03-07 21:39 UTC by lutz
Modified: 2017-05-24 09:05 UTC (History)
2 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description lutz 2017-03-07 21:39:19 UTC
Parsing of port-numbers explicitly set to "0" does not work.
BTW: The whole code is broken for parsing named ports.

How to repeat:
root@server:~ # ipfw table test create type flow:src-ip,src-port,dst-ip,dst-port,proto
root@server:~ # ipfw table all info
--- table(test), set(0) ---
 kindex: 1, type: flow:src-ip,proto,src-port,dst-ip,dst-port
 references: 0, valtype: legacy
 algorithm: flow:hash
 items: 0, size: 296
root@server:~ # ipfw table test add 0.0.0.0,0,0,0.0.0.0,0
ipfw: Unknown service: 0

After the patch:
root@server:~ # ipfw table test add 0.0.0.0,0,0,0.0.0.0,0
added: 0.0.0.0,0,0,0.0.0.0,0 0
root@server:~ # ipfw table test list
--- table(test), set(0) ---
0.0.0.0,0,0,0.0.0.0,0 0

--- sbin/ipfw/ipfw2.h   (revision 314807)
+++ sbin/ipfw/ipfw2.h   (working copy)
@@ -1236,12 +1269,11 @@
                        if ((p = strchr(arg, ',')) != NULL)
                                *p++ = '\0';

-                       if ((port = htons(strtol(arg, NULL, 10))) == 0) {
+                       port = htons(strtol(arg, &pp, 10));
+                       if(*pp != '\0') {
                                if ((sent = getservbyname(arg, NULL)) == NULL)
-                                       errx(EX_DATAERR, "Unknown service: %s",
-                                           arg);
-                               else
-                                       key = sent->s_port;
+                                       errx(EX_DATAERR, "Unknown service: %s", arg);
+                               port = sent->s_port;
                        }

                        tfe->sport = port;
@@ -1280,12 +1312,11 @@
                        if ((p = strchr(arg, ',')) != NULL)
                                *p++ = '\0';

-                       if ((port = htons(strtol(arg, NULL, 10))) == 0) {
+                       port = htons(strtol(arg, &pp, 10));
+                       if (*pp != '\0') {
                                if ((sent = getservbyname(arg, NULL)) == NULL)
-                                       errx(EX_DATAERR, "Unknown service: %s",
-                                           arg);
-                               else
-                                       key = sent->s_port;
+                                       errx(EX_DATAERR, "Unknown service: %s", arg);
+                               port = sent->s_port;
                        }

                        tfe->dport = port;
Comment 1 commit-hook freebsd_committer 2017-05-17 10:56:54 UTC
A commit references this bug:

Author: ae
Date: Wed May 17 10:56:22 UTC 2017
New revision: 318400
URL: https://svnweb.freebsd.org/changeset/base/318400

Log:
  Allow zero port specification in table entries with type flow.

  PR:		217620
  MFC after:	1 week

Changes:
  head/sbin/ipfw/tables.c
Comment 2 commit-hook freebsd_committer 2017-05-24 09:02:43 UTC
A commit references this bug:

Author: ae
Date: Wed May 24 09:01:55 UTC 2017
New revision: 318777
URL: https://svnweb.freebsd.org/changeset/base/318777

Log:
  MFC r318400:
    Allow zero port specification in table entries with type flow.

    PR:		217620

Changes:
_U  stable/11/
  stable/11/sbin/ipfw/tables.c