[prev in list] [next in list] [prev in thread] [next in thread] 

List:       busybox
Subject:    [PATCH v2] sysctl: fix the problem that no error is reported when access fails
From:       "zhuyan (M)" <zhuyan34 () huawei ! com>
Date:       2020-05-16 10:30:55
Message-ID: e7261cdd7ce04599aa8d244b8839f2f5 () huawei ! com
[Download RAW message or body]

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 <zhuyan34@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


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic