svn commit: r250759 - head/sbin/ipfw
Alexander V. Chernikov
melifaro at FreeBSD.org
Sat May 18 04:49:01 UTC 2013
Author: melifaro
Date: Sat May 18 04:49:00 2013
New Revision: 250759
URL: http://svnweb.freebsd.org/changeset/base/250759
Log:
Fix ipfw(8) sets of ipv6 addresses handling.
Conditionally use stack buffer instead of calling strdup().
PR: bin/104921
MFC after: 2 weeks
Modified:
head/sbin/ipfw/ipfw2.c
Modified: head/sbin/ipfw/ipfw2.c
==============================================================================
--- head/sbin/ipfw/ipfw2.c Fri May 17 23:14:18 2013 (r250758)
+++ head/sbin/ipfw/ipfw2.c Sat May 18 04:49:00 2013 (r250759)
@@ -2779,13 +2779,19 @@ static ipfw_insn *
add_src(ipfw_insn *cmd, char *av, u_char proto, int cblen)
{
struct in6_addr a;
- char *host, *ch;
+ char *host, *ch, buf[INET6_ADDRSTRLEN];
ipfw_insn *ret = NULL;
+ int len;
- if ((host = strdup(av)) == NULL)
- return NULL;
- if ((ch = strrchr(host, '/')) != NULL)
- *ch = '\0';
+ /* Copy first address in set if needed */
+ if ((ch = strpbrk(av, "/,")) != NULL) {
+ len = ch - av;
+ strlcpy(buf, av, sizeof(buf));
+ if (len < sizeof(buf))
+ buf[len] = '\0';
+ host = buf;
+ } else
+ host = av;
if (proto == IPPROTO_IPV6 || strcmp(av, "me6") == 0 ||
inet_pton(AF_INET6, host, &a) == 1)
@@ -2797,7 +2803,6 @@ add_src(ipfw_insn *cmd, char *av, u_char
if (ret == NULL && strcmp(av, "any") != 0)
ret = cmd;
- free(host);
return ret;
}
@@ -2805,13 +2810,19 @@ static ipfw_insn *
add_dst(ipfw_insn *cmd, char *av, u_char proto, int cblen)
{
struct in6_addr a;
- char *host, *ch;
+ char *host, *ch, buf[INET6_ADDRSTRLEN];
ipfw_insn *ret = NULL;
+ int len;
- if ((host = strdup(av)) == NULL)
- return NULL;
- if ((ch = strrchr(host, '/')) != NULL)
- *ch = '\0';
+ /* Copy first address in set if needed */
+ if ((ch = strpbrk(av, "/,")) != NULL) {
+ len = ch - av;
+ strlcpy(buf, av, sizeof(buf));
+ if (len < sizeof(buf))
+ buf[len] = '\0';
+ host = buf;
+ } else
+ host = av;
if (proto == IPPROTO_IPV6 || strcmp(av, "me6") == 0 ||
inet_pton(AF_INET6, host, &a) == 1)
@@ -2823,7 +2834,6 @@ add_dst(ipfw_insn *cmd, char *av, u_char
if (ret == NULL && strcmp(av, "any") != 0)
ret = cmd;
- free(host);
return ret;
}
More information about the svn-src-head
mailing list