summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2019-07-26 10:32:25 -0400
committerBen Gamari <ben@smart-cactus.org>2019-07-26 10:34:04 -0400
commitdde76af0af6ef75e2593d9135f432170b1c841dc (patch)
tree57cce4928fa40a44d76c3995c4cc440e4649cc19
parentb9c99df1a4cdd23bcd26db7ae6ee7ee6464d654e (diff)
downloadhaskell-wip/T16993.tar.gz
rts: Always truncate output fileswip/T16993
Previously there were numerous places in the RTS where we would fopen with the "w" flag string. This is wrong as it will not truncate the file. Consequently if we write less data than the previous length of the file we will leave garbage at its end. Fixes #16993.
-rw-r--r--rts/Hpc.c2
-rw-r--r--rts/ProfHeap.c2
-rw-r--r--rts/Profiling.c2
-rw-r--r--rts/RtsFlags.c4
-rw-r--r--rts/eventlog/EventLogWriter.c2
5 files changed, 6 insertions, 6 deletions
diff --git a/rts/Hpc.c b/rts/Hpc.c
index 9ba9b04b61..abf85430ac 100644
--- a/rts/Hpc.c
+++ b/rts/Hpc.c
@@ -388,7 +388,7 @@ exitHpc(void) {
// not clober the .tix file.
if (hpc_pid == getpid()) {
- FILE *f = __rts_fopen(tixFilename,"w");
+ FILE *f = __rts_fopen(tixFilename,"w+");
writeTix(f);
}
diff --git a/rts/ProfHeap.c b/rts/ProfHeap.c
index 1023f7ccbe..cc99e37fdc 100644
--- a/rts/ProfHeap.c
+++ b/rts/ProfHeap.c
@@ -385,7 +385,7 @@ initHeapProfiling(void)
sprintf(hp_filename, "%s.hp", prog);
/* open the log file */
- if ((hp_file = __rts_fopen(hp_filename, "w")) == NULL) {
+ if ((hp_file = __rts_fopen(hp_filename, "w+")) == NULL) {
debugBelch("Can't open profiling report file %s\n",
hp_filename);
RtsFlags.ProfFlags.doHeapProfile = 0;
diff --git a/rts/Profiling.c b/rts/Profiling.c
index f340a63cff..b91129ed98 100644
--- a/rts/Profiling.c
+++ b/rts/Profiling.c
@@ -263,7 +263,7 @@ initProfilingLogFile(void)
sprintf(prof_filename, "%s.prof", stem);
/* open the log file */
- if ((prof_file = __rts_fopen(prof_filename, "w")) == NULL) {
+ if ((prof_file = __rts_fopen(prof_filename, "w+")) == NULL) {
debugBelch("Can't open profiling report file %s\n", prof_filename);
RtsFlags.CcFlags.doCostCentres = 0;
// Retainer profiling (`-hr` or `-hr<cc> -h<x>`) writes to
diff --git a/rts/RtsFlags.c b/rts/RtsFlags.c
index 8d9b052bc7..5cdf08e9a5 100644
--- a/rts/RtsFlags.c
+++ b/rts/RtsFlags.c
@@ -1745,7 +1745,7 @@ openStatsFile (char *filename, // filename, or NULL
f = NULL; /* NULL means use debugBelch */
} else {
if (*filename != '\0') { /* stats file specified */
- f = __rts_fopen (filename,"w");
+ f = __rts_fopen (filename,"w+");
} else {
if (filename_fmt == NULL) {
errorBelch("Invalid stats filename format (NULL)\n");
@@ -1755,7 +1755,7 @@ openStatsFile (char *filename, // filename, or NULL
char stats_filename[STATS_FILENAME_MAXLEN];
snprintf(stats_filename, STATS_FILENAME_MAXLEN, filename_fmt,
prog_name);
- f = __rts_fopen (stats_filename,"w");
+ f = __rts_fopen (stats_filename,"w+");
}
if (f == NULL) {
errorBelch("Can't open stats file %s\n", filename);
diff --git a/rts/eventlog/EventLogWriter.c b/rts/eventlog/EventLogWriter.c
index 9f6f487d8e..4b486926a7 100644
--- a/rts/eventlog/EventLogWriter.c
+++ b/rts/eventlog/EventLogWriter.c
@@ -82,7 +82,7 @@ initEventLogFileWriter(void)
char *event_log_filename = outputFileName();
/* Open event log file for writing. */
- if ((event_log_file = __rts_fopen(event_log_filename, "wb")) == NULL) {
+ if ((event_log_file = __rts_fopen(event_log_filename, "wb+")) == NULL) {
sysErrorBelch(
"initEventLogFileWriter: can't open %s", event_log_filename);
stg_exit(EXIT_FAILURE);