[libvirt] [PATCH] virFindFileInPath: only find executable non-directory

Eric Blake eblake at redhat.com
Wed Jan 12 18:15:12 UTC 2011


On 01/12/2011 10:39 AM, Daniel P. Berrange wrote:
> On Wed, Jan 12, 2011 at 09:24:57AM -0700, Eric Blake wrote:
>> Without this patch, at least tests/daemon-conf (which sticks
>> $builddir/src in the PATH) tries to execute the directory
>> $builddir/src/qemu rather than the real /usr/bin/qemu binary.
> 
> Not looking at your patch, I have to question why on earth
> the script is adding $builddir/src to the $PATH ? There are
> no command line binaries in src/ anymore, only in tools/
> and it clearly doesn't need any of them if it hasn't also
> added tools/ to $PATH.

tests/Makefile.am is the culprit for that PATH setting:

path_add =
$$abs_top_builddir/src$(PATH_SEPARATOR)$$abs_top_builddir/daemon$(PATH_SEPARATOR)$$abs_top_builddir/tools

TESTS_ENVIRONMENT =                             \
...
  PATH="$(path_add)$(PATH_SEPARATOR)$$PATH"     \

Probably worth a separate cleanup, now that you mention it.

>> +/* Check that a file can be executed by the current user, and is not
>> + * a directory.  */
>> +bool
>> +virFileIsExecutable(const char *file)
>> +{
>> +    struct stat sb;
>> +
>> +    /* The existence of ACLs means that checking (sb.st_mode&0111) for
>> +     * executable bits may give false results; plus, access is
>> +     * lighter-weight than stat for a first pass filter.
>> +     *
>> +     * XXX: should this use gnulib's euidaccess module?
>> +     */
>> +    return (access(file, X_OK) == 0 &&
>> +            stat(file, &sb) == 0 &&
>> +            !S_ISDIR(sb.st_mode));
> 
> If we're doing stat() anyway, it could be better to kill
> the access() check and just check S_IXUSR on sb.sb_mode.
> Yes, that isn't the same as access, but I think we it can
> be argued that we should accept binaries which have any
> 'x' bit set even if we ourselves can't execute them.

Or, conversely, if the go+x bits are set ACLs include u-x (and thus deny
the current user the right to execute them).

> 
> eg, if /usr/bin/qemu was  -rwx-r--r--  then we should
> not skip it. We should pick that binary on the basis
> that the user will probably want to see the EACCESS
> message when we later try to exec() it, so they can
> see the installation bug & fix it.

Fair enough - I'll rewrite the patch to avoid access(X_OK), on the
grounds that ACLs are corner case enough that we don't mind getting the
occasional wrong answer due to ACL weirdness.  Which means:

>
>> Questions:
>>
>> Should I be requiring S_ISREG, rather than !S_ISDIR (that is,
>> should we be rejecting devices and sockets as non-exectuable)?

Still not answered, but I'll go ahead and make that change for v2.

>>
>> Should I import the gnulib module euidaccess (and/or faccessat)
>> for the access check?  Using access(F_OK) is okay regardless of
>> uid/gid, but access(X_OK) may have different answers than
>> euidaccess(X_OK) when the effective uid/gid do not match the
>> current uid/gid.  However, dragging in the gnulib module will
>> require adding an extra link library for some platforms (for
>> example, Solaris needs -lgen), which means the change is more
>> invasive as it will also affect Makefiles.

Answered - avoid access (and thus euidaccess) altogether, and go with
the naive but usually right stat() parsing instead.  v2 coming shortly.

-- 
Eric Blake   eblake at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 619 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20110112/761a5f13/attachment-0001.sig>


More information about the libvir-list mailing list