Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=fb74a8416022c033e1a950689c264c453f8f98d8
Commit:     fb74a8416022c033e1a950689c264c453f8f98d8
Parent:     24a1dec55073000264f2da6278baef759929a14f
Author:     Patrick McHardy <[EMAIL PROTECTED]>
AuthorDate: Tue Jan 30 14:24:29 2007 -0800
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Tue Jan 30 14:24:29 2007 -0800

    [NETFILTER]: xt_connbytes: fix division by zero
    
    When the packet counter of a connection is zero a division by zero
    occurs in div64_64(). Fix that by using zero as average value, which
    is correct as long as the packet counter didn't overflow, at which
    point we have lost anyway.
    
    Additionally we're probably going to go back to 64 bit counters
    in 2.6.21.
    
    Based on patch from Jonas Berlin <[EMAIL PROTECTED]>,
    with suggestions from KOVACS Krisztian <[EMAIL PROTECTED]>.
    
    Signed-off-by: Patrick McHardy <[EMAIL PROTECTED]>
    Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
---
 net/netfilter/xt_connbytes.c |   29 ++++++++++++-----------------
 1 files changed, 12 insertions(+), 17 deletions(-)

diff --git a/net/netfilter/xt_connbytes.c b/net/netfilter/xt_connbytes.c
index d93cb09..5e32dfa 100644
--- a/net/netfilter/xt_connbytes.c
+++ b/net/netfilter/xt_connbytes.c
@@ -52,6 +52,8 @@ match(const struct sk_buff *skb,
 {
        const struct xt_connbytes_info *sinfo = matchinfo;
        u_int64_t what = 0;     /* initialize to make gcc happy */
+       u_int64_t bytes = 0;
+       u_int64_t pkts = 0;
        const struct ip_conntrack_counter *counters;
 
        if (!(counters = nf_ct_get_counters(skb)))
@@ -89,29 +91,22 @@ match(const struct sk_buff *skb,
        case XT_CONNBYTES_AVGPKT:
                switch (sinfo->direction) {
                case XT_CONNBYTES_DIR_ORIGINAL:
-                       what = div64_64(counters[IP_CT_DIR_ORIGINAL].bytes,
-                                       counters[IP_CT_DIR_ORIGINAL].packets);
+                       bytes = counters[IP_CT_DIR_ORIGINAL].bytes;
+                       pkts  = counters[IP_CT_DIR_ORIGINAL].packets;
                        break;
                case XT_CONNBYTES_DIR_REPLY:
-                       what = div64_64(counters[IP_CT_DIR_REPLY].bytes,
-                                       counters[IP_CT_DIR_REPLY].packets);
+                       bytes = counters[IP_CT_DIR_REPLY].bytes;
+                       pkts  = counters[IP_CT_DIR_REPLY].packets;
                        break;
                case XT_CONNBYTES_DIR_BOTH:
-                       {
-                               u_int64_t bytes;
-                               u_int64_t pkts;
-                               bytes = counters[IP_CT_DIR_ORIGINAL].bytes +
-                                       counters[IP_CT_DIR_REPLY].bytes;
-                               pkts = counters[IP_CT_DIR_ORIGINAL].packets+
-                                       counters[IP_CT_DIR_REPLY].packets;
-
-                               /* FIXME_THEORETICAL: what to do if sum
-                                * overflows ? */
-
-                               what = div64_64(bytes, pkts);
-                       }
+                       bytes = counters[IP_CT_DIR_ORIGINAL].bytes +
+                               counters[IP_CT_DIR_REPLY].bytes;
+                       pkts  = counters[IP_CT_DIR_ORIGINAL].packets +
+                               counters[IP_CT_DIR_REPLY].packets;
                        break;
                }
+               if (pkts != 0)
+                       what = div64_64(bytes, pkts);
                break;
        }
 
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to