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.
This commit is contained in:
Thomas Heller 2005-02-03 20:35:10 +00:00
parent 8abe7bfb2f
commit 9f2e3be4e8
1 changed files with 25 additions and 8 deletions

View File

@ -88,6 +88,11 @@
#include <stdarg.h> #include <stdarg.h>
#include <string.h> #include <string.h>
#include <time.h> #include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <malloc.h>
#include <io.h>
#include <fcntl.h>
#include "archive.h" #include "archive.h"
@ -671,7 +676,7 @@ static int prepare_script_environment(HINSTANCE hPython)
* 1 if the Python-dll does not export the functions we need * 1 if the Python-dll does not export the functions we need
* 2 if no install-script is specified in pathname * 2 if no install-script is specified in pathname
* 3 if the install-script file could not be opened * 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 * which is 0 if everything is ok, -1 if an exception had occurred
* in the install-script. * in the install-script.
*/ */
@ -681,7 +686,7 @@ run_installscript(HINSTANCE hPython, char *pathname, int argc, char **argv)
{ {
DECLPROC(hPython, void, Py_Initialize, (void)); DECLPROC(hPython, void, Py_Initialize, (void));
DECLPROC(hPython, int, PySys_SetArgv, (int, char **)); 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, void, Py_Finalize, (void));
DECLPROC(hPython, PyObject *, Py_BuildValue, (char *, ...)); DECLPROC(hPython, PyObject *, Py_BuildValue, (char *, ...));
DECLPROC(hPython, PyObject *, PyCFunction_New, DECLPROC(hPython, PyObject *, PyCFunction_New,
@ -690,10 +695,10 @@ run_installscript(HINSTANCE hPython, char *pathname, int argc, char **argv)
DECLPROC(hPython, PyObject *, PyErr_Format, (PyObject *, char *)); DECLPROC(hPython, PyObject *, PyErr_Format, (PyObject *, char *));
int result = 0; int result = 0;
FILE *fp; int fh;
if (!Py_Initialize || !PySys_SetArgv if (!Py_Initialize || !PySys_SetArgv
|| !PyRun_SimpleFile || !Py_Finalize) || !PyRun_SimpleString || !Py_Finalize)
return 1; return 1;
if (!Py_BuildValue || !PyArg_ParseTuple || !PyErr_Format) if (!Py_BuildValue || !PyArg_ParseTuple || !PyErr_Format)
@ -705,8 +710,8 @@ run_installscript(HINSTANCE hPython, char *pathname, int argc, char **argv)
if (pathname == NULL || pathname[0] == '\0') if (pathname == NULL || pathname[0] == '\0')
return 2; return 2;
fp = fopen(pathname, "r"); fh = open(pathname, _O_RDONLY);
if (!fp) { if (-1 == fh) {
fprintf(stderr, "Could not open postinstall-script %s\n", fprintf(stderr, "Could not open postinstall-script %s\n",
pathname); pathname);
return 3; return 3;
@ -718,10 +723,22 @@ run_installscript(HINSTANCE hPython, char *pathname, int argc, char **argv)
prepare_script_environment(hPython); prepare_script_environment(hPython);
PySys_SetArgv(argc, argv); 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(); Py_Finalize();
fclose(fp); close(fh);
return result; return result;
} }