فهرست منبع

fix brk/sbrk behavior to match the real legacy functions

Rich Felker 14 سال پیش
والد
کامیت
19892bf0a7
2فایلهای تغییر یافته به همراه4 افزوده شده و 2 حذف شده
  1. 1 1
      src/linux/brk.c
  2. 3 1
      src/linux/sbrk.c

+ 1 - 1
src/linux/brk.c

@@ -2,5 +2,5 @@
 
 int brk(void *end)
 {
-	return -(syscall(SYS_brk, end) == -1);
+	return -(syscall(SYS_brk, end) != (unsigned long)end);
 }

+ 3 - 1
src/linux/sbrk.c

@@ -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;
 }