Index: kernel/generic/src/proc/program.c
===================================================================
--- kernel/generic/src/proc/program.c	(revision db675dd70825d2c8a787f0a80caff4c910e5239c)
+++ kernel/generic/src/proc/program.c	(revision 22cec678eb7decda2dbae9412db7d07982f20e0a)
@@ -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;
