fix brk/sbrk behavior to match the real legacy functions
authorRich Felker <dalias@aerifal.cx>
Sun, 22 May 2011 16:34:33 +0000 (12:34 -0400)
committerRich Felker <dalias@aerifal.cx>
Sun, 22 May 2011 16:34:33 +0000 (12:34 -0400)
src/linux/brk.c
src/linux/sbrk.c

index 9f63c5a..d91ee5a 100644 (file)
@@ -2,5 +2,5 @@
 
 int brk(void *end)
 {
-       return -(syscall(SYS_brk, end) == -1);
+       return -(syscall(SYS_brk, end) != (unsigned long)end);
 }
index b2943a9..5fab74b 100644 (file)
@@ -3,5 +3,7 @@
 
 void *sbrk(ptrdiff_t inc)
 {
-       return (void *)syscall(SYS_brk, syscall(SYS_brk, 0)+inc);
+       unsigned long cur = syscall(SYS_brk, 0);
+       if (inc && syscall(SYS_brk, cur+inc) != cur+inc) return (void *)-1;
+       return (void *)cur;
 }