]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Running a bdist_wininst installer, built with Python 2.3, installing
authorThomas Heller <theller@ctypes.org>
Tue, 25 Jan 2005 20:46:48 +0000 (20:46 +0000)
committerThomas Heller <theller@ctypes.org>
Tue, 25 Jan 2005 20:46:48 +0000 (20:46 +0000)
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

index c9fe44ff1f842d59411d1b52dfcb03f386015325..c4c97adeb79e8b5e6cc9d383b633537377129d22 100644 (file)
 #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"
 
@@ -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;
 }