]> granicus.if.org Git - python/commitdiff
Running a bdist_wininst installer, built with Python 2.3, installing
authorThomas Heller <theller@ctypes.org>
Thu, 3 Feb 2005 20:35:10 +0000 (20:35 +0000)
committerThomas Heller <theller@ctypes.org>
Thu, 3 Feb 2005 20:35:10 +0000 (20:35 +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.

Already backported.

PC/bdist_wininst/install.c

index eb65d4cbaf4f220a2a2d0ab5fd1e4ac8b3ebff3c..0ce2371a771d8dedde2df300fd7828a2ac94233f 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"
 
@@ -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;
 }