projects
/
musl
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fix getgrouplist when nscd reports an empty list
[musl]
/
src
/
mman
/
mremap.c
diff --git
a/src/mman/mremap.c
b/src/mman/mremap.c
index
596c45f
..
cc6991a
100644
(file)
--- a/
src/mman/mremap.c
+++ b/
src/mman/mremap.c
@@
-1,17
+1,30
@@
+#define _GNU_SOURCE
#include <unistd.h>
#include <sys/mman.h>
#include <unistd.h>
#include <sys/mman.h>
+#include <errno.h>
+#include <stdint.h>
#include <stdarg.h>
#include "syscall.h"
#include <stdarg.h>
#include "syscall.h"
-#include "libc.h"
+
+static void dummy(void) { }
+weak_alias(dummy, __vm_wait);
void *__mremap(void *old_addr, size_t old_len, size_t new_len, int flags, ...)
{
va_list ap;
void *__mremap(void *old_addr, size_t old_len, size_t new_len, int flags, ...)
{
va_list ap;
- void *new_addr;
-
- va_start(ap, flags);
- new_addr = va_arg(ap, void *);
- va_end(ap);
+ void *new_addr = 0;
+
+ if (new_len >= PTRDIFF_MAX) {
+ errno = ENOMEM;
+ return MAP_FAILED;
+ }
+
+ if (flags & MREMAP_FIXED) {
+ __vm_wait();
+ va_start(ap, flags);
+ new_addr = va_arg(ap, void *);
+ va_end(ap);
+ }
return (void *)syscall(SYS_mremap, old_addr, old_len, new_len, flags, new_addr);
}
return (void *)syscall(SYS_mremap, old_addr, old_len, new_len, flags, new_addr);
}