File libcpuset-robustify-cpuset_pin-cpuset_size-cpuset_where-error-handling.diff of Package libcpuset

Subject: Robustify cpuset_pin(), cpuset_size() and cpuset_where() error handling
From: Mike Galbraith <mgalbraith@suse.de>
Date: Fri May 20 08:54:25 CEST 2016
References: bnc#978841

In referenced bnc, the user had too many files open, which led to an
unhandled failure on the way to cpuset_equal_placement(), where it
segfaulted.  Handle errors instead of simply ignoring them:

Signed-off-by: Mike Galbraith <mgalbraith@suse.de>
---
 libcpuset.c |   30 ++++++++++++++++++++++++++----
 1 file changed, 26 insertions(+), 4 deletions(-)

--- a/libcpuset.c
+++ b/libcpuset.c
@@ -3615,18 +3615,24 @@ int cpuset_pin(int relcpu)
 		return -1;
 
 	do {
+		r = -1;
 		cpuset_free_placement(plc1);
 		plc1 = cpuset_get_placement(0);
+		if (!plc1)
+			break;
 
-		r = 0;
 		if (cpuset_unpin() < 0)
-			r = -1;
+			break;
+
 		cpu = cpuset_p_rel_to_sys_cpu(0, relcpu);
-		if (cpuset_cpubind(cpu) < 0)
-			r = -1;
+		if (cpu < 0 || cpuset_cpubind(cpu) < 0)
+			break;
 
 		cpuset_free_placement(plc2);
 		plc2 = cpuset_get_placement(0);
+		if (!plc2)
+			break;
+		r = 0;
 	} while (!cpuset_equal_placement(plc1, plc2));
 
 	cpuset_free_placement(plc1);
@@ -3644,13 +3650,20 @@ int cpuset_size()
 		return -1;
 
 	do {
+		r = -1;
 		cpuset_free_placement(plc1);
 		plc1 = cpuset_get_placement(0);
+		if (!plc1)
+			break;
 
 		r = cpuset_cpus_weight(0);
 
 		cpuset_free_placement(plc2);
 		plc2 = cpuset_get_placement(0);
+		if (!plc2) {
+			r = -1;
+			break;
+		}
 	} while (!cpuset_equal_placement(plc1, plc2));
 
 	cpuset_free_placement(plc1);
@@ -3668,13 +3681,22 @@ int cpuset_where()
 		return -1;
 
 	do {
+		r = -1;
 		cpuset_free_placement(plc1);
 		plc1 = cpuset_get_placement(0);
+		if (!plc1)
+			break;
 
 		r = cpuset_p_sys_to_rel_cpu(0, cpuset_latestcpu(0));
+		if (r < 0)
+			break;
 
 		cpuset_free_placement(plc2);
 		plc2 = cpuset_get_placement(0);
+		if (!plc2) {
+			r = -1;
+			break;
+		}
 	} while (!cpuset_equal_placement(plc1, plc2));
 
 	cpuset_free_placement(plc1);