[Python-checkins] python/dist/src/PC/bdist_wininst install.c, 1.14, 1.15

theller at users.sourceforge.net theller at users.sourceforge.net
Thu Feb 3 21:35:12 CET 2005


Update of /cvsroot/python/python/dist/src/PC/bdist_wininst
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23581

Modified Files:
	install.c 
Log Message:
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.

Already backported.


Index: install.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/PC/bdist_wininst/install.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- install.c	3 Feb 2005 20:11:28 -0000	1.14
+++ install.c	3 Feb 2005 20:35:10 -0000	1.15
@@ -88,6 +88,11 @@
 #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"
 
@@ -671,7 +676,7 @@
  * 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.
  */
@@ -681,7 +686,7 @@
 {
 	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 *, Py_BuildValue, (char *, ...));
 	DECLPROC(hPython, PyObject *, PyCFunction_New,
@@ -690,10 +695,10 @@
 	DECLPROC(hPython, PyObject *, PyErr_Format, (PyObject *, char *));
 
 	int result = 0;
-	FILE *fp;
+	int fh;
 
 	if (!Py_Initialize || !PySys_SetArgv
-	    || !PyRun_SimpleFile || !Py_Finalize)
+	    || !PyRun_SimpleString || !Py_Finalize)
 		return 1;
 	
 	if (!Py_BuildValue || !PyArg_ParseTuple || !PyErr_Format)
@@ -705,8 +710,8 @@
 	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;
@@ -718,10 +723,22 @@
 
 	prepare_script_environment(hPython);
 	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;
 }



More information about the Python-checkins mailing list