svn commit: r204717 - head/sbin/ipfw

Luigi Rizzo luigi at FreeBSD.org
Thu Mar 4 16:55:32 UTC 2010


Author: luigi
Date: Thu Mar  4 16:55:32 2010
New Revision: 204717
URL: http://svn.freebsd.org/changeset/base/204717

Log:
  fix handling of sets

Modified:
  head/sbin/ipfw/ipfw2.c

Modified: head/sbin/ipfw/ipfw2.c
==============================================================================
--- head/sbin/ipfw/ipfw2.c	Thu Mar  4 16:54:56 2010	(r204716)
+++ head/sbin/ipfw/ipfw2.c	Thu Mar  4 16:55:32 2010	(r204717)
@@ -1625,13 +1625,21 @@ ipfw_sets_handler(char *av[])
 	if (av[0] == NULL)
 		errx(EX_USAGE, "set needs command");
 	if (_substrcmp(*av, "show") == 0) {
-		void *data;
+		void *data = NULL;
 		char const *msg;
+		int nalloc;
 
-		nbytes = sizeof(struct ip_fw);
+		nalloc = nbytes = sizeof(struct ip_fw);
+		while (nbytes >= nalloc) {
+			if (data)
+				free(data);
+			nalloc = nalloc * 2 + 200;
+			nbytes = nalloc;
 		data = safe_calloc(1, nbytes);
 		if (do_cmd(IP_FW_GET, data, (uintptr_t)&nbytes) < 0)
 			err(EX_OSERR, "getsockopt(IP_FW_GET)");
+		}
+
 		bcopy(&((struct ip_fw *)data)->next_rule,
 			&set_disable, sizeof(set_disable));
 
@@ -1661,7 +1669,7 @@ ipfw_sets_handler(char *av[])
 		i = do_cmd(IP_FW_DEL, masks, sizeof(uint32_t));
 	} else if (_substrcmp(*av, "move") == 0) {
 		av++;
-		if (!av[0] && _substrcmp(*av, "rule") == 0) {
+		if (av[0] && _substrcmp(*av, "rule") == 0) {
 			cmd = 2;
 			av++;
 		} else
@@ -1685,7 +1693,7 @@ ipfw_sets_handler(char *av[])
 		av++;
 		masks[0] = masks[1] = 0;
 
-		while (!av[0]) {
+		while (av[0]) {
 			if (isdigit(**av)) {
 				i = atoi(*av);
 				if (i < 0 || i > RESVD_SET)


More information about the svn-src-head mailing list