Commit 03aef17bb79b ("devinet_ioctl(): take copyin/copyout to caller")
introduced a regression when using ifconfig. ifconfig doesn't show the
address anymore. The reason is that the above patch changed the flow in
devinet_ioctl(), where we break; and end up returning ret. ret however
is set to -EADDRNOTAVAIL, which later on prevents the copy_to_user() in
inet_ioctl().

Thus, when we break in devinet_ioctl() we have to set ret to 0 to
properly return out of devinet_ioctl.

Cc: Al Viro <v...@zeniv.linux.org.uk>
Cc: Christoph Hellwig <h...@lst.de>
Fixes: 03aef17bb79b ("devinet_ioctl(): take copyin/copyout to caller")
Signed-off-by: Christoph Paasch <cpaa...@apple.com>
---
 net/ipv4/devinet.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
index e056c0067f2c..942dbc73def0 100644
--- a/net/ipv4/devinet.c
+++ b/net/ipv4/devinet.c
@@ -1049,18 +1049,22 @@ int devinet_ioctl(struct net *net, unsigned int cmd, 
struct ifreq *ifr)
        switch (cmd) {
        case SIOCGIFADDR:       /* Get interface address */
                sin->sin_addr.s_addr = ifa->ifa_local;
+               ret = 0;
                break;
 
        case SIOCGIFBRDADDR:    /* Get the broadcast address */
                sin->sin_addr.s_addr = ifa->ifa_broadcast;
+               ret = 0;
                break;
 
        case SIOCGIFDSTADDR:    /* Get the destination address */
                sin->sin_addr.s_addr = ifa->ifa_address;
+               ret = 0;
                break;
 
        case SIOCGIFNETMASK:    /* Get the netmask for the interface */
                sin->sin_addr.s_addr = ifa->ifa_mask;
+               ret = 0;
                break;
 
        case SIOCSIFFLAGS:
-- 
2.16.1

Reply via email to