cifs: Fix missing put_xid in cifs_file_strict_mmap

Message ID 20171215204832.12764-1-willy@infradead.org
State New
Headers show
Series
  • cifs: Fix missing put_xid in cifs_file_strict_mmap
Related show

Commit Message

Matthew Wilcox Dec. 15, 2017, 8:48 p.m.
From: Matthew Wilcox <mawilcox@microsoft.com>

If cifs_zap_mapping() returned an error, we would return without putting
the xid that we got earlier.  Restructure cifs_file_strict_mmap() and
cifs_file_mmap() to be more similar to each other and have a single
point of return that always puts the xid.

Signed-off-by: Matthew Wilcox <mawilcox@microsoft.com>
---
 fs/cifs/file.c | 26 ++++++++++++--------------
 1 file changed, 12 insertions(+), 14 deletions(-)

Comments

Steve French Dec. 15, 2017, 8:51 p.m. | #1
thoughts on whether stable candidate?

On Fri, Dec 15, 2017 at 2:48 PM, Matthew Wilcox <willy@infradead.org> wrote:
> From: Matthew Wilcox <mawilcox@microsoft.com>
>
> If cifs_zap_mapping() returned an error, we would return without putting
> the xid that we got earlier.  Restructure cifs_file_strict_mmap() and
> cifs_file_mmap() to be more similar to each other and have a single
> point of return that always puts the xid.
>
> Signed-off-by: Matthew Wilcox <mawilcox@microsoft.com>
> ---
>  fs/cifs/file.c | 26 ++++++++++++--------------
>  1 file changed, 12 insertions(+), 14 deletions(-)
>
> diff --git a/fs/cifs/file.c b/fs/cifs/file.c
> index df9f682708c6..3a85df2a9baf 100644
> --- a/fs/cifs/file.c
> +++ b/fs/cifs/file.c
> @@ -3471,20 +3471,18 @@ static const struct vm_operations_struct cifs_file_vm_ops = {
>
>  int cifs_file_strict_mmap(struct file *file, struct vm_area_struct *vma)
>  {
> -       int rc, xid;
> +       int xid, rc = 0;
>         struct inode *inode = file_inode(file);
>
>         xid = get_xid();
>
> -       if (!CIFS_CACHE_READ(CIFS_I(inode))) {
> +       if (!CIFS_CACHE_READ(CIFS_I(inode)))
>                 rc = cifs_zap_mapping(inode);
> -               if (rc)
> -                       return rc;
> -       }
> -
> -       rc = generic_file_mmap(file, vma);
> -       if (rc == 0)
> +       if (!rc)
> +               rc = generic_file_mmap(file, vma);
> +       if (!rc)
>                 vma->vm_ops = &cifs_file_vm_ops;
> +
>         free_xid(xid);
>         return rc;
>  }
> @@ -3494,16 +3492,16 @@ int cifs_file_mmap(struct file *file, struct vm_area_struct *vma)
>         int rc, xid;
>
>         xid = get_xid();
> +
>         rc = cifs_revalidate_file(file);
> -       if (rc) {
> +       if (rc)
>                 cifs_dbg(FYI, "Validation prior to mmap failed, error=%d\n",
>                          rc);
> -               free_xid(xid);
> -               return rc;
> -       }
> -       rc = generic_file_mmap(file, vma);
> -       if (rc == 0)
> +       if (!rc)
> +               rc = generic_file_mmap(file, vma);
> +       if (!rc)
>                 vma->vm_ops = &cifs_file_vm_ops;
> +
>         free_xid(xid);
>         return rc;
>  }
> --
> 2.15.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
Matthew Wilcox Dec. 15, 2017, 8:53 p.m. | #2
On Fri, Dec 15, 2017 at 02:51:10PM -0600, Steve French wrote:
> thoughts on whether stable candidate?

Ehm ... your call.  I don't know how serious leaking an XID is.  From
reading the code, it doesn't look too serious.
--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Steve French Dec. 15, 2017, 8:54 p.m. | #3
No - that is not serious - but ... trivial low risk patch ...

I would lean toward no ... unless a customer reported it

On Fri, Dec 15, 2017 at 2:53 PM, Matthew Wilcox <willy@infradead.org> wrote:
> On Fri, Dec 15, 2017 at 02:51:10PM -0600, Steve French wrote:
>> thoughts on whether stable candidate?
>
> Ehm ... your call.  I don't know how serious leaking an XID is.  From
> reading the code, it doesn't look too serious.
Matthew Wilcox Dec. 15, 2017, 9:10 p.m. | #4
On Fri, Dec 15, 2017 at 02:54:54PM -0600, Steve French wrote:
> No - that is not serious - but ... trivial low risk patch ...
> 
> I would lean toward no ... unless a customer reported it

No customer report; code inspection on my part.
--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Steve French Dec. 15, 2017, 9:20 p.m. | #5
merged into cifs-2.6.git for-next

On Fri, Dec 15, 2017 at 2:48 PM, Matthew Wilcox <willy@infradead.org> wrote:
> From: Matthew Wilcox <mawilcox@microsoft.com>
>
> If cifs_zap_mapping() returned an error, we would return without putting
> the xid that we got earlier.  Restructure cifs_file_strict_mmap() and
> cifs_file_mmap() to be more similar to each other and have a single
> point of return that always puts the xid.
>
> Signed-off-by: Matthew Wilcox <mawilcox@microsoft.com>
> ---
>  fs/cifs/file.c | 26 ++++++++++++--------------
>  1 file changed, 12 insertions(+), 14 deletions(-)
>
> diff --git a/fs/cifs/file.c b/fs/cifs/file.c
> index df9f682708c6..3a85df2a9baf 100644
> --- a/fs/cifs/file.c
> +++ b/fs/cifs/file.c
> @@ -3471,20 +3471,18 @@ static const struct vm_operations_struct cifs_file_vm_ops = {
>
>  int cifs_file_strict_mmap(struct file *file, struct vm_area_struct *vma)
>  {
> -       int rc, xid;
> +       int xid, rc = 0;
>         struct inode *inode = file_inode(file);
>
>         xid = get_xid();
>
> -       if (!CIFS_CACHE_READ(CIFS_I(inode))) {
> +       if (!CIFS_CACHE_READ(CIFS_I(inode)))
>                 rc = cifs_zap_mapping(inode);
> -               if (rc)
> -                       return rc;
> -       }
> -
> -       rc = generic_file_mmap(file, vma);
> -       if (rc == 0)
> +       if (!rc)
> +               rc = generic_file_mmap(file, vma);
> +       if (!rc)
>                 vma->vm_ops = &cifs_file_vm_ops;
> +
>         free_xid(xid);
>         return rc;
>  }
> @@ -3494,16 +3492,16 @@ int cifs_file_mmap(struct file *file, struct vm_area_struct *vma)
>         int rc, xid;
>
>         xid = get_xid();
> +
>         rc = cifs_revalidate_file(file);
> -       if (rc) {
> +       if (rc)
>                 cifs_dbg(FYI, "Validation prior to mmap failed, error=%d\n",
>                          rc);
> -               free_xid(xid);
> -               return rc;
> -       }
> -       rc = generic_file_mmap(file, vma);
> -       if (rc == 0)
> +       if (!rc)
> +               rc = generic_file_mmap(file, vma);
> +       if (!rc)
>                 vma->vm_ops = &cifs_file_vm_ops;
> +
>         free_xid(xid);
>         return rc;
>  }
> --
> 2.15.1
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index df9f682708c6..3a85df2a9baf 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -3471,20 +3471,18 @@  static const struct vm_operations_struct cifs_file_vm_ops = {
 
 int cifs_file_strict_mmap(struct file *file, struct vm_area_struct *vma)
 {
-	int rc, xid;
+	int xid, rc = 0;
 	struct inode *inode = file_inode(file);
 
 	xid = get_xid();
 
-	if (!CIFS_CACHE_READ(CIFS_I(inode))) {
+	if (!CIFS_CACHE_READ(CIFS_I(inode)))
 		rc = cifs_zap_mapping(inode);
-		if (rc)
-			return rc;
-	}
-
-	rc = generic_file_mmap(file, vma);
-	if (rc == 0)
+	if (!rc)
+		rc = generic_file_mmap(file, vma);
+	if (!rc)
 		vma->vm_ops = &cifs_file_vm_ops;
+
 	free_xid(xid);
 	return rc;
 }
@@ -3494,16 +3492,16 @@  int cifs_file_mmap(struct file *file, struct vm_area_struct *vma)
 	int rc, xid;
 
 	xid = get_xid();
+
 	rc = cifs_revalidate_file(file);
-	if (rc) {
+	if (rc)
 		cifs_dbg(FYI, "Validation prior to mmap failed, error=%d\n",
 			 rc);
-		free_xid(xid);
-		return rc;
-	}
-	rc = generic_file_mmap(file, vma);
-	if (rc == 0)
+	if (!rc)
+		rc = generic_file_mmap(file, vma);
+	if (!rc)
 		vma->vm_ops = &cifs_file_vm_ops;
+
 	free_xid(xid);
 	return rc;
 }