Loading fs/cifs/dfs_cache.c +1 −59 Original line number Diff line number Diff line Loading @@ -1141,64 +1141,6 @@ int dfs_cache_get_tgt_referral(const char *path, return rc; } static int dup_vol(struct smb3_fs_context *ctx, struct smb3_fs_context *new) { memcpy(new, ctx, sizeof(*new)); if (ctx->username) { new->username = kstrndup(ctx->username, strlen(ctx->username), GFP_KERNEL); if (!new->username) return -ENOMEM; } if (ctx->password) { new->password = kstrndup(ctx->password, strlen(ctx->password), GFP_KERNEL); if (!new->password) goto err_free_username; } if (ctx->UNC) { cifs_dbg(FYI, "%s: ctx->UNC: %s\n", __func__, ctx->UNC); new->UNC = kstrndup(ctx->UNC, strlen(ctx->UNC), GFP_KERNEL); if (!new->UNC) goto err_free_password; } if (ctx->domainname) { new->domainname = kstrndup(ctx->domainname, strlen(ctx->domainname), GFP_KERNEL); if (!new->domainname) goto err_free_unc; } if (ctx->iocharset) { new->iocharset = kstrndup(ctx->iocharset, strlen(ctx->iocharset), GFP_KERNEL); if (!new->iocharset) goto err_free_domainname; } if (ctx->prepath) { cifs_dbg(FYI, "%s: ctx->prepath: %s\n", __func__, ctx->prepath); new->prepath = kstrndup(ctx->prepath, strlen(ctx->prepath), GFP_KERNEL); if (!new->prepath) goto err_free_iocharset; } return 0; err_free_iocharset: kfree(new->iocharset); err_free_domainname: kfree(new->domainname); err_free_unc: kfree(new->UNC); err_free_password: kfree_sensitive(new->password); err_free_username: kfree(new->username); kfree(new); return -ENOMEM; } /** * dfs_cache_add_vol - add a cifs volume during mount() that will be handled by * DFS cache refresh worker. Loading Loading @@ -1229,7 +1171,7 @@ int dfs_cache_add_vol(char *mntdata, struct smb3_fs_context *ctx, const char *fu goto err_free_vi; } rc = dup_vol(ctx, &vi->ctx); rc = smb3_fs_context_dup(&vi->ctx, ctx); if (rc) goto err_free_fullpath; Loading fs/cifs/fs_context.c +41 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ */ #include "cifsglob.h" #include "cifsproto.h" #include "cifs_debug.h" #include "fs_context.h" Loading Loading @@ -219,3 +220,43 @@ cifs_parse_cache_flavor(char *value, struct smb3_fs_context *ctx) } return 0; } #define DUP_CTX_STR(field) \ do { \ if (ctx->field) { \ new_ctx->field = kstrdup(ctx->field, GFP_ATOMIC); \ if (new_ctx->field == NULL) { \ cifs_cleanup_volume_info_contents(new_ctx); \ return -ENOMEM; \ } \ } \ } while (0) int smb3_fs_context_dup(struct smb3_fs_context *new_ctx, struct smb3_fs_context *ctx) { int rc = 0; memcpy(new_ctx, ctx, sizeof(*ctx)); new_ctx->prepath = NULL; new_ctx->local_nls = NULL; new_ctx->nodename = NULL; new_ctx->username = NULL; new_ctx->password = NULL; new_ctx->domainname = NULL; new_ctx->UNC = NULL; new_ctx->iocharset = NULL; /* * Make sure to stay in sync with cifs_cleanup_volume_info_contents() */ DUP_CTX_STR(prepath); DUP_CTX_STR(username); DUP_CTX_STR(password); DUP_CTX_STR(UNC); DUP_CTX_STR(domainname); DUP_CTX_STR(nodename); DUP_CTX_STR(iocharset); return rc; } fs/cifs/fs_context.h +2 −1 Original line number Diff line number Diff line Loading @@ -152,6 +152,7 @@ struct smb3_fs_context { bool rootfs:1; /* if it's a SMB root file system */ }; int cifs_parse_security_flavors(char *value, struct smb3_fs_context *ctx); extern int cifs_parse_security_flavors(char *value, struct smb3_fs_context *ctx); extern int smb3_fs_context_dup(struct smb3_fs_context *new_ctx, struct smb3_fs_context *ctx); #endif Loading
fs/cifs/dfs_cache.c +1 −59 Original line number Diff line number Diff line Loading @@ -1141,64 +1141,6 @@ int dfs_cache_get_tgt_referral(const char *path, return rc; } static int dup_vol(struct smb3_fs_context *ctx, struct smb3_fs_context *new) { memcpy(new, ctx, sizeof(*new)); if (ctx->username) { new->username = kstrndup(ctx->username, strlen(ctx->username), GFP_KERNEL); if (!new->username) return -ENOMEM; } if (ctx->password) { new->password = kstrndup(ctx->password, strlen(ctx->password), GFP_KERNEL); if (!new->password) goto err_free_username; } if (ctx->UNC) { cifs_dbg(FYI, "%s: ctx->UNC: %s\n", __func__, ctx->UNC); new->UNC = kstrndup(ctx->UNC, strlen(ctx->UNC), GFP_KERNEL); if (!new->UNC) goto err_free_password; } if (ctx->domainname) { new->domainname = kstrndup(ctx->domainname, strlen(ctx->domainname), GFP_KERNEL); if (!new->domainname) goto err_free_unc; } if (ctx->iocharset) { new->iocharset = kstrndup(ctx->iocharset, strlen(ctx->iocharset), GFP_KERNEL); if (!new->iocharset) goto err_free_domainname; } if (ctx->prepath) { cifs_dbg(FYI, "%s: ctx->prepath: %s\n", __func__, ctx->prepath); new->prepath = kstrndup(ctx->prepath, strlen(ctx->prepath), GFP_KERNEL); if (!new->prepath) goto err_free_iocharset; } return 0; err_free_iocharset: kfree(new->iocharset); err_free_domainname: kfree(new->domainname); err_free_unc: kfree(new->UNC); err_free_password: kfree_sensitive(new->password); err_free_username: kfree(new->username); kfree(new); return -ENOMEM; } /** * dfs_cache_add_vol - add a cifs volume during mount() that will be handled by * DFS cache refresh worker. Loading Loading @@ -1229,7 +1171,7 @@ int dfs_cache_add_vol(char *mntdata, struct smb3_fs_context *ctx, const char *fu goto err_free_vi; } rc = dup_vol(ctx, &vi->ctx); rc = smb3_fs_context_dup(&vi->ctx, ctx); if (rc) goto err_free_fullpath; Loading
fs/cifs/fs_context.c +41 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ */ #include "cifsglob.h" #include "cifsproto.h" #include "cifs_debug.h" #include "fs_context.h" Loading Loading @@ -219,3 +220,43 @@ cifs_parse_cache_flavor(char *value, struct smb3_fs_context *ctx) } return 0; } #define DUP_CTX_STR(field) \ do { \ if (ctx->field) { \ new_ctx->field = kstrdup(ctx->field, GFP_ATOMIC); \ if (new_ctx->field == NULL) { \ cifs_cleanup_volume_info_contents(new_ctx); \ return -ENOMEM; \ } \ } \ } while (0) int smb3_fs_context_dup(struct smb3_fs_context *new_ctx, struct smb3_fs_context *ctx) { int rc = 0; memcpy(new_ctx, ctx, sizeof(*ctx)); new_ctx->prepath = NULL; new_ctx->local_nls = NULL; new_ctx->nodename = NULL; new_ctx->username = NULL; new_ctx->password = NULL; new_ctx->domainname = NULL; new_ctx->UNC = NULL; new_ctx->iocharset = NULL; /* * Make sure to stay in sync with cifs_cleanup_volume_info_contents() */ DUP_CTX_STR(prepath); DUP_CTX_STR(username); DUP_CTX_STR(password); DUP_CTX_STR(UNC); DUP_CTX_STR(domainname); DUP_CTX_STR(nodename); DUP_CTX_STR(iocharset); return rc; }
fs/cifs/fs_context.h +2 −1 Original line number Diff line number Diff line Loading @@ -152,6 +152,7 @@ struct smb3_fs_context { bool rootfs:1; /* if it's a SMB root file system */ }; int cifs_parse_security_flavors(char *value, struct smb3_fs_context *ctx); extern int cifs_parse_security_flavors(char *value, struct smb3_fs_context *ctx); extern int smb3_fs_context_dup(struct smb3_fs_context *new_ctx, struct smb3_fs_context *ctx); #endif