Index: kernel/generic/include/cap/cap.h
===================================================================
--- kernel/generic/include/cap/cap.h	(revision 05913fe7573b3078f8c23bfa5774302f09810a55)
+++ kernel/generic/include/cap/cap.h	(revision 04ba11055f3c5e7ffc8b2c766192632e2731b66f)
@@ -111,5 +111,5 @@
 } cap_info_t;
 
-extern void caps_task_alloc(struct task *);
+extern int caps_task_alloc(struct task *);
 extern void caps_task_free(struct task *);
 extern void caps_task_init(struct task *);
Index: kernel/generic/src/cap/cap.c
===================================================================
--- kernel/generic/src/cap/cap.c	(revision 05913fe7573b3078f8c23bfa5774302f09810a55)
+++ kernel/generic/src/cap/cap.c	(revision 04ba11055f3c5e7ffc8b2c766192632e2731b66f)
@@ -114,16 +114,24 @@
  * @param task  Task for which to allocate the info structure.
  */
-void caps_task_alloc(task_t *task)
-{
-	task->cap_info = (cap_info_t *) malloc(sizeof(cap_info_t), 0);
+int caps_task_alloc(task_t *task)
+{
+	task->cap_info = (cap_info_t *) malloc(sizeof(cap_info_t),
+	    FRAME_ATOMIC);
+	if (!task->cap_info)
+		return ENOMEM;
 	task->cap_info->handles = ra_arena_create();
-	// FIXME: allow caps_task_alloc() to fail 
-	assert(task->cap_info->handles);
-	bool success = ra_span_add(task->cap_info->handles, 0, MAX_CAPS);
-	// FIXME: allow caps_task_alloc() to fail 
-	assert(success);
-	success = hash_table_create(&task->cap_info->caps, 0, 0, &caps_ops);
-	// FIXME: allow caps_task_alloc() to fail 
-	assert(success);
+	if (!task->cap_info->handles)
+		goto error_handles;
+	if (!ra_span_add(task->cap_info->handles, 0, MAX_CAPS))
+		goto error_span;
+	if (!hash_table_create(&task->cap_info->caps, 0, 0, &caps_ops))
+		goto error_span;
+	return EOK;
+
+error_span:
+	ra_arena_destroy(task->cap_info->handles);
+error_handles:
+	free(task->cap_info);
+	return ENOMEM;
 }
 
Index: kernel/generic/src/proc/task.c
===================================================================
--- kernel/generic/src/proc/task.c	(revision 05913fe7573b3078f8c23bfa5774302f09810a55)
+++ kernel/generic/src/proc/task.c	(revision 04ba11055f3c5e7ffc8b2c766192632e2731b66f)
@@ -161,4 +161,8 @@
 {
 	task_t *task = (task_t *) obj;
+
+	int rc = caps_task_alloc(task);
+	if (rc != EOK)
+		return rc;
 	
 	atomic_set(&task->refcount, 0);
@@ -168,6 +172,4 @@
 	
 	list_initialize(&task->threads);
-	
-	caps_task_alloc(task);
 	
 	ipc_answerbox_init(&task->answerbox, task);
