Index: uspace/libc/generic/thread.c
===================================================================
--- uspace/libc/generic/thread.c	(revision 51ec40fa633067000ae92bcd7b38fde49fdfe205)
+++ uspace/libc/generic/thread.c	(revision c31e536bd9be6ecfa95f64ab22192e98f13dcb22)
@@ -78,6 +78,6 @@
 	 * Zero out the thread local uninitialized data.
 	 */
-	memset(data + (&_tbss_start - &_tdata_start), 0, &_tbss_end -
-		&_tbss_start);
+	memset(data + (&_tbss_start - &_tdata_start), 0,
+	    &_tbss_end - &_tbss_start);
 
 	return tcb;
@@ -129,8 +129,10 @@
  * @return Zero on success or a code from @ref errno.h on failure.
  */
-int thread_create(void (* function)(void *), void *arg, char *name, thread_id_t *tid)
+int thread_create(void (* function)(void *), void *arg, char *name,
+    thread_id_t *tid)
 {
 	char *stack;
 	uspace_arg_t *uarg;
+	int rc;
 
 	stack = (char *) malloc(getpagesize() * THREAD_INITIAL_STACK_PAGES_NO);
@@ -150,5 +152,17 @@
 	uarg->uspace_uarg = uarg;
 	
-	return __SYSCALL3(SYS_THREAD_CREATE, (sysarg_t) uarg, (sysarg_t) name, (sysarg_t) tid);
+	rc = __SYSCALL3(SYS_THREAD_CREATE, (sysarg_t) uarg, (sysarg_t) name,
+	    (sysarg_t) tid);
+	
+	if (!rc) {
+		/*
+		 * Failed to create a new thread.
+		 * Free up the allocated structures.
+		 */
+		free(uarg);
+		free(stack);
+	}
+
+	return rc;
 }
 
