From: Roger Willcocks <roger@filmlight.ltd.uk>
To: Tim Shimmin <tes@sgi.com>
Cc: xfs@oss.sgi.com
Subject: Re: bug: truncate to zero + setuid
Date: Mon, 29 Oct 2007 18:56:16 +0000 [thread overview]
Message-ID: <47262CD0.5010708@filmlight.ltd.uk> (raw)
In-Reply-To: <47252F62.6030503@sgi.com>
Tim Shimmin wrote:
> Hi Roger,
>
> Roger Willcocks wrote:
>> The nfsv3 setattr call permits a simultaneous truncate + setuid/gid
>> operation. Normally XFS handles this fine, but if the file's being
>> truncated to zero, and the file's already empty, XFS simply ignores
>> the setuid/gid part, returning 'success'.
>>
>> The error's in xfs_vnodeops.c/xfs_setattr below the comment 'Short
>> circuit the truncate case for zero length files', which bypasses all
>> other changes.
>>
>> The simplest fix is to test whether this is the only change that's
>> happening, otherwise you get tangled in transactions.
>>
>> if (mask & XFS_AT_SIZE) {
>> /* Short circuit the truncate case for zero length
>> files */
>> - if ((vap->va_size == 0) &&
>> + if (((mask & ~XFS_AT_SIZE) == 0) && (vap->va_size ==
>> 0) &&
>> (ip->i_d.di_size == 0) && (ip->i_d.di_nextents ==
>> 0)) {
>>
>>
>> --
>> Roger
>>
>
> Yeah, I see your problem.
> It is interesting to know how much of multiple actions (different
> bits of mask) are supported.
> XFS_AT_UPDTIMES doesn't support anything else and will return quickly.
> As far as code which goes via error_return, it looks like the
> only non-error case is the short-circuit one mentioned above -
> truncating to zero an already zeroed file.
>
> I see your fix will get what we want although, it will mean that we
> will go thru the truncating path when we don't need to.
> It would be nice if we could act like the XFS_AT_SIZE was never set
> on the call in the case that other bits are set.
> Though when we first test the AT_SIZE, we don't have the inode locked.
> And I presume in that case we don't necessarily need to send a
> DMAPI truncate event?
> So I wonder if before the 1st AT_SIZE test that we have now,
> in the AT_SIZE case and with other bits set,
> we could lock the inode and test
> for the zero truncate of zero-len file and if so then remove the
> AT_SIZE bit
> and then go on to the other testing as if AT_SIZE was never set.
> Hmmm, may be that just complicates things too much.
>
Yes I looked at simply unsetting the XFS_AT_SIZE bit (you'd also need to set
timeflags appropriately) but the problem is the bit's used to check when
to create
a transaction - either up front as XFS_TRANS_SETATTR_NOT_SIZE, or
later on, after the inode's been locked and unlocked again, as
XFS_TRANS_SETATTR_SIZE. So if you unset the bit (and there's still more
to do) you need to build a not_size transaction, at which point you
might as well
rewrite the whole routine...
--
Roger
next prev parent reply other threads:[~2007-10-29 18:56 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-10-28 14:36 bug: truncate to zero + setuid Roger Willcocks
2007-10-29 0:54 ` Tim Shimmin
2007-10-29 18:56 ` Roger Willcocks [this message]
2007-10-30 4:06 ` Timothy Shimmin
2007-10-30 17:28 ` Roger Willcocks
2007-11-02 1:11 ` Timothy Shimmin
2007-11-04 11:59 ` Roger Willcocks
2007-11-08 3:13 ` Timothy Shimmin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=47262CD0.5010708@filmlight.ltd.uk \
--to=roger@filmlight.ltd.uk \
--cc=tes@sgi.com \
--cc=xfs@oss.sgi.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox