Thanks, fixed in a bit different way

On Sat, May 16, 2020 at 12:31 PM zhuyan (M) <zhuya...@huawei.com> wrote:
>
> 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

Reply via email to