Message ID | 20180129044807.46975-1-cpaasch@apple.com |
---|---|
State | Not Applicable, archived |
Delegated to: | David Miller |
Headers | show |
Series | devinet_ioctl(): Set ret to 0 when breaking out of the switch-case | expand |
On Sun, Jan 28, 2018 at 8:48 PM, Christoph Paasch <cpaasch@apple.com> wrote: > 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 <viro@zeniv.linux.org.uk> > Cc: Christoph Hellwig <hch@lst.de> > Fixes: 03aef17bb79b ("devinet_ioctl(): take copyin/copyout to caller") > Signed-off-by: Christoph Paasch <cpaasch@apple.com> > --- > net/ipv4/devinet.c | 4 ++++ > 1 file changed, 4 insertions(+) Oh, I hadn't seen that a fix was already posted this morning at https://patchwork.ozlabs.org/patch/866817/. You can disregard this patch here. Sorry for the noise. Christoph
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:
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 <viro@zeniv.linux.org.uk> Cc: Christoph Hellwig <hch@lst.de> Fixes: 03aef17bb79b ("devinet_ioctl(): take copyin/copyout to caller") Signed-off-by: Christoph Paasch <cpaasch@apple.com> --- net/ipv4/devinet.c | 4 ++++ 1 file changed, 4 insertions(+)