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:
parent
8abe7bfb2f
commit
9f2e3be4e8
|
@ -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 @@ static int prepare_script_environment(HINSTANCE hPython)
|
|||
* 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 @@ run_installscript(HINSTANCE hPython, char *pathname, int argc, char **argv)
|
|||
{
|
||||
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 @@ run_installscript(HINSTANCE hPython, char *pathname, int argc, char **argv)
|
|||
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 @@ run_installscript(HINSTANCE hPython, char *pathname, int argc, char **argv)
|
|||
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 @@ run_installscript(HINSTANCE hPython, char *pathname, int argc, char **argv)
|
|||
|
||||
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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue