/* Try to parse numeric capability */
r = safe_atoi(name, &i);
if (r >= 0) {
- if (i >= 0 && i < 64)
- return i;
- else
+ if (i < 0 || i >= 63)
return -EINVAL;
+
+ return i;
}
/* Try to parse string capability */
r = safe_atolu(content, &p);
if (r >= 0) {
- if (p > 63) /* Safety for the future: if one day the kernel learns more than 64 caps,
+ if (p > 62) /* Safety for the future: if one day the kernel learns more than 64 caps,
* then we are in trouble (since we, as much userspace and kernel space
* store capability masks in uint64_t types). Let's hence protect
* ourselves against that and always cap at 63 for now. */
- p = 63;
+ p = 62;
saved = p;
valid = true;
}
/* fall back to syscall-probing for pre linux-3.2 */
- p = MIN((unsigned long) CAP_LAST_CAP, 63U);
+ p = MIN((unsigned long) CAP_LAST_CAP, 62U);
if (prctl(PR_CAPBSET_READ, p) < 0) {
} else {
/* Hmm, look upwards, until we find one that doesn't work */
- for (; p < 63; p++)
+ for (; p < 62; p++)
if (prctl(PR_CAPBSET_READ, p+1) < 0)
break;
}
assert_se(capability_from_name("cAp_aUdIt_rEAd") == CAP_AUDIT_READ);
assert_se(capability_from_name("0") == 0);
assert_se(capability_from_name("15") == 15);
- assert_se(capability_from_name("63") == 63);
+ assert_se(capability_from_name("62") == 62);
+ assert_se(capability_from_name("63") == -EINVAL);
assert_se(capability_from_name("64") == -EINVAL);
assert_se(capability_from_name("-1") == -EINVAL);
TEST(capability_set_to_string) {
test_capability_set_to_string_invalid(0);
- /* once the kernel supports 63 caps, there are no 'invalid' numbers
+ /* once the kernel supports 62 caps, there are no 'invalid' numbers
* for us to test with */
- if (cap_last_cap() < 63)
+ if (cap_last_cap() < 62)
test_capability_set_to_string_invalid(all_capabilities() + 1);
}