Gleb Smirnoff wrote:
>   Alexander, Andrey,
> 
>   see a couple of comments below please.
...
> A> +  if (m->m_len < sizeof(struct ip) &&
> A> +      (m = m_pullup(m, sizeof(struct ip))) == NULL)
> A> +          return (EINVAL);
> 
> In most cases we return ENOBUFS in case if m_pullup() failure. Lesser amount
> of code uses ENOMEM and EINVAL. I personally hate EINVAL, since it is usually
> used as one-for-all error, and thus is meaningless for user.
Understood. So can we use more descriptive ENOENT in code below?

        tag = m_tag_locate(m, MTAG_IPFW_RULE, 0, NULL);
        if (tag == NULL) {
                NG_FREE_M(m);
                return (EINVAL);        /* XXX: find smth better */
        };


> 
> A> +  ip = mtod(m, struct ip *);
> A> +
....
> A> +          default:
> A>                    return (EINVAL);
> 
> Shouldn't you free the mbuf before returning?
Ups.

Please see an attached patch





Index: sys/netgraph/ng_ipfw.c
===================================================================
--- sys/netgraph/ng_ipfw.c      (revision 226165)
+++ sys/netgraph/ng_ipfw.c      (working copy)
@@ -242,7 +242,7 @@ ng_ipfw_rcvdata(hook_p hook, item_p item)
 
        if (m->m_len < sizeof(struct ip) &&
            (m = m_pullup(m, sizeof(struct ip))) == NULL)
-               return (EINVAL);
+               return (ENOBUFS);
 
        ip = mtod(m, struct ip *);
 
@@ -252,18 +252,14 @@ ng_ipfw_rcvdata(hook_p hook, item_p item)
 #ifdef INET
                case IPVERSION:
                        ip_input(m);
-                       break;
+                       return (0);
 #endif
 #ifdef INET6
                case IPV6_VERSION >> 4:
                        ip6_input(m);
-                       break;
+                       return (0);
 #endif
-               default:
-                       NG_FREE_M(m);
-                       return (EINVAL);
                }
-               return (0);
        } else {
                switch (ip->ip_v) {
 #ifdef INET
@@ -277,10 +273,12 @@ ng_ipfw_rcvdata(hook_p hook, item_p item)
                        return (ip6_output(m, NULL, NULL, 0, NULL,
                            NULL, NULL));
 #endif
-               default:
-                       return (EINVAL);
                }
        }
+
+       /* unknown IP protocol version */
+       NG_FREE_M(m);
+       return (EPROTONOSUPPORT);
 }
 
 static int

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to