[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