aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiaxun Yang <jiaxun.yang@flygoat.com>2022-02-07 11:33:34 +0000
committerHauke Mehrtens <hauke@hauke-m.de>2022-04-06 00:21:50 +0200
commit5a3025f28b758f6a6b21837643697a98a9468415 (patch)
tree0422808d0c964f6049e2b14d812624ff587b9a38
parent5014a79b21c55ccb3ccd20c9e873993baf40932b (diff)
downloadbackports-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.h7
-rw-r--r--backport/compat/Makefile1
-rw-r--r--backport/compat/backport-5.15.c55
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 */