From: Stas B. <sta...@gm...> - 2013-08-22 20:56:36
|
Eric Schulte <sch...@gm...> writes: > Stas Boukarev <sta...@gm...> writes: > >> Eric Schulte <sch...@gm...> writes: >> >>> Stas Boukarev <sta...@gm...> writes: >>> >>>> Eric Schulte <sch...@gm...> writes: >>>> >>>>> SBCL build with the attached patch fixes this bug on my system. >>>>> >>>>> >>>>>>From 940504fb930ad823cfdf9cf8061fda49a4efaecb Mon Sep 17 00:00:00 2001 >>>>> From: Eric Schulte <sch...@gm...> >>>>> Date: Thu, 22 Aug 2013 09:32:01 -0600 >>>>> Subject: [PATCH] use readlink to find pipe files when realpath fails >>>>> >>>>> The fix only impacts runtime behavior when the call to realpath fails >>>>> to find an existing file. In this case before failing readlink is >>>>> called, and if a pipe is found in the file location, then the location >>>>> of the original file is returned by (query-file-system * :truename). >>>>> >>>>> With this change `open' may be called on pipe file handles. This >>>>> fixes errors trying to read from /proc/self/fd/* file handles on Linux >>>>> systems, e.g. as generated by command line redirects. >>>> This (string= (subseq (sb!unix:unix-readlink filename) 0 4) "pipe") >>>> is both wasteful (copying the sequence) and incorrect (if the string >>>> length is less than 4). >>>> (and (>= (length string) 4) (string= string "pipe" :end1 4)) solves >>>> this. >>> >>> Thanks for pointing this out. >>> >>> An updated version of the patch is attached. >> >> What about socket:... files? >> Since the call to stat(2) succeeded, why not just return the unresolved >> pathname? > > Sure, the following makes sense to me, and is certainly simpler. I've got a better idea, the non-existp branch already deals with broken symlinks, I put it into a flet, and then did (cond (realpath) ((resolve-problematic-symlink t)) (t (fail "couldn't resolve ~A" filename errno))) This gives: (probe-file "/proc/self/fd/1") => #P"/proc/23341/fd/1" and (probe-file "/proc/self/fd/./1") => #P"/proc/23341/fd/1" I'll commit it after the freeze, and probably will try to split query-file-system into smaller functions, since now it's even more unwieldy. -- With best regards, Stas. |