NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: bin/47101 (ipmon(8) alignment problem on 32-bit sparc)



>>> christos%zoulas.com@localhost (Christos Zoulas) wrote

> On Oct 25, 10:43pm, nakayama%NetBSD.org@localhost (Takeshi Nakayama) wrote:
> -- Subject: Re: bin/47101 (ipmon(8) alignment problem on 32-bit sparc)
> 
> | I backported your fixes[*] to the netbsd-6 branch as attached.  If
> | there are no objections, I will send a pullup request.
> | 
> | [*] http://mail-index.netbsd.org/source-changes/2012/10/21/msg038121.html
> |     http://mail-index.netbsd.org/source-changes/2012/10/22/msg038125.html
> |     http://mail-index.netbsd.org/source-changes/2012/10/22/msg038126.html
> 
> Go for it!

Ah, but I found these changes don't fix the issue.  Unaligned
buffers are still passed to print_ipflog(), print_natlog() and
print_statelog().

    http://nxr.netbsd.org/xref/src/external/bsd/ipf/dist/tools/ipmon.c#1016

We need something as below.

Index: ipmon.c
===================================================================
RCS file: /cvsroot/src/external/bsd/ipf/dist/tools/ipmon.c,v
retrieving revision 1.5
diff -u -d -r1.5 ipmon.c
--- ipmon.c     22 Oct 2012 04:35:17 -0000      1.5
+++ ipmon.c     25 Oct 2012 20:23:59 -0000
@@ -130,9 +130,9 @@
 static void    handlehup(int);
 static void    flushlogs(const char *, FILE *);
 static void    print_log(config_t *, logsource_t *, const void *, size_t);
-static void    print_ipflog(config_t *, const void *, size_t);
-static void    print_natlog(config_t *, const void *, size_t);
-static void    print_statelog(config_t *, const void *, size_t);
+static void    print_ipflog(config_t *, const void *, const iplog_t *);
+static void    print_natlog(config_t *, const void *, const iplog_t *);
+static void    print_statelog(config_t *, const void *, const iplog_t *);
 static int     read_log(int, size_t *, void *, size_t);
 static void    write_pid(const char *);
 static char    *icmpname(u_int, u_int);
@@ -649,20 +649,18 @@
 }
 
 static void
-print_natlog(config_t *conf, const void *buf, size_t blen)
+print_natlog(config_t *conf, const void *buf, const iplog_t *ipl)
 {
        static u_32_t seqnum = 0;
        int res, i, len, family;
        const struct natlog *nl;
        struct tm *tm;
-       const iplog_t *ipl;
        char *proto;
        int simple;
        char *t;
 
        t = line;
        simple = 0;
-       ipl = (const iplog_t *)buf;
        if (ipl->ipl_seqnum != seqnum) {
                if ((ipmonopts & IPMON_SYSLOG) != 0) {
                        syslog(LOG_WARNING,
@@ -678,7 +676,7 @@
        }
        seqnum = ipl->ipl_seqnum + ipl->ipl_count;
 
-       nl = (const struct natlog *)((const char *)ipl + sizeof(*ipl));
+       nl = (const struct natlog *)((const char *)buf + sizeof(*ipl));
        res = (ipmonopts & IPMON_RESOLVE) ? 1 : 0;
        tm = get_tm(ipl->ipl_sec);
        len = sizeof(line);
@@ -837,17 +835,15 @@
 
 
 static void
-print_statelog(config_t *conf, const void *buf, size_t blen)
+print_statelog(config_t *conf, const void *buf, const iplog_t *ipl)
 {
        static u_32_t seqnum = 0;
        int res, i, len, family;
        const struct ipslog *sl;
        char *t, *proto;
        struct tm *tm;
-       const iplog_t *ipl;
 
        t = line;
-       ipl = (const iplog_t *)buf;
        if (ipl->ipl_seqnum != seqnum) {
                if ((ipmonopts & IPMON_SYSLOG) != 0) {
                        syslog(LOG_WARNING,
@@ -863,7 +859,7 @@
        }
        seqnum = ipl->ipl_seqnum + ipl->ipl_count;
 
-       sl = (const struct ipslog *)((const char *)ipl + sizeof(*ipl));
+       sl = (const struct ipslog *)((const char *)buf + sizeof(*ipl));
        res = (ipmonopts & IPMON_RESOLVE) ? 1 : 0;
        tm = get_tm(ipl->ipl_sec);
        len = sizeof(line);
@@ -1013,16 +1009,16 @@
                switch (log->logtype) {
                case IPL_LOGIPF:
                        if (ipl.ipl_magic == IPL_MAGIC)
-                               print_ipflog(conf, buf, psize);
+                               print_ipflog(conf, buf, &ipl);
                        break;
                case IPL_LOGNAT:
                        if (ipl.ipl_magic == IPL_MAGIC_NAT)
-                               print_natlog(conf, buf, psize);
+                               print_natlog(conf, buf, &ipl);
                        break;
 
                case IPL_LOGSTATE:
                        if (ipl.ipl_magic == IPL_MAGIC_STATE)
-                               print_statelog(conf, buf, psize);
+                               print_statelog(conf, buf, &ipl);
                        break;
                }
 
@@ -1033,7 +1029,7 @@
 
 
 static void
-print_ipflog(config_t *conf, const  void *buf, size_t blen)
+print_ipflog(config_t *conf, const  void *buf, const iplog_t *ipl)
 {
        static u_32_t seqnum = 0;
        int i, f, lvl, res, len, off, plen, ipoff, defaction;
@@ -1045,7 +1041,6 @@
        u_32_t *s, *d;
        u_short hl, p;
        const ipflog_t *ipf;
-       const iplog_t *ipl;
        tcphdr_t *tp;
 #ifdef USE_INET6
        struct ip6_ext *ehp;
@@ -1054,7 +1049,6 @@
        int go;
 #endif
 
-       ipl = (const iplog_t *)buf;
        if (ipl->ipl_seqnum != seqnum) {
                if ((ipmonopts & IPMON_SYSLOG) != 0) {
                        syslog(LOG_WARNING,

-- Takeshi Nakayama


Home | Main Index | Thread Index | Old Index