[PATCH] Prevent the overwriting of global errno in set file info code path.
Surbhi Palande
Surbhi.Palande at canonical.com
Wed Mar 17 02:34:51 MDT 2010
Hi,
On Tue, 2010-03-16 at 20:20 +0100, Volker Lendecke wrote:
> On Tue, Mar 16, 2010 at 10:10:07AM +0200, Surbhi Palande wrote:
> > BugLink: http://launchpad.net/bugs/276472
> >
> > In the code path for setting the file info, the set_unix_posix_default_acl()
> > calls set_unix_posix_default_acl() for setting the posix acl. The mapping of
> > the unix errors to NT errors is based on the global error numbers set by the
> > set_unix_posix_default_acl(). However this error number is overwritten by
> > a call to SMB_VFS_SYS_ACL_FREE_ACL() before returning from
> > set_unix_posix_default_acl(). The overwritten value is a -EINVAL. This
> > translates to the NT_STATUS_ACCESS_DENIED instead of the expected
> > NT_STATUS_NOT_SUPPORTED error code.
>
> While the patch looks correct and does not hurt, I would
> like to know a bit more why it is necessary. Why does
> acl_free set errno at all? Looking at the manpage I get the
> impression that it should only set errno if it returns -1.
Thats correct. I did a saving of the errno in the
posixacl_sys_acl_set_file() as a safety check, since our intention is to
have the errno from the acl_set_file(). Normally speaking this should
not get overwritten at this point. The actual overwriting of errno is
done by the call to SMB_VFS_SYS_ACL_FREE_ACL() (called from
set_unix_posix_default_acl)
> Why in this routine would it set EINVAL? It seems to point
> at a different bug if acl_free does not like the acl we give
> it.
The -EINVAL setting/overwriting takes place by the call to
SMB_VFS_SYS_ACL_FREE_ACL() (which does a free of an acl entry which is
already freed by acl_free() called previously).
> Before pushing it, can you explain what's going on in your
> case?
This is something that happens every single time when you do a cp -p
file1 file2. cp -p calls a fgetxattr() with a
"system.posix_acl_access" which should be returning to the client an
"Operation not supported" on an underneath extended fs (on the server
side). But instead the error returned is a "Permission denied" to the
client side.
>
> Thanks,
>
> Volker
Ideally speaking, should not posixacl_sys_acl_set_file() be returning
the errno (or or errno) that its interested in? However doing so,
requires changes at quiet a few places and thats why I took the lesser
affecting path in this patch.
Thanks!
Warm Regards,
Surbhi.
More information about the samba-technical
mailing list