| Summary: | ipfw flow specification parsing | ||
|---|---|---|---|
| Product: | Base System | Reporter: | Lutz Donnerhacke <donner> |
| Component: | bin | Assignee: | Andrey V. Elsukov <ae> |
| Status: | Closed FIXED | ||
| Severity: | Affects Only Me | CC: | ae, donner |
| Priority: | --- | Keywords: | patch |
| Version: | 11.0-STABLE | ||
| Hardware: | Any | ||
| OS: | Any | ||
| See Also: | https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=219316 | ||
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 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 |
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;