From 272c5b0f8cba822ade86d6789619f754feddeebd Mon Sep 17 00:00:00 2001
From: Craig Small <csmall@enc.com.au>
Date: Sun, 7 Jan 2018 12:25:35 +1100
Subject: [PATCH] sysctl: Don't crash file fopen fails

The commit referenced below put a setvbuf() before checking what
fopen() returned. If the file could not be opened then the file
handle was NULL at setvbuf() crashed.

setvbuf() is now called after checking what fopen() returns and only
when it was successful.

References:
 procps-ng/procps#76
 commit 58ae084c2737cdee395915d45dbcb364648ac615
---
 NEWS     | 1 +
 sysctl.c | 6 +++---
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/NEWS b/NEWS
index 251a1fec..7ffe74a9 100644
--- a/NEWS
+++ b/NEWS
@@ -11,6 +11,7 @@ procps-ng-NEXT
   * ps: recognizes SCHED_DEADLINE as valid CPU scheduler
   * ps: display NUMA node under which a thread ran         issue #58
   * sysctl: Permit empty string for value                  issue #74
+  * sysctl: Don't segv when file not available             issue #76
   * top: add config file support for XDG specification
   * top: eliminated minor libnuma memory leak
   * top: show fewer memory decimal places (configurable)   issue #50
diff --git a/sysctl.c b/sysctl.c
index 834662b3..7c05243d 100644
--- a/sysctl.c
+++ b/sysctl.c
@@ -222,9 +222,6 @@ static int ReadSetting(const char *restrict const name)
 
 	fp = fopen(tmpname, "r");
 
-	if (iobuf)
-		setvbuf(fp, iobuf, _IOFBF, IOBUFSIZ);
-
 	if (!fp) {
 		switch (errno) {
 		case ENOENT:
@@ -246,6 +243,9 @@ static int ReadSetting(const char *restrict const name)
 			break;
 		}
 	} else {
+	    if (iobuf)
+            setvbuf(fp, iobuf, _IOFBF, IOBUFSIZ);
+
 		errno = 0;
 		if (fgets(inbuf, sizeof inbuf - 1, fp)) {
 			/* this loop is required, see
-- 
2.40.0