Message ID | 20180829140409.833488-1-arnd@arndb.de |
---|---|
State | New |
Headers | show |
Series | [net-next,1/5] pppoe: fix PPPOEIOCSFWD compat handling | expand |
On Wed, Aug 29, 2018 at 04:03:26PM +0200, Arnd Bergmann wrote: > Support for handling the PPPOEIOCSFWD ioctl in compat mode was added in > linux-2.5.69 along with hundreds of other commands, but was always broken > sincen only the structure is compatible, but the command number is not, > due to the size being sizeof(size_t), or at first sizeof(sizeof((struct > sockaddr_pppox)), which is different on 64-bit architectures. > And the implementation was broken until 2016 (see 29e73269aa4d ("pppoe: fix reference counting in PPPoE proxy")), and nobody ever noticed. I should probably have removed this ioctl entirely instead of fixing it. Clearly, it has never been used. If you think it's worth fixing (as opposed to dropping this ioctl or its compat mode), then, Acked-by: Guillaume Nault <g.nault@alphalink.fr>
On Thu, Aug 30, 2018 at 1:04 PM Guillaume Nault <g.nault@alphalink.fr> wrote: > > On Wed, Aug 29, 2018 at 04:03:26PM +0200, Arnd Bergmann wrote: > > Support for handling the PPPOEIOCSFWD ioctl in compat mode was added in > > linux-2.5.69 along with hundreds of other commands, but was always broken > > sincen only the structure is compatible, but the command number is not, > > due to the size being sizeof(size_t), or at first sizeof(sizeof((struct > > sockaddr_pppox)), which is different on 64-bit architectures. > > > And the implementation was broken until 2016 (see 29e73269aa4d ("pppoe: > fix reference counting in PPPoE proxy")), and nobody ever noticed. I > should probably have removed this ioctl entirely instead of fixing it. > Clearly, it has never been used. > > If you think it's worth fixing (as opposed to dropping this ioctl or > its compat mode), then, > Acked-by: Guillaume Nault <g.nault@alphalink.fr> I don't care much, but fixing it seems seems easier than coming up with a convincing rationale for dropping. I'll update the changelog text to include your additional background information though, unless someone else prefers to have it dropped. Arnd
On Thu, Aug 30, 2018 at 01:54:48PM +0200, Arnd Bergmann wrote: > On Thu, Aug 30, 2018 at 1:04 PM Guillaume Nault <g.nault@alphalink.fr> wrote: > > > > On Wed, Aug 29, 2018 at 04:03:26PM +0200, Arnd Bergmann wrote: > > > Support for handling the PPPOEIOCSFWD ioctl in compat mode was added in > > > linux-2.5.69 along with hundreds of other commands, but was always broken > > > sincen only the structure is compatible, but the command number is not, > > > due to the size being sizeof(size_t), or at first sizeof(sizeof((struct > > > sockaddr_pppox)), which is different on 64-bit architectures. > > > > > And the implementation was broken until 2016 (see 29e73269aa4d ("pppoe: > > fix reference counting in PPPoE proxy")), and nobody ever noticed. I > > should probably have removed this ioctl entirely instead of fixing it. > > Clearly, it has never been used. > > > > If you think it's worth fixing (as opposed to dropping this ioctl or > > its compat mode), then, > > Acked-by: Guillaume Nault <g.nault@alphalink.fr> > > I don't care much, but fixing it seems seems easier than coming > up with a convincing rationale for dropping. > > I'll update the changelog text to include your additional background > information though, unless someone else prefers to have it dropped. > Sounds good. Thanks.
diff --git a/drivers/net/ppp/pppoe.c b/drivers/net/ppp/pppoe.c index ce61231e96ea..d1c3f9292c54 100644 --- a/drivers/net/ppp/pppoe.c +++ b/drivers/net/ppp/pppoe.c @@ -57,6 +57,7 @@ * */ +#include <linux/compat.h> #include <linux/string.h> #include <linux/module.h> #include <linux/kernel.h> @@ -780,6 +781,9 @@ static int pppoe_ioctl(struct socket *sock, unsigned int cmd, err = 0; break; +#ifdef CONFIG_COMPAT + case PPPOEIOCSFWD32: +#endif case PPPOEIOCSFWD: { struct pppox_sock *relay_po; diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c index a9b00942e87d..a8bb193fdfd5 100644 --- a/fs/compat_ioctl.c +++ b/fs/compat_ioctl.c @@ -895,7 +895,7 @@ COMPATIBLE_IOCTL(PPPIOCATTCHAN) COMPATIBLE_IOCTL(PPPIOCGCHAN) COMPATIBLE_IOCTL(PPPIOCGL2TPSTATS) /* PPPOX */ -COMPATIBLE_IOCTL(PPPOEIOCSFWD) +COMPATIBLE_IOCTL(PPPOEIOCSFWD32) COMPATIBLE_IOCTL(PPPOEIOCDFWD) /* Big A */ /* sparc only */ diff --git a/include/linux/if_pppox.h b/include/linux/if_pppox.h index ba7a9b0c7c57..d221f1465f41 100644 --- a/include/linux/if_pppox.h +++ b/include/linux/if_pppox.h @@ -85,6 +85,8 @@ extern void unregister_pppox_proto(int proto_num); extern void pppox_unbind_sock(struct sock *sk);/* delete ppp-channel binding */ extern int pppox_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg); +#define PPPOEIOCSFWD32 _IOW(0xB1 ,0, compat_size_t) + /* PPPoX socket states */ enum { PPPOX_NONE = 0, /* initial state */
Support for handling the PPPOEIOCSFWD ioctl in compat mode was added in linux-2.5.69 along with hundreds of other commands, but was always broken sincen only the structure is compatible, but the command number is not, due to the size being sizeof(size_t), or at first sizeof(sizeof((struct sockaddr_pppox)), which is different on 64-bit architectures. Fix it by defining a separate command code that matches the 32-bit version, and marking that one as compatible. This should apply to all stable kernels. Signed-off-by: Arnd Bergmann <arnd@arndb.de> --- drivers/net/ppp/pppoe.c | 4 ++++ fs/compat_ioctl.c | 2 +- include/linux/if_pppox.h | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) -- 2.18.0