Files
core/system/base/procps/files/procps-3.2.7-sysctl-writeonly.patch
T
2015-02-24 11:18:35 +02:00

57 lines
1.8 KiB
Diff

diff -up procps-3.2.7/sysctl.c.p9 procps-3.2.7/sysctl.c
--- procps-3.2.7/sysctl.c.p9 2006-06-25 02:51:51.000000000 +0200
+++ procps-3.2.7/sysctl.c 2008-09-01 11:31:58.000000000 +0200
@@ -127,7 +127,8 @@ static int ReadSetting(const char *restr
char *restrict tmpname;
char *restrict outname;
char inbuf[1025];
- FILE *restrict fp;
+ FILE *restrict fp = NULL;
+ struct stat st;
if (!name || !*name) {
fprintf(stderr, ERR_INVALID_KEY, name);
@@ -144,7 +145,13 @@ static int ReadSetting(const char *restr
outname = strdup(name);
slashdot(outname,'/','.'); /* change / to . */
- fp = fopen(tmpname, "r");
+ if (stat(tmpname, &st)==0) {
+ if (st.st_mode & (S_IRUSR|S_IROTH|S_IRGRP))
+ fp = fopen(tmpname, "r");
+ else
+ /* ignore write-only files */
+ return -1;
+ }
if (!fp) {
switch(errno) {
@@ -158,12 +165,16 @@ static int ReadSetting(const char *restr
fprintf(stderr, ERR_PERMISSION_DENIED, outname);
rc = -1;
break;
+ case EINVAL: /* fopen()/stat() invalid argument */
+ case ENOTTY: /* inappropriate ioctl for device */
+ break;
default:
fprintf(stderr, ERR_UNKNOWN_READING, strerror(errno), outname);
rc = -1;
break;
}
} else {
+ errno=0;
if(fgets(inbuf, sizeof inbuf - 1, fp)) {
// this loop is required, see
// /sbin/sysctl -a | egrep -6 dev.cdrom.info
@@ -183,7 +194,9 @@ static int ReadSetting(const char *restr
}
}
} while(fgets(inbuf, sizeof inbuf - 1, fp));
- } else {
+
+ /* fgets() returns NULL and errno without change if the file is empty */
+ } else if (errno) {
switch(errno) {
case EACCES:
fprintf(stderr, ERR_PERMISSION_DENIED, outname);