sysctl: do report EACCES errors on write

function                                             old     new   delta
sysctl_act_recursive                                 165     179     +14
sysctl_act_on_setting                                467     471      +4
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 2/0 up/down: 18/0)               Total: 18 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2020-06-09 15:58:32 +02:00
parent b2ab920716
commit 002be6e821
2 changed files with 8 additions and 5 deletions

View File

@ -169,13 +169,15 @@ static int sysctl_act_on_setting(char *setting)
if (fd < 0) { if (fd < 0) {
switch (errno) { switch (errno) {
case EACCES:
/* Happens for write-only settings, e.g. net.ipv6.route.flush */
goto end;
case ENOENT: case ENOENT:
if (option_mask32 & FLAG_SHOW_KEY_ERRORS) if (option_mask32 & FLAG_SHOW_KEY_ERRORS)
bb_error_msg("error: '%s' is an unknown key", outname); bb_error_msg("error: '%s' is an unknown key", outname);
break; break;
case EACCES:
/* Happens for write-only settings, e.g. net.ipv6.route.flush */
if (!writing)
goto end;
/* fall through */
default: default:
bb_perror_msg("error %sing key '%s'", bb_perror_msg("error %sing key '%s'",
writing ? writing ?
@ -236,6 +238,7 @@ static int sysctl_act_recursive(const char *path)
int retval = 0; int retval = 0;
if (!(option_mask32 & FLAG_WRITE) if (!(option_mask32 & FLAG_WRITE)
&& !strchr(path, '=') /* do not try to resurse on "var=val" */
&& stat(path, &buf) == 0 && stat(path, &buf) == 0
&& S_ISDIR(buf.st_mode) && S_ISDIR(buf.st_mode)
) { ) {