summaryrefslogtreecommitdiffstats
path: root/sys/compat
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2008-02-22 11:47:56 +0000
committerkib <kib@FreeBSD.org>2008-02-22 11:47:56 +0000
commit7ad2fb2ee1d49d8dc68037cbcdeaa7edc59bf2d2 (patch)
tree3eb7423cda05b4cdde4e6e97de1db77a6b81e5ae /sys/compat
parent0370efee5e7b048a30c91cb5dc46f1c23246a034 (diff)
downloadFreeBSD-src-7ad2fb2ee1d49d8dc68037cbcdeaa7edc59bf2d2.zip
FreeBSD-src-7ad2fb2ee1d49d8dc68037cbcdeaa7edc59bf2d2.tar.gz
Sanitize arguments to linux_mremap().
Check that only MREMAP_FIXED and MREMAP_MAYMOVE flags are specified. Check for the page alignment of the addr argument. Submitted by: rdivacky MFC after: 1 week
Diffstat (limited to 'sys/compat')
-rw-r--r--sys/compat/linux/linux_misc.c15
-rw-r--r--sys/compat/linux/linux_misc.h3
2 files changed, 18 insertions, 0 deletions
diff --git a/sys/compat/linux/linux_misc.c b/sys/compat/linux/linux_misc.c
index 1adb656..ee06e78 100644
--- a/sys/compat/linux/linux_misc.c
+++ b/sys/compat/linux/linux_misc.c
@@ -588,6 +588,21 @@ linux_mremap(struct thread *td, struct linux_mremap_args *args)
(unsigned long)args->new_len,
(unsigned long)args->flags);
#endif
+
+ if (args->flags & ~(LINUX_MREMAP_FIXED | LINUX_MREMAP_MAYMOVE)) {
+ td->td_retval[0] = 0;
+ return (EINVAL);
+ }
+
+ /*
+ * Check for the page alignment.
+ * Linux defines PAGE_MASK to be FreeBSD ~PAGE_MASK.
+ */
+ if (args->addr & PAGE_MASK) {
+ td->td_retval[0] = 0;
+ return (EINVAL);
+ }
+
args->new_len = round_page(args->new_len);
args->old_len = round_page(args->old_len);
diff --git a/sys/compat/linux/linux_misc.h b/sys/compat/linux/linux_misc.h
index 32fa74a..c80a432 100644
--- a/sys/compat/linux/linux_misc.h
+++ b/sys/compat/linux/linux_misc.h
@@ -42,4 +42,7 @@
#define LINUX_MAX_COMM_LEN 16 /* Maximum length of the process name. */
+#define LINUX_MREMAP_MAYMOVE 1
+#define LINUX_MREMAP_FIXED 2
+
#endif /* _LINUX_MISC_H_ */
OpenPOWER on IntegriCloud