From f725bdb5c704e07578c7bbdd4c853f1e07fd3d16 Mon Sep 17 00:00:00 2001 From: Thomas Heller Date: Tue, 25 Jan 2005 20:46:48 +0000 Subject: [PATCH] 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). --- PC/bdist_wininst/install.c | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/PC/bdist_wininst/install.c b/PC/bdist_wininst/install.c index c9fe44ff1f84..c4c97adeb79e 100644 --- a/PC/bdist_wininst/install.c +++ b/PC/bdist_wininst/install.c @@ -87,6 +87,11 @@ #include #include #include +#include +#include +#include +#include +#include #include "archive.h" @@ -573,7 +578,7 @@ PyMethodDef meth[] = { * 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. */ @@ -583,7 +588,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 *, PyImport_ImportModule, (char *)); DECLPROC(hPython, int, PyObject_SetAttrString, @@ -599,10 +604,10 @@ run_installscript(HINSTANCE hPython, char *pathname, int argc, char **argv) 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 @@ -622,13 +627,12 @@ 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; } - SetDlgItemText(hDialog, IDC_INFO, "Running Script..."); Py_Initialize(); @@ -647,10 +651,22 @@ run_installscript(HINSTANCE hPython, char *pathname, int argc, char **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(); - fclose(fp); + close(fh); return result; } -- 2.47.3