diff --git a/cgroup.c b/cgroup.c
index 882fa6ad57b9b7e8f8c766fb9bb54d2a36571c0c..ab09b65a4d93a0fb8d93a60943d6b292b42aec01 100644
--- a/cgroup.c
+++ b/cgroup.c
@@ -66,8 +66,15 @@ cgroup_add_task(const char *chier, const char *cgroup, pid_t pid)
 		cgroup_perror(tasksfile);
 		return -1;
 	}
-	fprintf(tasks, "%d\n", pid);
-	fclose(tasks);
+	if (fprintf(tasks, "%d\n", pid) < 0) {
+		cgroup_perror(tasksfile);
+		fclose(tasks);
+		return -1;
+	}
+	if (fclose(tasks) < 0) {
+		cgroup_perror(tasksfile);
+		return -1;
+	}
 	return 1;
 }
 
@@ -144,8 +151,15 @@ cgroup_set_mem_limit_do(const char *chier, const char *cgroup, size_t nlimit, ch
 		cgroup_perror(limitfile);
 		return -1;
 	}
-	fprintf(limit, "%zu\n", nlimit);
-	fclose(limit);
+	if (fprintf(limit, "%zu\n", nlimit) < 0) {
+		cgroup_perror(limitfile);
+		fclose(limit);
+		return -1;
+	}
+	if (fclose(limit) < 0) {
+		cgroup_perror(limitfile);
+		return -1;
+	}
 	return 1;
 }
 
@@ -156,8 +170,10 @@ cgroup_set_mem_limit(const char *chier, const char *cgroup, size_t nlimit)
 	 * since normal <= memsw must hold. */
 	int ret = cgroup_set_mem_limit_do(chier, cgroup, nlimit, "");
 #if SWAP_LIMIT
-	if (ret >= 0)
-		ret |= cgroup_set_mem_limit_do(chier, cgroup, nlimit, MEMSW);
+	if (ret >= 0) {
+		int ret2 = cgroup_set_mem_limit_do(chier, cgroup, nlimit, MEMSW);
+		ret = ret2 < 0 ? ret2 : (ret || ret2);
+	}
 #endif
 	return ret;
 }