When an general user without authority sets the system configuration, 0 is returned, but the modification is not successful. It is unreasonable.
Such as, general user didn't have /proc/sys/fs/protected_hardlinks permissions, but run the command 'busybox sysctl fs.protected_symlinks', 0 is returned. Signed-off-by: Yan Zhu <zhuya...@huawei.com> --- procps/sysctl.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/procps/sysctl.c b/procps/sysctl.c index 6d77185..0ffa9fe 100644 --- a/procps/sysctl.c +++ b/procps/sysctl.c @@ -53,6 +53,7 @@ enum { FLAG_QUIET = 1 << 6, }; #define OPTION_STR "neAapwq" +bool sysctl_input_dir = false; static void sysctl_dots_to_slashes(char *name) { @@ -170,6 +171,10 @@ static int sysctl_act_on_setting(char *setting) if (fd < 0) { switch (errno) { case EACCES: + if (!sysctl_input_dir) { + bb_perror_msg("error reading key '%s'", outname); + break; + } /* Happens for write-only settings, e.g. net.ipv6.route.flush */ goto end; case ENOENT: @@ -310,6 +315,7 @@ int sysctl_main(int argc UNUSED_PARAM, char **argv) { int retval; int opt; + struct stat buf; opt = getopt32(argv, "+" OPTION_STR); /* '+' - stop on first non-option */ argv += optind; @@ -331,6 +337,7 @@ int sysctl_main(int argc UNUSED_PARAM, char **argv) } xchdir("/proc/sys"); if (opt & (FLAG_TABLE_FORMAT | FLAG_SHOW_ALL)) { + sysctl_input_dir = true; return sysctl_act_recursive("."); } @@ -338,6 +345,12 @@ int sysctl_main(int argc UNUSED_PARAM, char **argv) retval = 0; while (*argv) { + if (stat(*argv, &buf) == 0 + && S_ISDIR(buf.st_mode)) + sysctl_input_dir = true; + else + sysctl_input_dir = false; + sysctl_dots_to_slashes(*argv); retval |= sysctl_act_recursive(*argv); argv++; -- 2.12.3 _______________________________________________ busybox mailing list busybox@busybox.net http://lists.busybox.net/mailman/listinfo/busybox