Package: oidentd
Version: 2.0.7-3
Followup-For: Bug #266722

I created a patch to open /proc/net/ip_conntrack before dropping
permissions. It fixes this bug.

-- System Information:
Debian Release: testing/unstable
  APT prefers unstable
  APT policy: (500, 'unstable')
Architecture: i386 (i686)
Shell:  /bin/sh linked to /bin/dash
Kernel: Linux 2.6.9-rc2-paper
Locale: [EMAIL PROTECTED], [EMAIL PROTECTED] (charmap=UTF-8)

Versions of packages oidentd depends on:
ii  libc6                         2.3.5-8.1  GNU C Library: Shared libraries an

oidentd recommends no packages.

-- no debconf information
diff -ur oidentd-2.0.7-orig/AUTHORS oidentd-2.0.7/AUTHORS
--- oidentd-2.0.7-orig/AUTHORS  2003-02-12 03:15:55.000000000 +0100
+++ oidentd-2.0.7/AUTHORS       2006-01-26 16:36:09.000000000 +0100
@@ -1,5 +1,8 @@
+Christof Douma <[EMAIL PROTECTED]>
+    netfilter premissions fix
+
 Kamil Andrusz <[EMAIL PROTECTED]>
-       OpenBSD >= 3.0 Packet Filter support.
+    OpenBSD >= 3.0 Packet Filter support.
 
 Daniel Brafford <[EMAIL PROTECTED]>
     Initial IPv6 support, Initial IPv6 support on Linux.
diff -ur oidentd-2.0.7-orig/ChangeLog oidentd-2.0.7/ChangeLog
--- oidentd-2.0.7-orig/ChangeLog        2003-07-11 17:48:32.000000000 +0200
+++ oidentd-2.0.7/ChangeLog     2006-01-26 16:33:30.000000000 +0100
@@ -1,3 +1,7 @@
+Thu Jan 26 16:32:18 CET 2006    Christof Douma <[EMAIL PROTECTED]>
+
+    * Open masquerading options before dropping permissions on linux.
+
 Fri Jul 11 10:11:38 EDT 2003    Ryan McCabe <[EMAIL PROTECTED]>
 
     * Really fix the bug with random ident replies.
diff -ur oidentd-2.0.7-orig/src/kernel/darwin.c 
oidentd-2.0.7/src/kernel/darwin.c
--- oidentd-2.0.7-orig/src/kernel/darwin.c      2003-02-14 05:33:32.000000000 
+0100
+++ oidentd-2.0.7/src/kernel/darwin.c   2006-01-26 16:21:39.000000000 +0100
@@ -220,6 +220,13 @@
        return (temp_file);
 }
 
+/* System dependend initialisation. Call only once!
+ * On failure, return false.
+ */
+bool core_init() {
+       return true;
+}
+
 /*
 ** Return the UID of the connection owner
 */
diff -ur oidentd-2.0.7-orig/src/kernel/freebsd4.c 
oidentd-2.0.7/src/kernel/freebsd4.c
--- oidentd-2.0.7-orig/src/kernel/freebsd4.c    2003-02-12 08:26:25.000000000 
+0100
+++ oidentd-2.0.7/src/kernel/freebsd4.c 2006-01-26 16:22:13.000000000 +0100
@@ -48,6 +48,13 @@
 #include <oidentd_inet_util.h>
 #include <oidentd_options.h>
 
+/* System dependend initialisation. Call only once!
+ * On failure, return false.
+ */
+bool core_init() {
+       return true;
+}
+
 extern struct sockaddr_storage proxy;
 
 int get_user4( in_port_t lport,
diff -ur oidentd-2.0.7-orig/src/kernel/freebsd5.c 
oidentd-2.0.7/src/kernel/freebsd5.c
--- oidentd-2.0.7-orig/src/kernel/freebsd5.c    2003-02-12 03:15:59.000000000 
+0100
+++ oidentd-2.0.7/src/kernel/freebsd5.c 2006-01-26 16:22:33.000000000 +0100
@@ -245,6 +245,13 @@
 
 #endif
 
+/* System dependend initialisation. Call only once!
+ * On failure, return false.
+ */
+bool core_init() {
+       return true;
+}
+
 /*
 ** Return the UID of the connection owner
 */
diff -ur oidentd-2.0.7-orig/src/kernel/freebsd.c 
oidentd-2.0.7/src/kernel/freebsd.c
--- oidentd-2.0.7-orig/src/kernel/freebsd.c     2003-02-12 03:15:59.000000000 
+0100
+++ oidentd-2.0.7/src/kernel/freebsd.c  2006-01-26 16:22:40.000000000 +0100
@@ -244,6 +244,13 @@
 
 #endif
 
+/* System dependend initialisation. Call only once!
+ * On failure, return false.
+ */
+bool core_init() {
+       return true;
+}
+
 /*
 ** Return the UID of the connection owner
 */
diff -ur oidentd-2.0.7-orig/src/kernel/linux.c oidentd-2.0.7/src/kernel/linux.c
--- oidentd-2.0.7-orig/src/kernel/linux.c       2006-01-26 15:37:07.000000000 
+0100
+++ oidentd-2.0.7/src/kernel/linux.c    2006-01-26 16:49:11.000000000 +0100
@@ -56,6 +56,39 @@
                                                        in_port_t src_port,
                                                        in_port_t dst_port);
 
+#ifdef MASQ_SUPPORT
+FILE *masq_fp;
+bool netfilter;
+#endif
+
+/* System dependend initialisation. Call only once!
+ * On failure, return false.
+ * - open connection tracking file before dropping permissions
+ */
+bool core_init() {
+#ifdef MASQ_SUPPORT
+       masq_fp = fopen(MASQFILE, "r");
+       if (masq_fp == NULL) {
+               if (errno != ENOENT)
+                       debug("fopen: %s: %s", MASQFILE, strerror(errno));
+
+               masq_fp = fopen(CONNTRACK, "r");
+               if (masq_fp == NULL) {
+                       if (errno != ENOENT)
+                               debug("fopen: %s: %s", CONNTRACK, 
strerror(errno));
+                       return false; //return true to allow operation without 
masquerade support
+               }
+
+               netfilter = true;
+       } else {
+               netfilter = false;
+       }
+#endif
+
+       return true;
+}
+
+
 #ifdef WANT_IPV6
 
 /*
@@ -247,9 +280,7 @@
                        struct sockaddr_storage *laddr,
                        struct sockaddr_storage *faddr)
 {
-       FILE *fp;
        char buf[2048];
-       bool netfilter;
 
        /* laddr is unneeded on Linux */
        (void) laddr;
@@ -264,27 +295,19 @@
        lport = ntohs(lport);
        fport = ntohs(fport);
 
-       fp = fopen(MASQFILE, "r");
-       if (fp == NULL) {
-               if (errno != ENOENT)
-                       debug("fopen: %s: %s", MASQFILE, strerror(errno));
-
-               fp = fopen(CONNTRACK, "r");
-               if (fp == NULL) {
-                       if (errno != ENOENT)
-                               debug("fopen: %s: %s", CONNTRACK, 
strerror(errno));
-                       return (-1);
-               }
+       //masq support failed to initialize
+       if(masq_fp == NULL)
+               return (-1);
 
-               netfilter = true;
-       } else {
-               netfilter = false;
+       //rewind fp to read new contents
+       rewind(masq_fp);
 
+       if(! netfilter) {
                /* Eat the header line. */
-               fgets(buf, sizeof(buf), fp);
+               fgets(buf, sizeof(buf), masq_fp);
        }
 
-       while (fgets(buf, sizeof(buf), fp)) {
+       while (fgets(buf, sizeof(buf), masq_fp)) {
                char os[24];
                char proto[16];
                in_port_t mport;
@@ -298,7 +321,7 @@
                struct sockaddr_storage ss;
                int ret;
 
-               if (netfilter == false) {
+               if (! netfilter) {
                        u_int32_t mport_temp;
                        u_int32_t masq_lport_temp;
                        u_int32_t masq_fport_temp;
@@ -401,11 +424,9 @@
                }
        }
 
-       fclose(fp);
        return (-1);
 
 out_success:
-       fclose(fp);
        return (0);
 }
 
diff -ur oidentd-2.0.7-orig/src/kernel/netbsd.c 
oidentd-2.0.7/src/kernel/netbsd.c
--- oidentd-2.0.7-orig/src/kernel/netbsd.c      2003-02-12 03:15:59.000000000 
+0100
+++ oidentd-2.0.7/src/kernel/netbsd.c   2006-01-26 16:22:59.000000000 +0100
@@ -191,6 +191,13 @@
        return (NULL);
 }
 
+/* System dependend initialisation. Call only once!
+ * On failure, return false.
+ */
+bool core_init() {
+       return true;
+}
+
 /*
 ** Return the UID of the connection owner
 */
diff -ur oidentd-2.0.7-orig/src/kernel/openbsd24.c 
oidentd-2.0.7/src/kernel/openbsd24.c
--- oidentd-2.0.7-orig/src/kernel/openbsd24.c   2003-02-12 08:26:25.000000000 
+0100
+++ oidentd-2.0.7/src/kernel/openbsd24.c        2006-01-26 16:23:07.000000000 
+0100
@@ -38,6 +38,13 @@
 #include <oidentd_inet_util.h>
 #include <oidentd_options.h>
 
+/* System dependend initialisation. Call only once!
+ * On failure, return false.
+ */
+bool core_init() {
+       return true;
+}
+
 extern struct sockaddr_storage proxy;
 
 /*
diff -ur oidentd-2.0.7-orig/src/kernel/openbsd29.c 
oidentd-2.0.7/src/kernel/openbsd29.c
--- oidentd-2.0.7-orig/src/kernel/openbsd29.c   2003-02-12 08:26:25.000000000 
+0100
+++ oidentd-2.0.7/src/kernel/openbsd29.c        2006-01-26 16:23:44.000000000 
+0100
@@ -44,6 +44,13 @@
 #include <oidentd_inet_util.h>
 #include <oidentd_options.h>
 
+/* System dependend initialisation. Call only once!
+ * On failure, return false.
+ */
+bool core_init() {
+       return true;
+}
+
 extern struct sockaddr_storage proxy;
 
 /*
diff -ur oidentd-2.0.7-orig/src/kernel/openbsd30.c 
oidentd-2.0.7/src/kernel/openbsd30.c
--- oidentd-2.0.7-orig/src/kernel/openbsd30.c   2003-02-12 08:15:16.000000000 
+0100
+++ oidentd-2.0.7/src/kernel/openbsd30.c        2006-01-26 16:23:50.000000000 
+0100
@@ -54,6 +54,13 @@
 #include <oidentd_masq.h>
 #include <oidentd_options.h>
 
+/* System dependend initialisation. Call only once!
+ * On failure, return false.
+ */
+bool core_init() {
+       return true;
+}
+
 extern struct sockaddr_storage proxy;
 
 /*
diff -ur oidentd-2.0.7-orig/src/kernel/openbsd.c 
oidentd-2.0.7/src/kernel/openbsd.c
--- oidentd-2.0.7-orig/src/kernel/openbsd.c     2003-02-12 03:15:59.000000000 
+0100
+++ oidentd-2.0.7/src/kernel/openbsd.c  2006-01-26 16:24:00.000000000 +0100
@@ -180,6 +180,13 @@
        return (NULL);
 }
 
+/* System dependend initialisation. Call only once!
+ * On failure, return false.
+ */
+bool core_init() {
+       return true;
+}
+
 /*
 ** Return the UID of the connection owner
 */
diff -ur oidentd-2.0.7-orig/src/kernel/solaris4.c 
oidentd-2.0.7/src/kernel/solaris4.c
--- oidentd-2.0.7-orig/src/kernel/solaris4.c    2003-02-12 03:15:59.000000000 
+0100
+++ oidentd-2.0.7/src/kernel/solaris4.c 2006-01-26 16:24:16.000000000 +0100
@@ -162,6 +162,13 @@
 }
 
 
+/* System dependend initialisation. Call only once!
+ * On failure, return false.
+ */
+bool core_init() {
+       return true;
+}
+
 /*
 ** Return the UID of the connection owner
 */
diff -ur oidentd-2.0.7-orig/src/kernel/solaris5.c 
oidentd-2.0.7/src/kernel/solaris5.c
--- oidentd-2.0.7-orig/src/kernel/solaris5.c    2003-02-12 03:15:59.000000000 
+0100
+++ oidentd-2.0.7/src/kernel/solaris5.c 2006-01-26 16:24:22.000000000 +0100
@@ -157,6 +157,13 @@
 }
 
 
+/* System dependend initialisation. Call only once!
+ * On failure, return false.
+ */
+bool core_init() {
+       return true;
+}
+
 /*
 ** Return the UID of the connection owner
 */
diff -ur oidentd-2.0.7-orig/src/kernel/solaris7.c 
oidentd-2.0.7/src/kernel/solaris7.c
--- oidentd-2.0.7-orig/src/kernel/solaris7.c    2003-04-24 02:49:53.000000000 
+0200
+++ oidentd-2.0.7/src/kernel/solaris7.c 2006-01-26 16:24:33.000000000 +0100
@@ -156,6 +156,13 @@
 }
 
 
+/* System dependend initialisation. Call only once!
+ * On failure, return false.
+ */
+bool core_init() {
+       return true;
+}
+
 /*
 ** Return the UID of the connection owner
 */
diff -ur oidentd-2.0.7-orig/src/kernel/solaris8.c 
oidentd-2.0.7/src/kernel/solaris8.c
--- oidentd-2.0.7-orig/src/kernel/solaris8.c    2003-02-12 03:15:59.000000000 
+0100
+++ oidentd-2.0.7/src/kernel/solaris8.c 2006-01-26 16:24:41.000000000 +0100
@@ -196,6 +196,13 @@
 }
 
 
+/* System dependend initialisation. Call only once!
+ * On failure, return false.
+ */
+bool core_init() {
+       return true;
+}
+
 /*
 ** Return the UID of the connection owner
 */
diff -ur oidentd-2.0.7-orig/src/oidentd.c oidentd-2.0.7/src/oidentd.c
--- oidentd-2.0.7-orig/src/oidentd.c    2003-04-24 02:03:54.000000000 +0200
+++ oidentd-2.0.7/src/oidentd.c 2006-01-26 16:27:57.000000000 +0100
@@ -87,6 +87,11 @@
                exit(-1);
        }
 
+       if(! core_init()) {
+               o_log(NORMAL, "Error initializing core"); //log some stupid 
message
+               exit(-1);
+       }
+
        if (random_seed() != 0) {
                o_log(NORMAL, "Error seeding random number generator");
                exit(-1);
diff -ur oidentd-2.0.7-orig/src/oidentd.h oidentd-2.0.7/src/oidentd.h
--- oidentd-2.0.7-orig/src/oidentd.h    2003-07-11 16:11:25.000000000 +0200
+++ oidentd-2.0.7/src/oidentd.h 2006-01-26 16:26:02.000000000 +0100
@@ -149,6 +149,8 @@
        #define ss_family __ss_family
 #endif
 
+bool core_init();
+
 int get_user4( in_port_t lport,
                                in_port_t fport,
                                struct sockaddr_storage *laddr,

Reply via email to