From c51b63758e95247e3c1e2f06e5f5bfb49849e66d Mon Sep 17 00:00:00 2001
From: Robert Yang <liezhi.yang@windriver.com>
Date: Tue, 22 Jan 2019 16:30:52 +0800
Subject: [PATCH] Fix Segmentation fault error when gcc -o /dev/null

Fixed:
$ export CCACHE_DEBUG=1
$ ccache gcc -c hello.c -o /dev/null

Segmentation fault (core dumped)

This is because failed to open /dev/null.foo (Permission denied), check file
stream before write to it can fix the problem.

Upstream-Status: Backport [https://github.com/ccache/ccache/commit/4d86e884d07ba1853a0c70507cc4d04107f57c29]

Signed-off-by: Robert Yang <liezhi.yang@windriver.com>
---
 src/ccache.c | 15 ++++++++++++---
 src/util.c   |  8 ++++++--
 2 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/src/ccache.c b/src/ccache.c
index b4cdb86..8c227df 100644
--- a/src/ccache.c
+++ b/src/ccache.c
@@ -521,9 +521,13 @@ init_hash_debug(struct hash *hash, const char *obj_path, char type,
 
 	char *path = format("%s.ccache-input-%c", obj_path, type);
 	FILE *debug_binary_file = fopen(path, "wb");
-	hash_enable_debug(hash, section_name, debug_binary_file, debug_text_file);
+	if (debug_binary_file) {
+		hash_enable_debug(hash, section_name, debug_binary_file, debug_text_file);
+		exitfn_add(fclose_exitfn, debug_binary_file);
+	} else {
+		cc_log("Failed to open %s: %s", path, strerror(errno));
+	}
 	free(path);
-	exitfn_add(fclose_exitfn, debug_binary_file);
 }
 
 static enum guessed_compiler
@@ -3670,8 +3674,13 @@ ccache(int argc, char *argv[])
 	if (conf->debug) {
 		char *path = format("%s.ccache-input-text", output_obj);
 		debug_text_file = fopen(path, "w");
+		if (debug_text_file) {
+			exitfn_add(fclose_exitfn, debug_text_file);
+		}
+		else {
+			cc_log("Failed to open %s: %s", path, strerror(errno));
+		}
 		free(path);
-		exitfn_add(fclose_exitfn, debug_text_file);
 	}
 
 	struct hash *common_hash = hash_init();
diff --git a/src/util.c b/src/util.c
index e442cc4..a49fb4c 100644
--- a/src/util.c
+++ b/src/util.c
@@ -219,8 +219,12 @@ void
 cc_dump_log_buffer(const char *path)
 {
 	FILE *file = fopen(path, "w");
-	(void) fwrite(logbuffer, 1, logsize, file);
-	fclose(file);
+	if (file) {
+		(void) fwrite(logbuffer, 1, logsize, file);
+		fclose(file);
+	} else {
+		cc_log("Failed to open %s: %s", path, strerror(errno));
+	}
 }
 
 // Something went badly wrong!
-- 
2.7.4

