[v2] cifs: move large array from stack to heap
diff mbox series

Message ID 20190108124100.22075-1-aaptel@suse.com
State New
Headers show
Series
  • [v2] cifs: move large array from stack to heap
Related show

Commit Message

Aurélien Aptel Jan. 8, 2019, 12:41 p.m. UTC
Signed-off-by: Aurelien Aptel <aaptel@suse.com>
---

Changes since v1:
* alloc MAX_TREE_SIZE instead of MAX_TREE_SIZE+1 as null is already
  taken into account in the definition of it and snprintf always
  NULL-terminates within the size param.

fs/cifs/cifssmb.c | 23 ++++++++++++++++-------
 fs/cifs/smb2pdu.c | 23 ++++++++++++++++-------
 2 files changed, 32 insertions(+), 14 deletions(-)

--
2.16.4

Comments

Steve French Jan. 8, 2019, 6:41 p.m. UTC | #1
updated in cifs-2.6.git for-next with this later version of the patch

On Tue, Jan 8, 2019 at 6:45 AM Aurelien Aptel <aaptel@suse.com> wrote:
>
> Signed-off-by: Aurelien Aptel <aaptel@suse.com>
> ---
>
> Changes since v1:
> * alloc MAX_TREE_SIZE instead of MAX_TREE_SIZE+1 as null is already
>   taken into account in the definition of it and snprintf always
>   NULL-terminates within the size param.
>
> fs/cifs/cifssmb.c | 23 ++++++++++++++++-------
>  fs/cifs/smb2pdu.c | 23 ++++++++++++++++-------
>  2 files changed, 32 insertions(+), 14 deletions(-)
>
> diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
> index b1f49c1c543a..332f88d753d1 100644
> --- a/fs/cifs/cifssmb.c
> +++ b/fs/cifs/cifssmb.c
> @@ -128,24 +128,31 @@ static int __cifs_reconnect_tcon(const struct nls_table *nlsc,
>         int rc;
>         struct dfs_cache_tgt_list tl;
>         struct dfs_cache_tgt_iterator *it = NULL;
> -       char tree[MAX_TREE_SIZE + 1];
> +       char *tree;
>         const char *tcp_host;
>         size_t tcp_host_len;
>         const char *dfs_host;
>         size_t dfs_host_len;
>
> +       tree = kzalloc(MAX_TREE_SIZE, GFP_KERNEL);
> +       if (!tree)
> +               return -ENOMEM;
> +
>         if (tcon->ipc) {
> -               snprintf(tree, sizeof(tree), "\\\\%s\\IPC$",
> +               snprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$",
>                          tcon->ses->server->hostname);
> -               return CIFSTCon(0, tcon->ses, tree, tcon, nlsc);
> +               rc = CIFSTCon(0, tcon->ses, tree, tcon, nlsc);
> +               goto out;
>         }
>
> -       if (!tcon->dfs_path)
> -               return CIFSTCon(0, tcon->ses, tcon->treeName, tcon, nlsc);
> +       if (!tcon->dfs_path) {
> +               rc = CIFSTCon(0, tcon->ses, tcon->treeName, tcon, nlsc);
> +               goto out;
> +       }
>
>         rc = dfs_cache_noreq_find(tcon->dfs_path + 1, NULL, &tl);
>         if (rc)
> -               return rc;
> +               goto out;
>
>         extract_unc_hostname(tcon->ses->server->hostname, &tcp_host,
>                              &tcp_host_len);
> @@ -165,7 +172,7 @@ static int __cifs_reconnect_tcon(const struct nls_table *nlsc,
>                         continue;
>                 }
>
> -               snprintf(tree, sizeof(tree), "\\%s", tgt);
> +               snprintf(tree, MAX_TREE_SIZE, "\\%s", tgt);
>
>                 rc = CIFSTCon(0, tcon->ses, tree, tcon, nlsc);
>                 if (!rc)
> @@ -182,6 +189,8 @@ static int __cifs_reconnect_tcon(const struct nls_table *nlsc,
>                         rc = -ENOENT;
>         }
>         dfs_cache_free_tgts(&tl);
> +out:
> +       kfree(tree);
>         return rc;
>  }
>  #else
> diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
> index e283590955cd..9a7a51cd07ac 100644
> --- a/fs/cifs/smb2pdu.c
> +++ b/fs/cifs/smb2pdu.c
> @@ -162,24 +162,31 @@ static int __smb2_reconnect(const struct nls_table *nlsc,
>         int rc;
>         struct dfs_cache_tgt_list tl;
>         struct dfs_cache_tgt_iterator *it = NULL;
> -       char tree[MAX_TREE_SIZE + 1];
> +       char *tree;
>         const char *tcp_host;
>         size_t tcp_host_len;
>         const char *dfs_host;
>         size_t dfs_host_len;
>
> +       tree = kzalloc(MAX_TREE_SIZE, GFP_KERNEL);
> +       if (!tree)
> +               return -ENOMEM;
> +
>         if (tcon->ipc) {
> -               snprintf(tree, sizeof(tree), "\\\\%s\\IPC$",
> +               snprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$",
>                          tcon->ses->server->hostname);
> -               return SMB2_tcon(0, tcon->ses, tree, tcon, nlsc);
> +               rc = SMB2_tcon(0, tcon->ses, tree, tcon, nlsc);
> +               goto out;
>         }
>
> -       if (!tcon->dfs_path)
> -               return SMB2_tcon(0, tcon->ses, tcon->treeName, tcon, nlsc);
> +       if (!tcon->dfs_path) {
> +               rc = SMB2_tcon(0, tcon->ses, tcon->treeName, tcon, nlsc);
> +               goto out;
> +       }
>
>         rc = dfs_cache_noreq_find(tcon->dfs_path + 1, NULL, &tl);
>         if (rc)
> -               return rc;
> +               goto out;
>
>         extract_unc_hostname(tcon->ses->server->hostname, &tcp_host,
>                              &tcp_host_len);
> @@ -199,7 +206,7 @@ static int __smb2_reconnect(const struct nls_table *nlsc,
>                         continue;
>                 }
>
> -               snprintf(tree, sizeof(tree), "\\%s", tgt);
> +               snprintf(tree, MAX_TREE_SIZE, "\\%s", tgt);
>
>                 rc = SMB2_tcon(0, tcon->ses, tree, tcon, nlsc);
>                 if (!rc)
> @@ -216,6 +223,8 @@ static int __smb2_reconnect(const struct nls_table *nlsc,
>                         rc = -ENOENT;
>         }
>         dfs_cache_free_tgts(&tl);
> +out:
> +       kfree(tree);
>         return rc;
>  }
>  #else
> --
> 2.16.4

Patch
diff mbox series

diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
index b1f49c1c543a..332f88d753d1 100644
--- a/fs/cifs/cifssmb.c
+++ b/fs/cifs/cifssmb.c
@@ -128,24 +128,31 @@  static int __cifs_reconnect_tcon(const struct nls_table *nlsc,
 	int rc;
 	struct dfs_cache_tgt_list tl;
 	struct dfs_cache_tgt_iterator *it = NULL;
-	char tree[MAX_TREE_SIZE + 1];
+	char *tree;
 	const char *tcp_host;
 	size_t tcp_host_len;
 	const char *dfs_host;
 	size_t dfs_host_len;

+	tree = kzalloc(MAX_TREE_SIZE, GFP_KERNEL);
+	if (!tree)
+		return -ENOMEM;
+
 	if (tcon->ipc) {
-		snprintf(tree, sizeof(tree), "\\\\%s\\IPC$",
+		snprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$",
 			 tcon->ses->server->hostname);
-		return CIFSTCon(0, tcon->ses, tree, tcon, nlsc);
+		rc = CIFSTCon(0, tcon->ses, tree, tcon, nlsc);
+		goto out;
 	}

-	if (!tcon->dfs_path)
-		return CIFSTCon(0, tcon->ses, tcon->treeName, tcon, nlsc);
+	if (!tcon->dfs_path) {
+		rc = CIFSTCon(0, tcon->ses, tcon->treeName, tcon, nlsc);
+		goto out;
+	}

 	rc = dfs_cache_noreq_find(tcon->dfs_path + 1, NULL, &tl);
 	if (rc)
-		return rc;
+		goto out;

 	extract_unc_hostname(tcon->ses->server->hostname, &tcp_host,
 			     &tcp_host_len);
@@ -165,7 +172,7 @@  static int __cifs_reconnect_tcon(const struct nls_table *nlsc,
 			continue;
 		}

-		snprintf(tree, sizeof(tree), "\\%s", tgt);
+		snprintf(tree, MAX_TREE_SIZE, "\\%s", tgt);

 		rc = CIFSTCon(0, tcon->ses, tree, tcon, nlsc);
 		if (!rc)
@@ -182,6 +189,8 @@  static int __cifs_reconnect_tcon(const struct nls_table *nlsc,
 			rc = -ENOENT;
 	}
 	dfs_cache_free_tgts(&tl);
+out:
+	kfree(tree);
 	return rc;
 }
 #else
diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
index e283590955cd..9a7a51cd07ac 100644
--- a/fs/cifs/smb2pdu.c
+++ b/fs/cifs/smb2pdu.c
@@ -162,24 +162,31 @@  static int __smb2_reconnect(const struct nls_table *nlsc,
 	int rc;
 	struct dfs_cache_tgt_list tl;
 	struct dfs_cache_tgt_iterator *it = NULL;
-	char tree[MAX_TREE_SIZE + 1];
+	char *tree;
 	const char *tcp_host;
 	size_t tcp_host_len;
 	const char *dfs_host;
 	size_t dfs_host_len;

+	tree = kzalloc(MAX_TREE_SIZE, GFP_KERNEL);
+	if (!tree)
+		return -ENOMEM;
+
 	if (tcon->ipc) {
-		snprintf(tree, sizeof(tree), "\\\\%s\\IPC$",
+		snprintf(tree, MAX_TREE_SIZE, "\\\\%s\\IPC$",
 			 tcon->ses->server->hostname);
-		return SMB2_tcon(0, tcon->ses, tree, tcon, nlsc);
+		rc = SMB2_tcon(0, tcon->ses, tree, tcon, nlsc);
+		goto out;
 	}

-	if (!tcon->dfs_path)
-		return SMB2_tcon(0, tcon->ses, tcon->treeName, tcon, nlsc);
+	if (!tcon->dfs_path) {
+		rc = SMB2_tcon(0, tcon->ses, tcon->treeName, tcon, nlsc);
+		goto out;
+	}

 	rc = dfs_cache_noreq_find(tcon->dfs_path + 1, NULL, &tl);
 	if (rc)
-		return rc;
+		goto out;

 	extract_unc_hostname(tcon->ses->server->hostname, &tcp_host,
 			     &tcp_host_len);
@@ -199,7 +206,7 @@  static int __smb2_reconnect(const struct nls_table *nlsc,
 			continue;
 		}

-		snprintf(tree, sizeof(tree), "\\%s", tgt);
+		snprintf(tree, MAX_TREE_SIZE, "\\%s", tgt);

 		rc = SMB2_tcon(0, tcon->ses, tree, tcon, nlsc);
 		if (!rc)
@@ -216,6 +223,8 @@  static int __smb2_reconnect(const struct nls_table *nlsc,
 			rc = -ENOENT;
 	}
 	dfs_cache_free_tgts(&tl);
+out:
+	kfree(tree);
 	return rc;
 }
 #else