[PR,python/18938] source -s foo.py with foo.py a symlink to foo.notpy fails
Commit Message
Hi.
This patch fixes 18938.
If one has foo.py as a symlink to foo.notpy, then "source -s foo.py"
will fail because gdb will try to interpret the extension language
from the realpath'd form of the file.
2015-09-08 Doug Evans <dje@google.com>
PR python/18938
* cli/cli-cmds (source_script_fron_sctream): New arg file_to_open.
All callers updated.
gdb_test "python print (gdb.objfiles())" "\\\[\\\]"
Comments
On Tue, Sep 8, 2015 at 2:34 PM, Doug Evans <dje@google.com> wrote:
>
> Hi.
>
> This patch fixes 18938.
>
> If one has foo.py as a symlink to foo.notpy, then "source -s foo.py"
> will fail because gdb will try to interpret the extension language
> from the realpath'd form of the file.
>
> 2015-09-08 Doug Evans <dje@google.com>
>
> PR python/18938
> * cli/cli-cmds (source_script_fron_sctream): New arg file_to_open.
> All callers updated.
btw, missing c/l entry for python.exp already fixed in my sandbox. :-)
On Tue, Sep 8, 2015 at 2:37 PM, Doug Evans <dje@google.com> wrote:
> On Tue, Sep 8, 2015 at 2:34 PM, Doug Evans <dje@google.com> wrote:
>>
>> Hi.
>>
>> This patch fixes 18938.
>>
>> If one has foo.py as a symlink to foo.notpy, then "source -s foo.py"
>> will fail because gdb will try to interpret the extension language
>> from the realpath'd form of the file.
>>
>> 2015-09-08 Doug Evans <dje@google.com>
>>
>> PR python/18938
>> * cli/cli-cmds (source_script_fron_sctream): New arg file_to_open.
>> All callers updated.
>
>
> btw, missing c/l entry for python.exp already fixed in my sandbox. :-)
Committed.
@@ -538,10 +538,16 @@ find_and_open_script (const char *script_file, int
search_path,
return 1;
}
-/* Load script FILE, which has already been opened as STREAM. */
+/* Load script FILE, which has already been opened as STREAM.
+ FILE_TO_OPEN is the form of FILE to use if one needs to open the file.
+ This is provided as FILE may have been found via the source search path.
+ An important thing to note here is that FILE may be a symlink to a file
+ with a different or non-existing suffix, and thus one cannot infer the
+ extension language from FILE_TO_OPEN. */
static void
-source_script_from_stream (FILE *stream, const char *file)
+source_script_from_stream (FILE *stream, const char *file,
+ const char *file_to_open)
{
if (script_ext_mode != script_ext_off)
{
@@ -556,7 +562,7 @@ source_script_from_stream (FILE *stream, const char
*file)
= ext_lang_script_sourcer (extlang);
gdb_assert (sourcer != NULL);
- sourcer (extlang, stream, file);
+ sourcer (extlang, stream, file_to_open);
return;
}
else if (script_ext_mode == script_ext_soft)
@@ -609,7 +615,7 @@ source_script_with_search (const char *file, int
from_tty, int search_path)
anyway so that error messages show the actual file used. But only do
this if we (may have) used search_path, as printing the full path in
errors for the non-search case can be more noise than signal. */
- source_script_from_stream (stream, search_path ? full_path : file);
+ source_script_from_stream (stream, file, search_path ? full_path : file);
do_cleanups (old_cleanups);
}
b/gdb/testsuite/gdb.python/python.exp
@@ -96,6 +96,19 @@ gdb_test "source $remote_source2_py" "yes" "source
source2.py"
gdb_test "source -s source2.py" "yes" "source -s source2.py"
+set remote_source2_symlink_notpy \
+ [gdb_remote_download host ${srcdir}/${subdir}/source2.py \
+ [standard_output_file "source2-symlink.notpy"]]
+set remote_source2_symlink_py [standard_output_file "source2-symlink.py"]
+remote_file host delete $remote_source2_symlink_py
+set status [remote_exec host "ln -sf $remote_source2_symlink_notpy
$remote_source2_symlink_py"]
+set test "source -s source2-symlink.py"
+if {[lindex $status 0] == 0} {
+ gdb_test "source -s $remote_source2_symlink_py" "yes" $test
+} else {
+ unsupported "$test (host does not support symbolic links)"
+}
+
gdb_test "python print (gdb.current_objfile())" "None"