Dispatch ipfw control to netisr0. To avoid possible dangling netmsg handler,
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Mon, 28 Jul 2008 15:07:28 +0000 (15:07 +0000)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Mon, 28 Jul 2008 15:07:28 +0000 (15:07 +0000)
create ip_fw2_glue.c, which will be built if inet is built.  IPFW_LOADED is
checked again after netmsg's handler is running, since ipfw unload netmsg may
be processed before this ipfw control netmsg.

sys/conf/files
sys/net/ipfw/ip_fw2.c
sys/net/ipfw/ip_fw2.h
sys/net/ipfw/ip_fw2_glue.c [new file with mode: 0644]
sys/netinet/raw_ip.c

index 7ca2320..ec4a4e3 100644 (file)
@@ -1,5 +1,5 @@
 # $FreeBSD: src/sys/conf/files,v 1.340.2.137 2003/06/04 17:10:30 sam Exp $
-# $DragonFly: src/sys/conf/files,v 1.228 2008/07/28 01:21:39 swildner Exp $
+# $DragonFly: src/sys/conf/files,v 1.229 2008/07/28 15:07:28 sephe Exp $
 #
 # The long compile-with and dependency lines are required because of
 # limitations in config: backslash-newline doesn't work in strings, and
@@ -1015,6 +1015,7 @@ net/dummynet/ip_dummynet.c        optional dummynet
 net/dummynet/ip_dummynet_glue.c        optional inet
 netinet/ip_flow.c              optional inet
 net/ipfw/ip_fw2.c              optional ipfirewall
+net/ipfw/ip_fw2_glue.c         optional inet
 netinet/ip_icmp.c              optional inet
 netinet/ip_input.c             optional inet
 netinet/ip_demux.c             optional inet
index 5911129..fd44ad6 100644 (file)
@@ -23,7 +23,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/netinet/ip_fw2.c,v 1.6.2.12 2003/04/08 10:42:32 maxim Exp $
- * $DragonFly: src/sys/net/ipfw/ip_fw2.c,v 1.47 2008/07/28 13:45:43 sephe Exp $
+ * $DragonFly: src/sys/net/ipfw/ip_fw2.c,v 1.48 2008/07/28 15:07:28 sephe Exp $
  */
 
 #define        DEB(x)
@@ -2738,16 +2738,6 @@ ipfw_ctl(struct sockopt *sopt)
        uint32_t *masks;
        size_t size;
 
-       /*
-        * Disallow modifications in really-really secure mode, but still allow
-        * the logging counters to be reset.
-        */
-       if (sopt->sopt_name == IP_FW_ADD ||
-           (sopt->sopt_dir == SOPT_SET && sopt->sopt_name != IP_FW_RESETLOG)) {
-               if (securelevel >= 3)
-                       return EPERM;
-       }
-
        error = 0;
 
        switch (sopt->sopt_name) {
index 8def52f..0250022 100644 (file)
@@ -23,7 +23,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/netinet/ip_fw2.h,v 1.1.2.2 2002/08/16 11:03:11 luigi Exp $
- * $DragonFly: src/sys/net/ipfw/ip_fw2.h,v 1.9 2008/07/28 13:45:43 sephe Exp $
+ * $DragonFly: src/sys/net/ipfw/ip_fw2.h,v 1.10 2008/07/28 15:07:28 sephe Exp $
  */
 
 #ifndef _IPFW2_H
@@ -368,6 +368,7 @@ struct ip_fw_args {
 /*
  * Function definitions.
  */
+int    ip_fw_sockopt(struct sockopt *);
 
 /* Firewall hooks */
 struct sockopt;
diff --git a/sys/net/ipfw/ip_fw2_glue.c b/sys/net/ipfw/ip_fw2_glue.c
new file mode 100644 (file)
index 0000000..480e2ab
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2008 The DragonFly Project.  All rights reserved.
+ * 
+ * This code is derived from software contributed to The DragonFly Project
+ * by Sepherosa Ziehau <sepherosa@gmail.com>
+ * 
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ * 3. Neither the name of The DragonFly Project nor the names of its
+ *    contributors may be used to endorse or promote products derived
+ *    from this software without specific, prior written permission.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * 
+ * $DragonFly: src/sys/net/ipfw/ip_fw2_glue.c,v 1.1 2008/07/28 15:07:28 sephe Exp $
+ */
+
+#include <sys/param.h>
+#include <sys/socketvar.h>
+
+#include <net/if.h>
+#include <net/netisr.h>
+#include <net/netmsg2.h>
+
+#include <netinet/in.h>
+
+#include <net/ipfw/ip_fw2.h>
+
+static void    ip_fw_sockopt_dispatch(struct netmsg *);
+
+int
+ip_fw_sockopt(struct sockopt *sopt)
+{
+       struct netmsg smsg;
+
+       /*
+        * Disallow modifications in really-really secure mode, but still allow
+        * the logging counters to be reset.
+        */
+       if (sopt->sopt_name == IP_FW_ADD ||
+           (sopt->sopt_dir == SOPT_SET && sopt->sopt_name != IP_FW_RESETLOG)) {
+               if (securelevel >= 3)
+                       return EPERM;
+       }
+
+       netmsg_init(&smsg, &curthread->td_msgport, 0, ip_fw_sockopt_dispatch);
+       smsg.nm_lmsg.u.ms_resultp = sopt;
+       return lwkt_domsg(cpu_portfn(0), &smsg.nm_lmsg, 0);
+}
+
+static void
+ip_fw_sockopt_dispatch(struct netmsg *nmsg)
+{
+       struct lwkt_msg *msg = &nmsg->nm_lmsg;
+       struct sockopt *sopt = msg->u.ms_resultp;
+       int error;
+
+       KKASSERT(mycpuid == 0);
+
+       if (IPFW_LOADED)
+               error = ip_fw_ctl_ptr(sopt);
+       else
+               error = ENOPROTOOPT;
+       lwkt_replymsg(msg, error);
+}
index d1d2f1c..68f3a01 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)raw_ip.c    8.7 (Berkeley) 5/15/95
  * $FreeBSD: src/sys/netinet/raw_ip.c,v 1.64.2.16 2003/08/24 08:24:38 hsu Exp $
- * $DragonFly: src/sys/netinet/raw_ip.c,v 1.31 2008/07/01 08:21:25 hasso Exp $
+ * $DragonFly: src/sys/netinet/raw_ip.c,v 1.32 2008/07/28 15:07:28 sephe Exp $
  */
 
 #include "opt_inet6.h"
@@ -336,7 +336,7 @@ rip_ctloutput(struct socket *so, struct sockopt *sopt)
                case IP_FW_ADD: /* ADD actually returns the body... */
                case IP_FW_GET:
                        if (IPFW_LOADED)
-                               error = ip_fw_ctl_ptr(sopt);
+                               error = ip_fw_sockopt(sopt);
                        else
                                error = ENOPROTOOPT;
                        break;