lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAOMdWSL=n4Otp_sZ+KL-dHTSqUii2cgsdCeE8iGE8bdsZS1shA@mail.gmail.com>
Date:   Wed, 20 Sep 2017 12:20:08 +0530
From:   Allen <allen.lkml@...il.com>
To:     Andrew Lunn <andrew@...n.ch>
Cc:     linux-kernel@...r.kernel.org
Subject: Re: [PATCH 06/10] drivers:ethernet: return -ENOMEM on allocation failure.

> static int cas_alloc_rxds(struct cas *cp)
> {
>         int i;
>
>         for (i = 0; i < N_RX_DESC_RINGS; i++) {
>                 if (cas_alloc_rx_desc(cp, i) < 0) {
>                         cas_free_rxds(cp);
>                         return -1;
>                 }
>         }
>         return 0;
> }
>
> Again, your change is correct, but in the end the value is not used.
> And if you fix it at the cas_alloc_rxds level, you also need a fix at
> the next level up:
>
>         err = -ENOMEM;
>         if (cas_tx_tiny_alloc(cp) < 0)
>                 goto err_unlock;
>
>         /* alloc rx descriptors */
>         if (cas_alloc_rxds(cp) < 0)
>                 goto err_tx_tiny;
>
> again, the return value is discarded.

Andrew,

How about the below patch as a fix?

diff --git a/drivers/net/ethernet/sun/cassini.c
b/drivers/net/ethernet/sun/cassini.c
index 382993c..a88552c 100644
--- a/drivers/net/ethernet/sun/cassini.c
+++ b/drivers/net/ethernet/sun/cassini.c
@@ -3984,19 +3984,20 @@ static inline int cas_alloc_rx_desc(struct cas
*cp, int ring)
        size = RX_DESC_RINGN_SIZE(ring);
        for (i = 0; i < size; i++) {
                if ((page[i] = cas_page_alloc(cp, GFP_KERNEL)) == NULL)
-                       return -1;
+                       return -ENOMEM;
        }
        return 0;
 }

 static int cas_alloc_rxds(struct cas *cp)
 {
-       int i;
+       int i, ret;

        for (i = 0; i < N_RX_DESC_RINGS; i++) {
-               if (cas_alloc_rx_desc(cp, i) < 0) {
+               ret = cas_alloc_rx_desc(cp, i);
+               if (ret < 0) {
                        cas_free_rxds(cp);
-                       return -1;
+                       return ret;
                }
        }
        return 0;
@@ -4241,7 +4242,7 @@ static int cas_tx_tiny_alloc(struct cas *cp)
 static int cas_open(struct net_device *dev)
 {
        struct cas *cp = netdev_priv(dev);
-       int hw_was_up, err;
+       int hw_was_up;
        unsigned long flags;

        mutex_lock(&cp->pm_mutex);
@@ -4264,7 +4265,6 @@ static int cas_open(struct net_device *dev)
                cas_unlock_all_restore(cp, flags);
        }

-       err = -ENOMEM;
        if (cas_tx_tiny_alloc(cp) < 0)
                goto err_unlock;

@@ -4309,7 +4309,7 @@ static int cas_open(struct net_device *dev)
        cas_tx_tiny_free(cp);
 err_unlock:
        mutex_unlock(&cp->pm_mutex);
-       return err;
+       return -ENOMEM;
 }

 static int cas_close(struct net_device *dev)

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ