From: Thomas Heller Date: Tue, 25 Jan 2005 20:46:48 +0000 (+0000) Subject: Running a bdist_wininst installer, built with Python 2.3, installing X-Git-Tag: v2.3.5c1~5 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f725bdb5c704e07578c7bbdd4c853f1e07fd3d16;p=thirdparty%2FPython%2Fcpython.git 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). --- 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; }