summaryrefslogtreecommitdiffstats
path: root/patches/02_bzip2recover-race-open-output.patch
blob: 3a91e97d22bda8ceb8e9725e444fbaadf232d39f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Description: fix unsafe race condition in opening output files.
Author: Colin Phipps <crp22@cam.ac.uk>
Origin: Debian:
 https://salsa.debian.org/debian/bzip2/blob/6baf99d2eb446f50f7986868b7d57e6f4fd9b459/debian/patches/bzip2recover-race-open-output.diff
 https://sources.debian.org/src/bzip2/1.0.6-9/debian/patches/bzip2recover-race-open-output.diff/

--- a/bzip2recover.c
+++ b/bzip2recover.c
@@ -24,6 +24,8 @@
 #include <errno.h>
 #include <stdlib.h>
 #include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
 
 
 /* This program records bit locations in the file to be recovered.
@@ -269,6 +271,19 @@
        name[n-1] == '2');
 }
 
+/*---------------------------------------------*/
+/* Open an output file safely with O_EXCL and good permissions */
+FILE* fopen_output( Char* name, const char* mode )
+{
+  FILE *fp;
+  int   fh;
+
+  fh = open(name, O_WRONLY|O_CREAT|O_EXCL, 0600);
+  if (fh == -1) return NULL;
+  fp = fdopen(fh, mode);
+  if (fp == NULL) close(fh);
+  return fp;
+}
 
 /*---------------------------------------------------*/
 /*---                                             ---*/
@@ -486,7 +501,7 @@
          fprintf ( stderr, "   writing block %d to `%s' ...\n",
                            wrBlock+1, outFileName );
 
-         outFile = fopen ( outFileName, "wb" );
+         outFile = fopen_output ( outFileName, "wb" );
          if (outFile == NULL) {
             fprintf ( stderr, "%s: can't write `%s'\n",
                       progName, outFileName );