Commits

Thomas Heller  committed c1641ee

Running a bdist_wininst installer, built with Python 2.3, installing
for Python 2.4 caused a segfault when post_install_script was used.

The reason was that the file handle passed to PyRun_SimpleFile() was
created with MSVCRT.DLL, but Python 2.4 uses MSVCR71.DLL.

So, I replaced PyRun_SimpleFile() with PyRun_SimpleString(). The
segfault is gone, but the output of the postinstall script doesn't
show up, because still freopen() from MSVCRT is used.

(I would be very gratefull if someone proofreads the patch, at least).

  • Participants
  • Parent commits ae73286
  • Branches 2.3

Comments (0)

Files changed (1)

File PC/bdist_wininst/install.c

 #include <stdarg.h>
 #include <string.h>
 #include <time.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <malloc.h>
+#include <io.h>
+#include <fcntl.h>
 
 #include "archive.h"
 
  * 1 if the Python-dll does not export the functions we need
  * 2 if no install-script is specified in pathname
  * 3 if the install-script file could not be opened
- * the return value of PyRun_SimpleFile() otherwise,
+ * the return value of PyRun_SimpleString() otherwise,
  * which is 0 if everything is ok, -1 if an exception had occurred
  * in the install-script.
  */
 {
 	DECLPROC(hPython, void, Py_Initialize, (void));
 	DECLPROC(hPython, int, PySys_SetArgv, (int, char **));
-	DECLPROC(hPython, int, PyRun_SimpleFile, (FILE *, char *));
+	DECLPROC(hPython, int, PyRun_SimpleString, (char *));
 	DECLPROC(hPython, void, Py_Finalize, (void));
 	DECLPROC(hPython, PyObject *, PyImport_ImportModule, (char *));
 	DECLPROC(hPython, int, PyObject_SetAttrString,
 	PyObject *mod;
 
 	int result = 0;
-	FILE *fp;
+	int fh;
 
 	if (!Py_Initialize || !PySys_SetArgv
-	    || !PyRun_SimpleFile || !Py_Finalize)
+	    || !PyRun_SimpleString || !Py_Finalize)
 		return 1;
 	
 	if (!PyImport_ImportModule || !PyObject_SetAttrString
 	if (pathname == NULL || pathname[0] == '\0')
 		return 2;
 
-	fp = fopen(pathname, "r");
-	if (!fp) {
+	fh = open(pathname, _O_RDONLY);
+	if (-1 == fh) {
 		fprintf(stderr, "Could not open postinstall-script %s\n",
 			pathname);
 		return 3;
 	}
-
 	SetDlgItemText(hDialog, IDC_INFO, "Running Script...");
 		
 	Py_Initialize();
 	}
 
 	PySys_SetArgv(argc, argv);
-	result = PyRun_SimpleFile(fp, pathname);
+	result = 3;
+	{
+		struct _stat statbuf;
+		if(0 == _fstat(fh, &statbuf)) {
+			char *script = alloca(statbuf.st_size + 5);
+			int n = read(fh, script, statbuf.st_size);
+			if (n > 0) {
+				script[n] = '\n';
+				script[n+1] = 0;
+				result = PyRun_SimpleString(script);
+			}
+		}
+	}
 	Py_Finalize();
 
-	fclose(fp);
+	close(fh);
 
 	return result;
 }