IPFilter with miniupnpd

Roy Marples <[email protected]> Thu, 03 Sep 2009 23:32:03 +0100
Newsgroups gmane.comp.security.firewalls.ipfilter
Message-ID <25950_1252017250_4AA04462_25950_5575_1_4AA043E3.1080106@marples.name>
Hi List!

I use stock IPFilter in NetBSD-5 with miniupnpd-20090820 [1].
It fails to work.

So I tried the tarball from Darrens blog [2].
This doesn't work either.

So I went back to miniupnpd-20090820 and cut this patch (attached).
This almost works - it adds and reports correctly. However, it won't 
delete filter rules.
The error it gives is ioctl(SIOCRMAFR): Device busy from line 441 in 
src/ipf/ipfrdr.c
According to my testing, it is trying to delete the correct rule.

So, what is wrong?

Thanks

Roy

[1] http://miniupnp.free.fr/files/
[2] http://blogs.sun.com/avalon/entry/upnp_daemon_for_solaris_ipfilter
miniupnpd.diff (text/plain, 788 B)
--- miniupnpd-20090820/ipf/ipfrdr.c	2008-08-24 20:54:57.000000000 +0100
+++ xxx/ipf/ipfrdr.c	2009-09-03 23:12:29.000000000 +0100
@@ -249,7 +249,7 @@
 			if (bytes != NULL)
 				*bytes = 0;
 			if (iport != NULL)
-				*iport = ipn.in_pnext;
+				*iport = ntohs(ipn.in_pnext);
 			inet_ntop(AF_INET, &ipn.in_in[0].in4, iaddr, iaddrlen);
 			return 0;
 		}
@@ -395,7 +395,7 @@
 	wobj.ipfo_size = sizeof(fio);
 	wobj.ipfo_ptr = &fio;
 
-	if (ioctl(dev, SIOCGETFS, &wobj) == -1) {
+	if (ioctl(dev_ipl, SIOCGETFS, &wobj) == -1) {
 		syslog(LOG_ERR, "ioctl(SIOCGETFS): %m");
 		goto error;
 	}
@@ -416,6 +416,7 @@
 	rule.iri_v = 4;
 #endif
 	rule.iri_rule = fp;
+	strlcpy(rule.iri_group, group_name, sizeof(rule.iri_group));
 
 	dobj.ipfo_rev = IPFILTER_VERSION;
 	dobj.ipfo_size = sizeof(*fp);