rts: Always truncate output files
authorBen Gamari <ben@smart-cactus.org>
Fri, 26 Jul 2019 14:32:25 +0000 (10:32 -0400)
committerMarge Bot <ben+marge-bot@smart-cactus.org>
Sat, 3 Aug 2019 02:20:50 +0000 (22:20 -0400)
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.

rts/Hpc.c
rts/ProfHeap.c
rts/Profiling.c
rts/RtsFlags.c
rts/eventlog/EventLogWriter.c

index 9ba9b04..abf8543 100644 (file)
--- 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);
   }
 
index 1023f7c..cc99e37 100644 (file)
@@ -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;
index f340a63..b91129e 100644 (file)
@@ -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
index 8d9b052..5cdf08e 100644 (file)
@@ -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);
index 9f6f487..4b48692 100644 (file)
@@ -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);