Commits

dtrg committed 07be5bd

Reapply bugfix to sbrk() which got dropped during the move from linx386/libsys
to liblinux. Set errno correctly.

Comments (0)

Files changed (2)

plat/linux/liblinux/brk.c

 
 #include <stdlib.h>
 #include <unistd.h>
+#include <errno.h>
 #include "libsys.h"
 
 int brk(void* end)
 {
-	return _syscall(__NR_brk, (quad) end, 0, 0);
+	int e = _syscall(__NR_brk, (quad) end, 0, 0);
+	if (e == -1)
+		errno = ENOMEM;
+	return e;
 }

plat/linux/liblinux/sbrk.c

-/* $Source: /cvsroot/tack/Ack/plat/linux386/libsys/sbrk.c,v $
- * $State: Exp $
- * $Revision: 1.1 $
+/* $Source$
+ * $State$
+ * $Revision$
  */
 
 #include <stdlib.h>
-#include <stdio.h>
 #include <unistd.h>
+#include <errno.h>
 #include "libsys.h"
 
 #define	OUT_OF_MEMORY (void*)(-1)	/* sbrk returns this on failure */
 
-extern char _end[1];
-
-static char* current = _end;
+static char* current = NULL;
  
 void* sbrk(intptr_t increment)
 {
 	char* old;
 	char* new;
+	char* actual;
+	
+	if (!current)
+		current = (char*) _syscall(__NR_brk, 0, 0, 0);
 
 	if (increment == 0)
 		return current;
 		
 	old = current;
 	new = old + increment;
-	if (brk(new) < 0)
+
+	actual = (char*) _syscall(__NR_brk, (quad) new, 0, 0);
+	if (actual < new)
+	{
+		errno = ENOMEM;
 		return OUT_OF_MEMORY;
+	}
 		
-	current = new;
+	current = actual;
 	return old;
 }