From: David Howells <dhowells@redhat.com> To: mszeredi@redhat.com, viro@zeniv.linux.org.uk Cc: linux-nfs@vger.kernel.org, jlayton@redhat.com, linux-kernel@vger.kernel.org, dhowells@redhat.com, linux-security-module@vger.kernel.org, linux-fsdevel@vger.kernel.org Subject: [PATCH 22/27] NFS: Add a small buffer in nfs_fs_context to avoid string dup [ver #5] Date: Wed, 14 Jun 2017 16:18:34 +0100 [thread overview] Message-ID: <149745351477.10897.3038422602772913461.stgit@warthog.procyon.org.uk> (raw) In-Reply-To: <149745330648.10897.9605870130502083184.stgit@warthog.procyon.org.uk> Add a small buffer in nfs_fs_context to avoid string duplication when parsing numbers. Also make the parsing function wrapper place the parsed integer directly in the appropriate nfs_fs_context struct member. Signed-off-by: David Howells <dhowells@redhat.com> --- fs/nfs/fs_context.c | 83 ++++++++++++++++++--------------------------------- fs/nfs/internal.h | 2 + 2 files changed, 32 insertions(+), 53 deletions(-) diff --git a/fs/nfs/fs_context.c b/fs/nfs/fs_context.c index a2ff9c30ff5a..763a09b64971 100644 --- a/fs/nfs/fs_context.c +++ b/fs/nfs/fs_context.c @@ -466,27 +466,22 @@ static int nfs_get_option_str(substring_t args[], char **option) return !*option; } -static int nfs_get_option_ul(substring_t args[], unsigned long *option) +static int nfs_get_option_ui(struct nfs_fs_context *ctx, + substring_t args[], unsigned int *option) { - int rc; - char *string; - - string = match_strdup(args); - if (string == NULL) - return -ENOMEM; - rc = kstrtoul(string, 10, option); - kfree(string); - - return rc; + match_strlcpy(ctx->buf, args, sizeof(ctx->buf)); + return kstrtouint(ctx->buf, 10, option); } -static int nfs_get_option_ul_bound(substring_t args[], unsigned long *option, - unsigned long l_bound, unsigned long u_bound) +static int nfs_get_option_ui_bound(struct nfs_fs_context *ctx, + substring_t args[], unsigned int *option, + unsigned int l_bound, unsigned u_bound) { int ret; - ret = nfs_get_option_ul(args, option); - if (ret != 0) + match_strlcpy(ctx->buf, args, sizeof(ctx->buf)); + ret = kstrtouint(ctx->buf, 10, option); + if (ret < 0) return ret; if (*option < l_bound || *option > u_bound) return -ERANGE; @@ -499,7 +494,6 @@ static int nfs_get_option_ul_bound(substring_t args[], unsigned long *option, static int nfs_fs_context_parse_option(struct nfs_fs_context *ctx, char *p) { substring_t args[MAX_OPT_ARGS]; - unsigned long option; char *string; int rc, token; @@ -507,7 +501,6 @@ static int nfs_fs_context_parse_option(struct nfs_fs_context *ctx, char *p) token = match_token(p, nfs_mount_option_tokens, args); switch (token) { - /* * boolean options: foo/nofoo */ @@ -603,86 +596,70 @@ static int nfs_fs_context_parse_option(struct nfs_fs_context *ctx, char *p) * options that take numeric values */ case Opt_port: - if (nfs_get_option_ul(args, &option) || - option > USHRT_MAX) + if (nfs_get_option_ui_bound(ctx, args, &ctx->nfs_server.port, + 0, USHRT_MAX)) goto out_invalid_value; - ctx->nfs_server.port = option; break; case Opt_rsize: - if (nfs_get_option_ul(args, &option)) + if (nfs_get_option_ui(ctx, args, &ctx->rsize)) goto out_invalid_value; - ctx->rsize = option; break; case Opt_wsize: - if (nfs_get_option_ul(args, &option)) + if (nfs_get_option_ui(ctx, args, &ctx->wsize)) goto out_invalid_value; - ctx->wsize = option; break; case Opt_bsize: - if (nfs_get_option_ul(args, &option)) + if (nfs_get_option_ui(ctx, args, &ctx->bsize)) goto out_invalid_value; - ctx->bsize = option; break; case Opt_timeo: - if (nfs_get_option_ul_bound(args, &option, 1, INT_MAX)) + if (nfs_get_option_ui_bound(ctx, args, &ctx->timeo, 1, INT_MAX)) goto out_invalid_value; - ctx->timeo = option; break; case Opt_retrans: - if (nfs_get_option_ul_bound(args, &option, 0, INT_MAX)) + if (nfs_get_option_ui_bound(ctx, args, &ctx->retrans, 0, INT_MAX)) goto out_invalid_value; - ctx->retrans = option; break; case Opt_acregmin: - if (nfs_get_option_ul(args, &option)) + if (nfs_get_option_ui(ctx, args, &ctx->acregmin)) goto out_invalid_value; - ctx->acregmin = option; break; case Opt_acregmax: - if (nfs_get_option_ul(args, &option)) + if (nfs_get_option_ui(ctx, args, &ctx->acregmax)) goto out_invalid_value; - ctx->acregmax = option; break; case Opt_acdirmin: - if (nfs_get_option_ul(args, &option)) + if (nfs_get_option_ui(ctx, args, &ctx->acdirmin)) goto out_invalid_value; - ctx->acdirmin = option; break; case Opt_acdirmax: - if (nfs_get_option_ul(args, &option)) + if (nfs_get_option_ui(ctx, args, &ctx->acdirmax)) goto out_invalid_value; - ctx->acdirmax = option; break; case Opt_actimeo: - if (nfs_get_option_ul(args, &option)) + if (nfs_get_option_ui(ctx, args, &ctx->acdirmax)) goto out_invalid_value; ctx->acregmin = ctx->acregmax = - ctx->acdirmin = ctx->acdirmax = option; + ctx->acdirmin = ctx->acdirmax; break; case Opt_namelen: - if (nfs_get_option_ul(args, &option)) + if (nfs_get_option_ui(ctx, args, &ctx->namlen)) goto out_invalid_value; - ctx->namlen = option; break; case Opt_mountport: - if (nfs_get_option_ul(args, &option) || - option > USHRT_MAX) + if (nfs_get_option_ui_bound(ctx, args, &ctx->mount_server.port, + 0, USHRT_MAX)) goto out_invalid_value; - ctx->mount_server.port = option; break; case Opt_mountvers: - if (nfs_get_option_ul(args, &option) || - option < NFS_MNT_VERSION || - option > NFS_MNT3_VERSION) + if (nfs_get_option_ui_bound(ctx, args, &ctx->mount_server.version, + NFS_MNT_VERSION, NFS_MNT3_VERSION)) goto out_invalid_value; - ctx->mount_server.version = option; break; case Opt_minorversion: - if (nfs_get_option_ul(args, &option)) - goto out_invalid_value; - if (option > NFS4_MAX_MINOR_VERSION) + if (nfs_get_option_ui_bound(ctx, args, &ctx->minorversion, + 0, NFS4_MAX_MINOR_VERSION)) goto out_invalid_value; - ctx->minorversion = option; break; /* diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h index fab0fca9e0ef..1c5404d846cc 100644 --- a/fs/nfs/internal.h +++ b/fs/nfs/internal.h @@ -125,6 +125,8 @@ struct nfs_fs_context { struct security_mnt_opts lsm_opts; struct net *net; + + char buf[32]; /* Parse buffer */ }; /* mount_clnt.c */
WARNING: multiple messages have this Message-ID (diff)
From: dhowells@redhat.com (David Howells) To: linux-security-module@vger.kernel.org Subject: [PATCH 22/27] NFS: Add a small buffer in nfs_fs_context to avoid string dup [ver #5] Date: Wed, 14 Jun 2017 16:18:34 +0100 [thread overview] Message-ID: <149745351477.10897.3038422602772913461.stgit@warthog.procyon.org.uk> (raw) In-Reply-To: <149745330648.10897.9605870130502083184.stgit@warthog.procyon.org.uk> Add a small buffer in nfs_fs_context to avoid string duplication when parsing numbers. Also make the parsing function wrapper place the parsed integer directly in the appropriate nfs_fs_context struct member. Signed-off-by: David Howells <dhowells@redhat.com> --- fs/nfs/fs_context.c | 83 ++++++++++++++++++--------------------------------- fs/nfs/internal.h | 2 + 2 files changed, 32 insertions(+), 53 deletions(-) diff --git a/fs/nfs/fs_context.c b/fs/nfs/fs_context.c index a2ff9c30ff5a..763a09b64971 100644 --- a/fs/nfs/fs_context.c +++ b/fs/nfs/fs_context.c @@ -466,27 +466,22 @@ static int nfs_get_option_str(substring_t args[], char **option) return !*option; } -static int nfs_get_option_ul(substring_t args[], unsigned long *option) +static int nfs_get_option_ui(struct nfs_fs_context *ctx, + substring_t args[], unsigned int *option) { - int rc; - char *string; - - string = match_strdup(args); - if (string == NULL) - return -ENOMEM; - rc = kstrtoul(string, 10, option); - kfree(string); - - return rc; + match_strlcpy(ctx->buf, args, sizeof(ctx->buf)); + return kstrtouint(ctx->buf, 10, option); } -static int nfs_get_option_ul_bound(substring_t args[], unsigned long *option, - unsigned long l_bound, unsigned long u_bound) +static int nfs_get_option_ui_bound(struct nfs_fs_context *ctx, + substring_t args[], unsigned int *option, + unsigned int l_bound, unsigned u_bound) { int ret; - ret = nfs_get_option_ul(args, option); - if (ret != 0) + match_strlcpy(ctx->buf, args, sizeof(ctx->buf)); + ret = kstrtouint(ctx->buf, 10, option); + if (ret < 0) return ret; if (*option < l_bound || *option > u_bound) return -ERANGE; @@ -499,7 +494,6 @@ static int nfs_get_option_ul_bound(substring_t args[], unsigned long *option, static int nfs_fs_context_parse_option(struct nfs_fs_context *ctx, char *p) { substring_t args[MAX_OPT_ARGS]; - unsigned long option; char *string; int rc, token; @@ -507,7 +501,6 @@ static int nfs_fs_context_parse_option(struct nfs_fs_context *ctx, char *p) token = match_token(p, nfs_mount_option_tokens, args); switch (token) { - /* * boolean options: foo/nofoo */ @@ -603,86 +596,70 @@ static int nfs_fs_context_parse_option(struct nfs_fs_context *ctx, char *p) * options that take numeric values */ case Opt_port: - if (nfs_get_option_ul(args, &option) || - option > USHRT_MAX) + if (nfs_get_option_ui_bound(ctx, args, &ctx->nfs_server.port, + 0, USHRT_MAX)) goto out_invalid_value; - ctx->nfs_server.port = option; break; case Opt_rsize: - if (nfs_get_option_ul(args, &option)) + if (nfs_get_option_ui(ctx, args, &ctx->rsize)) goto out_invalid_value; - ctx->rsize = option; break; case Opt_wsize: - if (nfs_get_option_ul(args, &option)) + if (nfs_get_option_ui(ctx, args, &ctx->wsize)) goto out_invalid_value; - ctx->wsize = option; break; case Opt_bsize: - if (nfs_get_option_ul(args, &option)) + if (nfs_get_option_ui(ctx, args, &ctx->bsize)) goto out_invalid_value; - ctx->bsize = option; break; case Opt_timeo: - if (nfs_get_option_ul_bound(args, &option, 1, INT_MAX)) + if (nfs_get_option_ui_bound(ctx, args, &ctx->timeo, 1, INT_MAX)) goto out_invalid_value; - ctx->timeo = option; break; case Opt_retrans: - if (nfs_get_option_ul_bound(args, &option, 0, INT_MAX)) + if (nfs_get_option_ui_bound(ctx, args, &ctx->retrans, 0, INT_MAX)) goto out_invalid_value; - ctx->retrans = option; break; case Opt_acregmin: - if (nfs_get_option_ul(args, &option)) + if (nfs_get_option_ui(ctx, args, &ctx->acregmin)) goto out_invalid_value; - ctx->acregmin = option; break; case Opt_acregmax: - if (nfs_get_option_ul(args, &option)) + if (nfs_get_option_ui(ctx, args, &ctx->acregmax)) goto out_invalid_value; - ctx->acregmax = option; break; case Opt_acdirmin: - if (nfs_get_option_ul(args, &option)) + if (nfs_get_option_ui(ctx, args, &ctx->acdirmin)) goto out_invalid_value; - ctx->acdirmin = option; break; case Opt_acdirmax: - if (nfs_get_option_ul(args, &option)) + if (nfs_get_option_ui(ctx, args, &ctx->acdirmax)) goto out_invalid_value; - ctx->acdirmax = option; break; case Opt_actimeo: - if (nfs_get_option_ul(args, &option)) + if (nfs_get_option_ui(ctx, args, &ctx->acdirmax)) goto out_invalid_value; ctx->acregmin = ctx->acregmax = - ctx->acdirmin = ctx->acdirmax = option; + ctx->acdirmin = ctx->acdirmax; break; case Opt_namelen: - if (nfs_get_option_ul(args, &option)) + if (nfs_get_option_ui(ctx, args, &ctx->namlen)) goto out_invalid_value; - ctx->namlen = option; break; case Opt_mountport: - if (nfs_get_option_ul(args, &option) || - option > USHRT_MAX) + if (nfs_get_option_ui_bound(ctx, args, &ctx->mount_server.port, + 0, USHRT_MAX)) goto out_invalid_value; - ctx->mount_server.port = option; break; case Opt_mountvers: - if (nfs_get_option_ul(args, &option) || - option < NFS_MNT_VERSION || - option > NFS_MNT3_VERSION) + if (nfs_get_option_ui_bound(ctx, args, &ctx->mount_server.version, + NFS_MNT_VERSION, NFS_MNT3_VERSION)) goto out_invalid_value; - ctx->mount_server.version = option; break; case Opt_minorversion: - if (nfs_get_option_ul(args, &option)) - goto out_invalid_value; - if (option > NFS4_MAX_MINOR_VERSION) + if (nfs_get_option_ui_bound(ctx, args, &ctx->minorversion, + 0, NFS4_MAX_MINOR_VERSION)) goto out_invalid_value; - ctx->minorversion = option; break; /* diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h index fab0fca9e0ef..1c5404d846cc 100644 --- a/fs/nfs/internal.h +++ b/fs/nfs/internal.h @@ -125,6 +125,8 @@ struct nfs_fs_context { struct security_mnt_opts lsm_opts; struct net *net; + + char buf[32]; /* Parse buffer */ }; /* mount_clnt.c */ -- To unsubscribe from this list: send the line "unsubscribe linux-security-module" in the body of a message to majordomo at vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2017-06-14 15:18 UTC|newest] Thread overview: 108+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-06-14 15:15 [RFC][PATCH 00/27] VFS: Introduce filesystem context [ver #5] David Howells 2017-06-14 15:15 ` David Howells 2017-06-14 15:15 ` [PATCH 01/27] Provide a function to create a NUL-terminated string from unterminated data " David Howells 2017-06-14 15:15 ` David Howells 2017-06-14 15:15 ` [PATCH 02/27] VFS: Clean up whitespace in fs/namespace.c and fs/super.c " David Howells 2017-06-14 15:15 ` David Howells 2017-06-14 15:15 ` [PATCH 03/27] VFS: Make get_mnt_ns() return the namespace " David Howells 2017-06-14 15:15 ` David Howells 2017-06-15 9:09 ` Al Viro 2017-06-15 9:09 ` Al Viro 2017-06-14 15:15 ` [PATCH 04/27] VFS: Make get_filesystem() return the affected filesystem " David Howells 2017-06-14 15:15 ` David Howells 2017-06-14 15:16 ` [PATCH 05/27] VFS: Provide empty name qstr " David Howells 2017-06-14 15:16 ` David Howells 2017-06-14 15:16 ` [PATCH 06/27] Provide supplementary error message facility " David Howells 2017-06-14 15:16 ` David Howells 2017-08-18 3:09 ` Kim Phillips 2017-08-18 3:09 ` Kim Phillips 2017-08-18 3:09 ` Kim Phillips 2017-08-18 3:09 ` Kim Phillips 2017-06-14 15:16 ` [PATCH 07/27] VFS: Differentiate mount flags (MS_*) from internal superblock flags " David Howells 2017-06-15 9:39 ` Al Viro 2017-06-15 9:39 ` Al Viro 2017-06-16 9:06 ` Christoph Hellwig 2017-06-16 9:06 ` Christoph Hellwig 2017-06-16 14:53 ` David Howells 2017-06-16 14:53 ` David Howells 2017-06-16 15:49 ` Christoph Hellwig 2017-06-16 15:49 ` Christoph Hellwig 2017-06-16 15:54 ` David Howells 2017-06-16 15:54 ` David Howells 2017-06-14 15:16 ` [PATCH 08/27] VFS: Introduce the structs and doc for a filesystem context " David Howells 2017-06-14 15:16 ` David Howells 2017-06-14 18:02 ` Randy Dunlap 2017-06-14 18:02 ` Randy Dunlap 2017-06-14 20:03 ` Casey Schaufler 2017-06-14 20:03 ` Casey Schaufler 2017-06-14 20:42 ` David Howells 2017-06-14 20:42 ` David Howells 2017-06-14 20:53 ` Casey Schaufler 2017-06-14 20:53 ` Casey Schaufler 2017-06-17 9:57 ` Theodore Ts'o 2017-06-17 9:57 ` Theodore Ts'o 2017-06-17 14:18 ` David Howells 2017-06-17 14:18 ` David Howells 2017-06-17 14:56 ` Jeff Layton 2017-06-17 14:56 ` Jeff Layton 2017-06-17 15:11 ` Randy Dunlap 2017-06-17 15:11 ` Randy Dunlap 2017-06-19 7:47 ` David Howells 2017-06-19 7:47 ` David Howells 2017-06-14 22:58 ` Updated docs David Howells 2017-06-14 22:58 ` David Howells 2017-06-15 1:53 ` Randy Dunlap 2017-06-15 1:53 ` Randy Dunlap 2017-06-14 15:16 ` [PATCH 09/27] VFS: Add LSM hooks for filesystem context [ver #5] David Howells 2017-06-14 15:16 ` David Howells 2017-06-14 15:16 ` [PATCH 10/27] VFS: Implement a filesystem superblock creation/configuration " David Howells 2017-06-14 15:16 ` David Howells 2017-06-14 15:17 ` [PATCH 11/27] VFS: Remove unused code after filesystem context changes " David Howells 2017-06-14 15:17 ` David Howells 2017-06-14 15:17 ` [PATCH 12/27] VFS: Implement fsopen() to prepare for a mount " David Howells 2017-06-14 15:17 ` David Howells 2017-06-14 15:17 ` [PATCH 13/27] VFS: Implement fsmount() to effect a pre-configured " David Howells 2017-06-14 15:17 ` David Howells 2017-06-14 15:17 ` [PATCH 14/27] VFS: Add a sample program for fsopen/fsmount " David Howells 2017-06-14 15:17 ` David Howells 2017-06-14 15:17 ` [PATCH 15/27] procfs: Move proc_fill_super() to fs/proc/root.c " David Howells 2017-06-14 15:17 ` David Howells 2017-06-14 15:17 ` [PATCH 16/27] proc: Add fs_context support to procfs " David Howells 2017-06-14 15:17 ` David Howells 2017-06-15 10:14 ` Al Viro 2017-06-15 10:14 ` Al Viro 2017-06-14 15:17 ` [PATCH 17/27] NFS: Move mount parameterisation bits into their own file " David Howells 2017-06-14 15:17 ` David Howells 2017-06-14 15:18 ` [PATCH 18/27] NFS: Constify mount argument match tables " David Howells 2017-06-14 15:18 ` David Howells 2017-06-14 15:18 ` [PATCH 19/27] NFS: Rename struct nfs_parsed_mount_data to struct nfs_fs_context " David Howells 2017-06-14 15:18 ` David Howells 2017-06-14 15:18 ` [PATCH 20/27] NFS: Split nfs_parse_mount_options() " David Howells 2017-06-14 15:18 ` David Howells 2017-06-14 15:18 ` [PATCH 21/27] NFS: Deindent nfs_fs_context_parse_option() " David Howells 2017-06-14 15:18 ` David Howells 2017-06-14 15:18 ` David Howells [this message] 2017-06-14 15:18 ` [PATCH 22/27] NFS: Add a small buffer in nfs_fs_context to avoid string dup " David Howells 2017-06-14 15:18 ` [PATCH 23/27] NFS: Do some tidying of the parsing code " David Howells 2017-06-14 15:18 ` David Howells 2017-06-14 15:18 ` [PATCH 24/27] NFS: Add fs_context support. " David Howells 2017-06-14 15:18 ` David Howells 2017-06-15 15:28 ` Anna Schumaker 2017-06-14 15:19 ` [PATCH 25/27] ipc: Convert mqueue fs to fs_context " David Howells 2017-06-14 15:19 ` David Howells 2017-06-15 10:07 ` Al Viro 2017-06-15 10:07 ` Al Viro 2017-06-15 14:47 ` David Howells 2017-06-15 14:47 ` David Howells 2017-06-14 15:19 ` [PATCH 26/27] cpuset: Use " David Howells 2017-06-14 15:19 ` David Howells 2017-06-14 15:19 ` [PATCH 27/27] kernfs, sysfs, cgroup: Support " David Howells 2017-06-14 15:19 ` David Howells 2017-06-14 17:54 ` Tejun Heo 2017-06-14 17:54 ` Tejun Heo 2017-06-14 17:54 ` Tejun Heo 2017-06-23 15:29 ` David Howells 2017-06-23 15:29 ` David Howells 2017-06-23 15:29 ` David Howells 2017-06-14 22:31 ` [PATCH 27/27] ... and the intel_rdt driver David Howells 2017-06-14 22:31 ` David Howells
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=149745351477.10897.3038422602772913461.stgit@warthog.procyon.org.uk \ --to=dhowells@redhat.com \ --cc=jlayton@redhat.com \ --cc=linux-fsdevel@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-nfs@vger.kernel.org \ --cc=linux-security-module@vger.kernel.org \ --cc=mszeredi@redhat.com \ --cc=viro@zeniv.linux.org.uk \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.