Message ID | 20190108124100.22075-1-aaptel@suse.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] cifs: move large array from stack to heap | expand |
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
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
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