tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: New sysctl entry: proc.PID.realpath



-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

Thank you for your insight!

On 07.09.2015 13:32, Robert Elz wrote:
> Date:        Mon, 07 Sep 2015 12:24:58 +0200 From:        Kamil 
> Rytarowski <n54%gmx.com@localhost> Message-ID:  <55ED65FA.1000702%gmx.com@localhost>
> 
> | I'm here to get the support for it. At the moment it (cache nits)
> | exceeds my comprehension too.
> 
> What is the semantic you're hoping to provide?   The path that was 
> used to exec the process, or the path that would be used now to
> get the same one?   [The difference is if the binary has been
> (re)moved between when it was exec'd and now.]
> 

The path that was used to execute the process. sysctl(7) can fail
gracefully and its collapse is easier to maintain (through the proper
interface) then almost undefined behavior of /proc/PID/exe.

> The exec time path is easier, and must exist (or the exec would 
> have failed), the current path is more useful, but not guaranteed 
> to exist, and much harder to find.
> 

I'm completely OK with possible failure if the file was moved or removed
.

I don't see need to scan the disk for its possible new location or
name. I prefer to receive failure then get it unexpectedly located
somewhere else.

> Which is wanted depends upon what the real purpose of this is - if 
> it is just to replace the entry in /proc then before doing that
> ask what use that has - does anything really use it, and if so,
> for what, and how well does it work.
> 

I started to search for its usage (readlink over /proc/PID/exe):
1. gdb
2. lldb
3. valgrind
4. Chromium
5. tup
6. GNUStep-base
7. Wireshark
8. Firefox
9. Openglad
10. Alcextra
11. Cafu
12. Caster
13. Physfs
14. jruby-launcher
15. CDE

And then I stopped as there was a set of over 100 more Open Source
projects. [1]

What's the use of /proc/PID/exe, for this please let me cite the
comment from CDE [2]:

      // super hack!  if the program is trying to access the special
      // /proc/self/exe file, return perceived_program_fullpath if
      // available, or else cde-exec will ERRONEOUSLY return the path
      // to the dynamic linker (e.g., ld-linux.so.2).
      //
      // programs like 'java' rely on the value of /proc/self/exe
      // being the true path to the executable, in order to dynamically
      // load libraries based on paths relative to that full path!
      char is_proc_self_exe = (strcmp(filename, "/proc/self/exe") == 0);

      // another super hack!  programs like Google Earth
      // ('googleearth-bin') access /proc/self/exe as /proc/<pid>/exe
      // where <pid> is ITS OWN PID!  be sure to handle that case proper
ly
      // (but don't worry about handling cases where <pid> is the PID of
      // another process).
      //
      // (again, these programs use the real path of /proc/<pid>/exe as
      // a basis for dynamically loading libraries, so we must properly
      // 'fake' this value)
      char* self_pid_name = format("/proc/%d/exe", tcp->pid);

> Others have been suggesting that the use is for debuggers (gdb or 
> whatever). If that's it, and the only reason, then personally I'd 
> just forget it. If someone is debugging a process, but can't even 
> work out where the binary is (or is too lazy to type it) then I'd 
> suggest that they ought to just give up...
> 
> On the other hand, if it is so the debugger can verify that it is
working
> from the correct binary file, then the pathname isn't needed, just 
> the <dev, ino> pair, which is the true name of a unix file 
> (pathnames are just a human interface improvement ... and a bit of 
> added security). With just that, the debugger can verify that the 
> file running
(assuming that
> sysctl (or /proc) provide that info) is the one that the user told
them is
> to be debugged, and issue a warning (or whatever) if the don't 
> match.
> 
> Alternatively, perhaps there's some other use ?
> 
> kre
> 

This sysctl(7) happened to be handy for libproc, as a missing puzzle
for our userland DTrace support. I don't want to focus on every
legitimate usage, as there set of software using it is very wide; I
would focus now on rather providing the software -- in my case lldb(1)
- -- what it expects and let it process further.

To sum it up, the overview gave me the idea that proc.PID.realpath:
- - must be absolute path,
- - preferably canonicalized (links, '.' and '..' resolved) - if so then
call it .realpath, if not then .pathname (to be compatible with FreeBSD)
,
- - pathname of the execution time,
- - missing, moved, removed or replaced file - let the consumer of this
interface handle it on his or her own.

There are in-kernel issues with long path names, as we store limited
number of characters. I would leave this as it is, as the current
limits handle sane number of characters (PATH_MAX is 1024 [3]) for
most normal use-cases.

Both narrow cases (alteration to the executable) and pathname limits
should never happed in a properly designed software and environment.

Why to add another interface for the same thing?
- - safety (hide pathname from unprivileged users),
- - stop depending upon hard-coded path of procfs and its existance,
- - easier error handling through C-language level interface.

My personal use-case is to have full-featured lldb(1) in a procfs-less
system. This includes standard usage, not walk-arounding
environment problems.

[1] According to https://searchcode.com
[2] https://searchcode.com/codesearch/view/96415437/#l-1072
[3] src/sys/sys/syslimits.h
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2

iQIcBAEBCAAGBQJV94lzAAoJEEuzCOmwLnZsu+8P/iusHPrqZsEzJ5/qmAuc51+3
VcZM3nptpGFJ9g/gg25LuSj21I1+b+NyIEbpLsTYYcXbfaWfbRD4LlYoRLwP9kLa
yPfMiDWOJ5DWRigF674AZiRIC/TUzB4ECCVNfHe8twXcpGMIyiqtJITAKwfSBXeV
RpBUc8HusDohRZybEJbJjwLH7GIugvUnoPLoBTB/QTMjs9orjuIu0EU7oDAAZnxY
tCkxH43fXmfmoL+UPavoIh7nD0Z6avPCk29cKodnrMEIR0m7CgtvVPdo/cdrgy6p
/yEndy555KtmG3oFO3qeXsrKiquylpzSx2K1fl921n5bgOGxSoVhkMmJ5RxQfkuV
GbbFU8efoDe4s8QnGm+p93nUIq+OQZMNc5M75mkIu2VkU4BcBcCdBywXoQCAvTh7
MMXQ8e7xddw/ZgG9MaadqS+hwEnrfgMBFsjlbC2LyL8QWYjNai7GSy++ETjx28vY
Tzvi6fT2jQTCHaKl+8mKAR3oRlTSUL/omqSbtkb5D0doq2olWxU3l4aPECz69Mmm
VteBBJfKSdyWPcWAD4fGCbh0QiPDwCZGp7fsuaAfgfUqhyEEWWs/8H+4cOFYf2Ir
RIzWn7equf0cTkHu/5Sq+sm0W1M77xL6i2AksE2i5uG18Wcv0p02lfgU/yvtLRUa
tVJqJp751FBn1qnvngDd
=Sqjh
-----END PGP SIGNATURE-----


Home | Main Index | Thread Index | Old Index