Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:pgajdos:l
libcpuset
libcpuset-robustify-cpuset_pin-cpuset_size-cpus...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
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);
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor