diff options
author | Jiaxun Yang <jiaxun.yang@flygoat.com> | 2022-02-07 11:33:34 +0000 |
---|---|---|
committer | Hauke Mehrtens <hauke@hauke-m.de> | 2022-04-06 00:21:50 +0200 |
commit | 5a3025f28b758f6a6b21837643697a98a9468415 (patch) | |
tree | 0422808d0c964f6049e2b14d812624ff587b9a38 | |
parent | 5014a79b21c55ccb3ccd20c9e873993baf40932b (diff) | |
download | backports-5a3025f28b758f6a6b21837643697a98a9468415.tar.gz |
backports: backport {get,set}_user_ifreq
Backport them from 5.15, they are required by QRTR.
Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
[Add this only for kernel >= 4.6 after in_compat_syscall() was added]
[Access struct compat_ifreq only when CONFIG_COMPAT is defined]
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
-rw-r--r-- | backport/backport-include/linux/netdevice.h | 7 | ||||
-rw-r--r-- | backport/compat/Makefile | 1 | ||||
-rw-r--r-- | backport/compat/backport-5.15.c | 55 |
3 files changed, 63 insertions, 0 deletions
diff --git a/backport/backport-include/linux/netdevice.h b/backport/backport-include/linux/netdevice.h index 22942398..e1773190 100644 --- a/backport/backport-include/linux/netdevice.h +++ b/backport/backport-include/linux/netdevice.h @@ -151,6 +151,13 @@ struct rtnl_link_stats64 * bp_dev_get_tstats64(struct net_device *dev, struct rtnl_link_stats64 *s); #endif /* < 4.11 */ +#if LINUX_VERSION_IN_RANGE(4,6,0, 5,15,0) +#define get_user_ifreq LINUX_BACKPORT(get_user_ifreq) +int get_user_ifreq(struct ifreq *ifr, void __user **ifrdata, void __user *arg); +#define put_user_ifreq LINUX_BACKPORT(put_user_ifreq) +int put_user_ifreq(struct ifreq *ifr, void __user *arg); +#endif + #if LINUX_VERSION_IS_LESS(5,15,0) static inline void backport_dev_put(struct net_device *dev) { diff --git a/backport/compat/Makefile b/backport/compat/Makefile index 2761e5f5..b9f1dee9 100644 --- a/backport/compat/Makefile +++ b/backport/compat/Makefile @@ -20,6 +20,7 @@ compat-$(CPTCFG_KERNEL_5_5) += backport-5.5.o compat-$(CPTCFG_KERNEL_5_10) += backport-5.10.o compat-$(CPTCFG_KERNEL_5_11) += backport-5.11.o compat-$(CPTCFG_KERNEL_5_13) += backport-5.13.o +compat-$(CPTCFG_KERNEL_5_15) += backport-5.15.o compat-$(CPTCFG_BPAUTO_BUILD_SYSTEM_DATA_VERIFICATION) += verification/verify.o compat-$(CPTCFG_BPAUTO_BUILD_SYSTEM_DATA_VERIFICATION) += verification/pkcs7.asn1.o diff --git a/backport/compat/backport-5.15.c b/backport/compat/backport-5.15.c new file mode 100644 index 00000000..fafe9c77 --- /dev/null +++ b/backport/compat/backport-5.15.c @@ -0,0 +1,55 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include <linux/compat.h> +#include <linux/export.h> +#include <linux/uaccess.h> +#include <linux/netdevice.h> + +#include <uapi/linux/if.h> + +#if LINUX_VERSION_IS_GEQ(4,6,0) + +int get_user_ifreq(struct ifreq *ifr, void __user **ifrdata, void __user *arg) +{ +#ifdef CONFIG_COMPAT + if (in_compat_syscall()) { + struct compat_ifreq *ifr32 = (struct compat_ifreq *)ifr; + + memset(ifr, 0, sizeof(*ifr)); + if (copy_from_user(ifr32, arg, sizeof(*ifr32))) + return -EFAULT; + + if (ifrdata) + *ifrdata = compat_ptr(ifr32->ifr_data); + + return 0; + } +#endif + + if (copy_from_user(ifr, arg, sizeof(*ifr))) + return -EFAULT; + + if (ifrdata) + *ifrdata = ifr->ifr_data; + + return 0; +} +EXPORT_SYMBOL(get_user_ifreq); + +int put_user_ifreq(struct ifreq *ifr, void __user *arg) +{ + size_t size = sizeof(*ifr); + +#ifdef CONFIG_COMPAT + if (in_compat_syscall()) + size = sizeof(struct compat_ifreq); +#endif + + if (copy_to_user(arg, ifr, size)) + return -EFAULT; + + return 0; +} +EXPORT_SYMBOL(put_user_ifreq); + +#endif /* >= 4.6.0 */ |