Index: kernel/generic/src/main/uinit.c
===================================================================
--- kernel/generic/src/main/uinit.c	(revision 4e5dabf872f498631fc35dbcf67ea7d2141df88f)
+++ kernel/generic/src/main/uinit.c	(revision 375e501a4e8faac7fad7a1d019a8a778e97346e6)
@@ -56,6 +56,4 @@
 void uinit(void *arg)
 {
-	uspace_arg_t uarg;
-	
 	/*
 	 * So far, we don't have a use for joining userspace threads so we
@@ -72,13 +70,17 @@
 #endif
 	
-	uarg.uspace_entry = ((uspace_arg_t *) arg)->uspace_entry;
-	uarg.uspace_stack = ((uspace_arg_t *) arg)->uspace_stack;
-	uarg.uspace_uarg = ((uspace_arg_t *) arg)->uspace_uarg;
-	uarg.uspace_thread_function = NULL;
-	uarg.uspace_thread_arg = NULL;
+	uspace_arg_t *uarg = (uspace_arg_t *) arg;
+	uspace_arg_t local_uarg;
 	
-	free((uspace_arg_t *) arg);
+	local_uarg.uspace_entry = uarg->uspace_entry;
+	local_uarg.uspace_stack = uarg->uspace_stack;
+	local_uarg.uspace_stack_size = uarg->uspace_stack_size;
+	local_uarg.uspace_uarg = uarg->uspace_uarg;
+	local_uarg.uspace_thread_function = NULL;
+	local_uarg.uspace_thread_arg = NULL;
 	
-	userspace(&uarg);
+	free(uarg);
+	
+	userspace(&local_uarg);
 }
 
Index: kernel/generic/src/proc/program.c
===================================================================
--- kernel/generic/src/proc/program.c	(revision 4e5dabf872f498631fc35dbcf67ea7d2141df88f)
+++ kernel/generic/src/proc/program.c	(revision 375e501a4e8faac7fad7a1d019a8a778e97346e6)
@@ -71,13 +71,4 @@
 int program_create(as_t *as, uintptr_t entry_addr, char *name, program_t *prg)
 {
-	uspace_arg_t *kernel_uarg;
-	
-	kernel_uarg = (uspace_arg_t *) malloc(sizeof(uspace_arg_t), 0);
-	kernel_uarg->uspace_entry = (void *) entry_addr;
-	kernel_uarg->uspace_stack = (void *) USTACK_ADDRESS;
-	kernel_uarg->uspace_thread_function = NULL;
-	kernel_uarg->uspace_thread_arg = NULL;
-	kernel_uarg->uspace_uarg = NULL;
-	
 	prg->loader_status = EE_OK;
 	prg->task = task_create(as, name);
@@ -92,6 +83,18 @@
 	    AS_AREA_READ | AS_AREA_WRITE | AS_AREA_CACHEABLE,
 	    STACK_SIZE, AS_AREA_ATTR_NONE, &anon_backend, NULL, &virt, 0);
-	if (!area)
+	if (!area) {
+		task_destroy(prg->task);
 		return ENOMEM;
+	}
+	
+	uspace_arg_t *kernel_uarg = (uspace_arg_t *)
+	    malloc(sizeof(uspace_arg_t), 0);
+	
+	kernel_uarg->uspace_entry = (void *) entry_addr;
+	kernel_uarg->uspace_stack = (void *) virt;
+	kernel_uarg->uspace_stack_size = STACK_SIZE;
+	kernel_uarg->uspace_thread_function = NULL;
+	kernel_uarg->uspace_thread_arg = NULL;
+	kernel_uarg->uspace_uarg = NULL;
 	
 	/*
@@ -100,6 +103,10 @@
 	prg->main_thread = thread_create(uinit, kernel_uarg, prg->task,
 	    THREAD_FLAG_USPACE, "uinit", false);
-	if (!prg->main_thread)
+	if (!prg->main_thread) {
+		free(kernel_uarg);
+		as_area_destroy(as, virt);
+		task_destroy(prg->task);
 		return ELIMIT;
+	}
 	
 	return EOK;
Index: kernel/generic/src/proc/thread.c
===================================================================
--- kernel/generic/src/proc/thread.c	(revision 4e5dabf872f498631fc35dbcf67ea7d2141df88f)
+++ kernel/generic/src/proc/thread.c	(revision 375e501a4e8faac7fad7a1d019a8a778e97346e6)
@@ -854,5 +854,4 @@
 	 * In case of failure, kernel_uarg will be deallocated in this function.
 	 * In case of success, kernel_uarg will be freed in uinit().
-	 *
 	 */
 	uspace_arg_t *kernel_uarg =
