Bug 26184 - fullpath_struct_file does not handle struct dentry on 5.6.19-300.fc32.x86_64
Summary: fullpath_struct_file does not handle struct dentry on 5.6.19-300.fc32.x86_64
Status: RESOLVED FIXED
Alias: None
Product: systemtap
Classification: Unclassified
Component: tapsets (show other bugs)
Version: unspecified
: P2 normal
Target Milestone: ---
Assignee: Unassigned
URL:
Keywords:
: 26185 26186 (view as bug list)
Depends on:
Blocks:
 
Reported: 2020-06-30 06:01 UTC by Craig Ringer
Modified: 2022-03-22 18:15 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:
Project(s) to access:
ssh public key:


Attachments
Output from fullpath_struct_file (1.79 KB, text/x-log)
2020-06-30 06:01 UTC, Craig Ringer
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Craig Ringer 2020-06-30 06:01:19 UTC
Created attachment 12671 [details]
Output from fullpath_struct_file

fullpath_struct_file fails in dentry.stp with "type definition 'dentry' not found". Full error output will be provided as attachment.

Command:

$ stap -v -c /bin/false -e 'probe process.begin { printf("%s", fullpath_struct_file(task_current(), current_exe_file())); exit(); }'

semantic error: type definition 'dentry' not found in '': operator '@cast' at /usr/share/systemtap/tapset/linux/dentry.stp:64:15
        source:         s = & @cast(dentry, "dentry")->d_name;

... more errors ... (see attached)

$ uname -r
5.6.19-300.fc32.x86_64

$ rpm -q systemtap
systemtap-4.3-1.fc32.x86_64

$ stap --version
Systemtap translator/driver (version 4.3/0.179, rpm 4.3-1.fc32)
Copyright (C) 2005-2020 Red Hat, Inc. and others
This is free software; see the source for copying conditions.
tested kernel versions: 2.6.32 ... 5.7.0
enabled features: AVAHI BOOST_STRING_REF DYNINST BPF JAVA PYTHON3 LIBRPM LIBSQLITE3 LIBVIRT LIBXML2 NLS NSS READLINE MONITOR_LIBS


The failing command simplifies to:


$ stap -v -c /bin/false -e 'probe process.begin { printf("%s", d_name(0)); exit(); }'
Comment 1 Craig Ringer 2020-06-30 06:04:01 UTC
*** Bug 26185 has been marked as a duplicate of this bug. ***
Comment 2 Craig Ringer 2020-06-30 06:04:44 UTC
*** Bug 26186 has been marked as a duplicate of this bug. ***
Comment 3 Craig Ringer 2020-06-30 09:23:26 UTC
Checked latest git 403e92779, same outcome:

WARNING: Potential type mismatch in reassignment: identifier 'root_dentry' at /usr/local/systemtap/share/systemtap/tapset/linux/dentry.stp:246:3
 source: 		root_dentry = @cast(task, "task_struct", "kernel")->fs->root->dentry
         		^
Comment 4 Craig Ringer 2020-06-30 09:42:12 UTC
Well, similar anyway; it runs, then dies with

ERROR: read fault [man error::fault] at 0x10 near operator '->' at /usr/local/systemtap/share/systemtap/tapset/linux/dentry.stp:267:19

but the warnings from the latest git match the errors from the packaged version.
Comment 5 Guillaume Morin 2021-05-26 22:06:21 UTC
This appears to be still present in systemtap 4.5.

This simple workaround seems to fix the problem:

--- a/tapset/linux/dentry.stp  2021-05-26 17:44:48.283925000 -0400
+++ b/tapset/linux/dentry.stp        2021-05-26 17:44:59.122807962 -0400
@@ -264,7 +264,7 @@
                        /* RHEL7+ kernels */
                        if (! @type_member_defined("vfsmount", mnt_parent)) {
                                /* Global root? */
-                               if (mnt != mnt->mnt_parent) {
+                               if (mnt && mnt != mnt->mnt_parent) {
                                        dentry = mnt->mnt_mountpoint
                                        vfsmnt = & mnt->mnt_parent->mnt
                                        mnt = mnt->mnt_parent

However, mnt should not be 0 at that point in the code. The mnt var should be defined if @type_member_defined("mount", mnt_parent) is true and it should be the case in any kernel released in the past 10 years.

_But_ I verified that it does not evaluate to true with the example given by the original reporter (stap -v -c /bin/false -e 'probe process.begin { printf("%s\n", fullpath_struct_file(task_current(), current_exe_file())); exit(); }').

I also can reproduce with a completely different example (a longer one). I could provide it if necessary but the original reproducer is simple enough.

It does look like a bug similar to https://sourceware.org/bugzilla/show_bug.cgi?id=20672
Comment 6 William Cohen 2022-03-22 18:15:17 UTC
This looks to be fixed by commit 3739d47c4cc427ce4818d884f429a3efa85c38ae 

$ uname -a
Linux fedora32 5.11.22-100.fc32.x86_64 #1 SMP Wed May 19 18:58:25 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
$ sudo ../install/bin/stap -v -c /bin/false -e 'probe process.begin { printf("%s", fullpath_struct_file(task_current(), current_exe_file())); exit(); }'
Pass 1: parsed user script and 482 library scripts using 330920virt/94860res/17164shr/77736data kb, in 110usr/30sys/145real ms.
Pass 2: analyzed script: 1 probe, 31 functions, 2 embeds, 0 globals using 492840virt/258500res/18852shr/239656data kb, in 1190usr/390sys/1602real ms.
Pass 3: translated to C into "/tmp/stapZC6Ukv/stap_e758ceff27992605c6d07aaf7c9484a8_14053_src.c" using 492840virt/258628res/18980shr/239656data kb, in 0usr/60sys/69real ms.
Pass 4: compiled C into "stap_e758ceff27992605c6d07aaf7c9484a8_14053.ko" in 11480usr/1640sys/13231real ms.
Pass 5: starting run.
WARNING: Child process exited with status 1
/home/wcohen/systemtap_write/install/libexec/systemtap/stapioWARNING: /home/wcohen/systemtap_write/install/bin/staprun exited with status: 1
Pass 5: run completed in 10usr/30sys/301real ms.
Pass 5: run failed.  [man error::pass5]