patches/Python25-06-write_compiled_module-atomic.diff
author rohinis
Tue, 29 Nov 2011 17:32:55 +0000
branchs11express-2010-11
changeset 22234 c23e64da3e06
parent 13290 93b9e959e744
permissions -rw-r--r--
2011-11-29 Rohini S <[email protected]> * patches/Python26-22-audio.diff: Fixes CVE-2010-1634 * specs/SUNWPython26.spec: Fixes CR 7085446
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
13290
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
     1
--- Python-2.5.1/Python/import.c.atomic	2007-08-08 20:51:41.313394000 -0400
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
     2
+++ Python-2.5.1/Python/import.c	2007-08-08 21:01:57.640451000 -0400
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
     3
@@ -858,19 +858,28 @@
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
     4
 
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
     5
 /* Write a compiled module to a file, placing the time of last
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
     6
    modification of its source into the header.
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
     7
-   Errors are ignored, if a write error occurs an attempt is made to
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
     8
-   remove the file. */
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
     9
+   Write to a temporary file first so that creating the file is atomic.
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    10
+   Errors are ignored, if a write/unlink/rename error occurs an attempt
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    11
+   is made to remove the temporary file. */
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    12
 
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    13
 static void
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    14
 write_compiled_module(PyCodeObject *co, char *cpathname, time_t mtime)
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    15
 {
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    16
 	FILE *fp;
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    17
+	char *tmppathname;
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    18
 
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    19
-	fp = open_exclusive(cpathname);
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    20
+	/* the temporary file is called cpathname + ".tmp" */
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    21
+        if ((tmppathname = PyMem_Malloc(strlen(cpathname) + strlen(".tmp") + 1))
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    22
+	    == NULL) {
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    23
+	  return;
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    24
+	}
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    25
+	sprintf (tmppathname, "%s.tmp", cpathname);
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    26
+	fp = open_exclusive(tmppathname);
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    27
 	if (fp == NULL) {
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    28
 		if (Py_VerboseFlag)
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    29
 			PySys_WriteStderr(
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    30
-				"# can't create %s\n", cpathname);
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    31
+				"# can't create %s\n", tmppathname);
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    32
+		PyMem_Free(tmppathname);
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    33
 		return;
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    34
 	}
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    35
 	PyMarshal_WriteLongToFile(pyc_magic, fp, Py_MARSHAL_VERSION);
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    36
@@ -879,10 +888,11 @@
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    37
 	PyMarshal_WriteObjectToFile((PyObject *)co, fp, Py_MARSHAL_VERSION);
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    38
 	if (fflush(fp) != 0 || ferror(fp)) {
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    39
 		if (Py_VerboseFlag)
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    40
-			PySys_WriteStderr("# can't write %s\n", cpathname);
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    41
+			PySys_WriteStderr("# can't write %s\n", tmppathname);
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    42
 		/* Don't keep partial file */
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    43
 		fclose(fp);
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    44
-		(void) unlink(cpathname);
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    45
+		(void) unlink(tmppathname);
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    46
+		PyMem_Free(tmppathname);
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    47
 		return;
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    48
 	}
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    49
 	/* Now write the true mtime */
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    50
@@ -891,8 +901,30 @@
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    51
 	PyMarshal_WriteLongToFile((long)mtime, fp, Py_MARSHAL_VERSION);
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    52
 	fflush(fp);
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    53
 	fclose(fp);
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    54
+	/* Delete the old compiled file, if exists */
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    55
+	if (unlink (cpathname)) {
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    56
+		if ((errno != ENOENT)) {
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    57
+			/* the file exists but could not be deleted */
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    58
+			if (Py_VerboseFlag)
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    59
+				PySys_WriteStderr(
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    60
+					"# can't unlink %s\n", cpathname);
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    61
+			(void) unlink(tmppathname);
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    62
+			PyMem_Free(tmppathname);
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    63
+			return;
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    64
+		}
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    65
+	}
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    66
+	/* rename the tmp file to the real file name */
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    67
+	if (rename (tmppathname, cpathname)) {
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    68
+		if (Py_VerboseFlag)
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    69
+			PySys_WriteStderr(
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    70
+				"# can't rename %s to %s\n", tmppathname, cpathname);
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    71
+		(void) unlink(tmppathname);
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    72
+		PyMem_Free(tmppathname);
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    73
+		return;
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    74
+	}
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    75
 	if (Py_VerboseFlag)
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    76
 		PySys_WriteStderr("# wrote %s\n", cpathname);
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    77
+	PyMem_Free(tmppathname);
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    78
 }
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    79
 
93b9e959e744 2008-08-27 Laszlo (Laca) Peter <[email protected]>
laca
parents:
diff changeset
    80