diff options
author | Joel Brobecker <brobecker@gnat.com> | 2011-10-03 20:46:19 +0000 |
---|---|---|
committer | Joel Brobecker <brobecker@gnat.com> | 2011-10-03 20:46:19 +0000 |
commit | 7ed7d7192655d73ac3e39b92403b8e99f45b3572 (patch) | |
tree | 8d6418eda673a2cf223c0cef5f262cb3b49dc826 | |
parent | fb2137004874579d75b623cc374dbc15c426e07e (diff) | |
download | gdb-7ed7d7192655d73ac3e39b92403b8e99f45b3572.zip gdb-7ed7d7192655d73ac3e39b92403b8e99f45b3572.tar.gz gdb-7ed7d7192655d73ac3e39b92403b8e99f45b3572.tar.bz2 |
Crash sourcing Python script on Windows
gdb/ChangeLog:
* python/python.c (python_run_simple_file): New function.
(source_python_script, source_python_script_for_objfile):
Replace call to PyRun_SimpleFile by call to
python_run_simple_file.
-rw-r--r-- | gdb/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/python/python.c | 43 |
2 files changed, 48 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 625bbbb..de4fdc8 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2011-10-03 Joel Brobecker <brobecker@adacore.com> + + * python/python.c (python_run_simple_file): New function. + (source_python_script, source_python_script_for_objfile): + Replace call to PyRun_SimpleFile by call to + python_run_simple_file. + 2011-10-03 Paul Koning <paul_koning@dell.com> * python/py-value.c (valpy_get_address): Use Py_XINCREF. diff --git a/gdb/python/python.c b/gdb/python/python.c index 4ef5715..61c5420 100644 --- a/gdb/python/python.c +++ b/gdb/python/python.c @@ -134,6 +134,45 @@ ensure_python_env (struct gdbarch *gdbarch, return make_cleanup (restore_python_env, env); } +/* A wrapper around PyRun_SimpleFile. FILENAME is the name of + the Python script to run. + + One of the parameters of PyRun_SimpleFile is a FILE *. + The problem is that type FILE is extremely system and compiler + dependent. So, unless the Python library has been compiled using + the same build environment as GDB, we run the risk of getting + a crash due to inconsistencies between the definition used by GDB, + and the definition used by Python. A mismatch can very likely + lead to a crash. + + There is also the situation where the Python library and GDB + are using two different versions of the C runtime library. + This is particularly visible on Windows, where few users would + build Python themselves (this is no trivial task on this platform), + and thus use binaries built by someone else instead. Python, + being built with VC, would use one version of the msvcr DLL + (Eg. msvcr100.dll), while MinGW uses msvcrt.dll. A FILE * + from one runtime does not necessarily operate correctly in + the other runtime. + + To work around this potential issue, we create the FILE object + using Python routines, thus making sure that it is compatible + with the Python library. */ + +static void +python_run_simple_file (const char *filename) +{ + char *filename_copy; + PyObject *python_file; + struct cleanup *cleanup; + + filename_copy = xstrdup (filename); + cleanup = make_cleanup (xfree, filename_copy); + python_file = PyFile_FromString (filename_copy, "r"); + make_cleanup_py_decref (python_file); + PyRun_SimpleFile (PyFile_AsFile (python_file), filename); + do_cleanups (cleanup); +} /* Given a command_line, return a command string suitable for passing to Python. Lines in the string are separated by newlines. The @@ -573,7 +612,7 @@ source_python_script (FILE *stream, const char *file) /* Note: If an exception occurs python will print the traceback and clear the error indicator. */ - PyRun_SimpleFile (stream, file); + python_run_simple_file (file); do_cleanups (cleanup); } @@ -917,7 +956,7 @@ source_python_script_for_objfile (struct objfile *objfile, cleanups = ensure_python_env (get_objfile_arch (objfile), current_language); gdbpy_current_objfile = objfile; - PyRun_SimpleFile (stream, file); + python_run_simple_file (file); do_cleanups (cleanups); gdbpy_current_objfile = NULL; |