diff options
author | kib <kib@FreeBSD.org> | 2008-02-22 11:47:56 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2008-02-22 11:47:56 +0000 |
commit | 7ad2fb2ee1d49d8dc68037cbcdeaa7edc59bf2d2 (patch) | |
tree | 3eb7423cda05b4cdde4e6e97de1db77a6b81e5ae /sys/compat/linux | |
parent | 0370efee5e7b048a30c91cb5dc46f1c23246a034 (diff) | |
download | FreeBSD-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/linux')
-rw-r--r-- | sys/compat/linux/linux_misc.c | 15 | ||||
-rw-r--r-- | sys/compat/linux/linux_misc.h | 3 |
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_ */ |