Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F154306869
D50597.id160690.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D50597.id160690.diff
View Options
diff --git a/sbin/ipfw/nptv6.c b/sbin/ipfw/nptv6.c
--- a/sbin/ipfw/nptv6.c
+++ b/sbin/ipfw/nptv6.c
@@ -175,20 +175,6 @@
free(p);
}
-/* RFC 6296 Sec. 3.1 */
-static void
-nptv6_prefixlen_check(int len, int *plen)
-{
- if (len == 0)
- return;
-
- if (*plen == 0)
- *plen = len;
- else if (len != *plen)
- errx(EX_USAGE, "Prefix length mismatch (%d vs %d).",
- len, *plen);
-}
-
/*
* Creates new nptv6 instance
* ipfw nptv6 <NAME> create int_prefix <prefix> ext_prefix <prefix>
@@ -204,10 +190,9 @@
struct in6_addr mask;
ipfw_nptv6_cfg *cfg;
ipfw_obj_lheader *olh;
- int tcmd, flags, plen, iplen, eplen, pplen;
+ int tcmd, flags, iplen, eplen, pplen;
char *p;
- plen = 0;
iplen = 0;
eplen = 0;
pplen = 0;
@@ -224,7 +209,6 @@
case TOK_INTPREFIX:
NEED1("IPv6 prefix required");
nptv6_parse_prefix(*av, &cfg->internal, &iplen);
- nptv6_prefixlen_check(iplen, &pplen);
flags |= NPTV6_HAS_INTPREFIX;
ac--; av++;
break;
@@ -234,7 +218,6 @@
"Only one ext_prefix or ext_if allowed");
NEED1("IPv6 prefix required");
nptv6_parse_prefix(*av, &cfg->external, &eplen);
- nptv6_prefixlen_check(eplen, &pplen);
flags |= NPTV6_HAS_EXTPREFIX;
ac--; av++;
break;
@@ -252,20 +235,30 @@
break;
case TOK_PREFIXLEN:
NEED1("IPv6 prefix length required");
- plen = strtol(*av, &p, 10);
- if (*p != '\0' || plen < 8 || plen > 64)
+ pplen = strtol(*av, &p, 10);
+ if (*p != '\0' || pplen < 8 || pplen > 64)
errx(EX_USAGE, "wrong prefix length: %s", *av);
- nptv6_prefixlen_check(plen, &pplen);
flags |= NPTV6_HAS_PREFIXLEN;
ac--; av++;
break;
}
}
- if ((flags & NPTV6_HAS_PREFIXLEN) != NPTV6_HAS_PREFIXLEN && pplen != 0) {
+ /* RFC 6296 Sec. 3.1 */
+ if (pplen != 0) {
+ if ((eplen != 0 && eplen != pplen) || (iplen != 0 && iplen != pplen))
+ errx(EX_USAGE, "Prefix length mismatch.");
+ cfg->plen = pplen;
+ } else if (eplen != 0 || iplen != 0) {
+ if (eplen != 0 && iplen != 0 && eplen != iplen)
+ errx(EX_USAGE, "Prefix length mismatch.");
warnx("Use prefixlen instead");
+ cfg->plen = eplen ? eplen : iplen;
+ } else
+ errx(EX_USAGE, "Prefix length mismatch.");
+
+ if ((flags & NPTV6_HAS_PREFIXLEN) != NPTV6_HAS_PREFIXLEN && cfg->plen != 0)
flags |= NPTV6_HAS_PREFIXLEN;
- }
/* Check validness */
if ((flags & NPTV6_HAS_INTPREFIX) != NPTV6_HAS_INTPREFIX)
@@ -275,8 +268,6 @@
if ((flags & NPTV6_HAS_PREFIXLEN) != NPTV6_HAS_PREFIXLEN)
errx(EX_USAGE, "prefixlen required");
- cfg->plen = pplen;
-
n2mask(&mask, cfg->plen);
APPLY_MASK(&cfg->internal, &mask);
if ((cfg->flags & NPTV6_DYNAMIC_PREFIX) == 0)
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Apr 28, 5:57 PM (15 h, 47 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
32296623
Default Alt Text
D50597.id160690.diff (2 KB)
Attached To
Mode
D50597: ipfw: prefixlen segfault bugfix in nptv6
Attached
Detach File
Event Timeline
Log In to Comment