sysctl: Print lines longer than 1024 chars

as well do not open /proc/sys files if only the names of the
system control names of the kernel parameters should be shown.
Avoid leaking tmpname in case of a pattern mismatch.

Signed-off-by: Werner Fink <werner@suse.de>
This commit is contained in:
Werner Fink 2017-05-22 22:31:34 +10:00 committed by Craig Small
parent aa41c309dd
commit e04394ef24

View File

@ -207,8 +207,13 @@ static int ReadSetting(const char *restrict const name)
} }
if (pattern && !pattern_match(outname, pattern)) { if (pattern && !pattern_match(outname, pattern)) {
free(outname); rc = 0;
return 0; goto out;
}
if (NameOnly) {
fprintf(stdout, "%s\n", outname);
goto out;
} }
fp = fopen(tmpname, "r"); fp = fopen(tmpname, "r");
@ -237,24 +242,25 @@ static int ReadSetting(const char *restrict const name)
* /sbin/sysctl -a | egrep -6 dev.cdrom.info * /sbin/sysctl -a | egrep -6 dev.cdrom.info
*/ */
do { do {
if (NameOnly) { char *nlptr;
fprintf(stdout, "%s\n", outname); if (PrintName) {
} else { fprintf(stdout, "%s = ", outname);
/* already has the \n in it */ do {
if (PrintName) {
fprintf(stdout, "%s = %s",
outname, inbuf);
if (inbuf[strlen(inbuf) - 1] != '\n')
putchar('\n');
} else {
if (!PrintNewline) {
char *nlptr =
strchr(inbuf, '\n');
if (nlptr)
*nlptr = '\0';
}
fprintf(stdout, "%s", inbuf); fprintf(stdout, "%s", inbuf);
nlptr = &inbuf[strlen(inbuf) - 1];
/* already has the \n in it */
if (*nlptr == '\n')
break;
} while (fgets(inbuf, sizeof inbuf - 1, fp));
if (*nlptr != '\n')
putchar('\n');
} else {
if (!PrintNewline) {
nlptr = strchr(inbuf, '\n');
if (nlptr)
*nlptr = '\0';
} }
fprintf(stdout, "%s", inbuf);
} }
} while (fgets(inbuf, sizeof inbuf - 1, fp)); } while (fgets(inbuf, sizeof inbuf - 1, fp));
} else { } else {