Message ID | 1420804567-15371-1-git-send-email-dominique.martinet@cea.fr (mailing list archive) |
---|---|
State | Awaiting Upstream, archived |
Headers | show |
On Fri, Jan 09, 2015 at 12:56:07PM +0100, Dominique Martinet wrote: > If p9_client_lock_dotl returns an error, status is possibly never filled > but will be used in the following switch. > Initializing it to P9_LOCK_ERROR makes sur we will return an error and > cleanup (and not hit the default case). That's what my patch[1] fixes. http://marc.info/?i=1419858019-116944-1-git-send-email-kirill.shutemov%40linux.intel.com
Kirill A. Shutemov wrote on Fri, Jan 09, 2015 at 02:33:53PM +0200: > On Fri, Jan 09, 2015 at 12:56:07PM +0100, Dominique Martinet wrote: > > If p9_client_lock_dotl returns an error, status is possibly never filled > > but will be used in the following switch. > > Initializing it to P9_LOCK_ERROR makes sur we will return an error and > > cleanup (and not hit the default case). > > That's what my patch[1] fixes. > > http://marc.info/?i=1419858019-116944-1-git-send-email-kirill.shutemov%40linux.intel.com Actually, it's slightly different and still worth adding (mine if we apply your's first and your's if we apply mine first - don't think they'll conflict. I even reworded the (too old!) commit message to fit with your patch :)) Your patch will not BUG() if status is junk, BUT if status uninitialized value is 0 and p9_client_lock_dotl then we'll return res=0 (success) and not unlock before returning. My patch makes sure we'll return -ENOLCK. Likewise, if we only apply my patch then a rogue server could BUG() a client, so we want your's anyway.
On Fri, Jan 09, 2015 at 02:07:23PM +0100, Dominique Martinet wrote: > Kirill A. Shutemov wrote on Fri, Jan 09, 2015 at 02:33:53PM +0200: > > On Fri, Jan 09, 2015 at 12:56:07PM +0100, Dominique Martinet wrote: > > > If p9_client_lock_dotl returns an error, status is possibly never filled > > > but will be used in the following switch. > > > Initializing it to P9_LOCK_ERROR makes sur we will return an error and > > > cleanup (and not hit the default case). > > > > That's what my patch[1] fixes. > > > > http://marc.info/?i=1419858019-116944-1-git-send-email-kirill.shutemov%40linux.intel.com > > Actually, it's slightly different and still worth adding (mine if we > apply your's first and your's if we apply mine first - don't think > they'll conflict. I even reworded the (too old!) commit message to fit > with your patch :)) > > Your patch will not BUG() if status is junk, BUT if status uninitialized > value is 0 and p9_client_lock_dotl then we'll return res=0 (success) and > not unlock before returning. My patch makes sure we'll return -ENOLCK. No, if p9_client_lock_dotl() return 0 it must set status. If it's not, that's bug on p9_client_lock_dotl() side and must be fixed.
Kirill A. Shutemov wrote on Fri, Jan 09, 2015 at 03:20:51PM +0200: > > Your patch will not BUG() if status is junk, BUT if status uninitialized > > value is 0 and p9_client_lock_dotl then we'll return res=0 (success) and > > not unlock before returning. My patch makes sure we'll return -ENOLCK. > > No, if p9_client_lock_dotl() return 0 it must set status. If it's not, > that's bug on p9_client_lock_dotl() side and must be fixed. I had that bit right, but I only remembered your second patch -- sorry. It should be fine with your patchES, please disregard this one.
diff --git a/fs/9p/vfs_file.c b/fs/9p/vfs_file.c index 5594505..9b02849 100644 --- a/fs/9p/vfs_file.c +++ b/fs/9p/vfs_file.c @@ -149,7 +149,7 @@ static int v9fs_file_do_lock(struct file *filp, int cmd, struct file_lock *fl) { struct p9_flock flock; struct p9_fid *fid; - uint8_t status; + uint8_t status = P9_LOCK_ERROR; int res = 0; unsigned char fl_type;
If p9_client_lock_dotl returns an error, status is possibly never filled but will be used in the following switch. Initializing it to P9_LOCK_ERROR makes sur we will return an error and cleanup (and not hit the default case). Signed-off-by: Dominique Martinet <dominique.martinet@cea.fr> --- fs/9p/vfs_file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)