Re: [PATCH 1/2] mount.cifs: clean up handling of uid= and gid=

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, 12 Jan 2011 15:26:35 -0500
Jeff Layton <jlayton@xxxxxxxxx> wrote:

> The handling of these options is quite convoluted. Change it so that
> these options are stored as numbers and then appended to the option
> strings.
> 
> Signed-off-by: Jeff Layton <jlayton@xxxxxxxxx>
> ---
>  mount.cifs.c |   94 +++++++++++++++++++++++++++++----------------------------
>  1 files changed, 48 insertions(+), 46 deletions(-)
> 
> diff --git a/mount.cifs.c b/mount.cifs.c
> index df92d79..8fccf44 100644
> --- a/mount.cifs.c
> +++ b/mount.cifs.c
> @@ -857,19 +857,24 @@ parse_options(const char *data, struct parsed_mount_info *parsed_info)
>  	int rc = 0;
>  	int got_uid = 0;
>  	int got_gid = 0;
> -	char user[32];
> -	char group[32];
> +	uid_t uid;
> +	gid_t gid;
> +	char txtbuf[12];
> +	char *ep;
> +	struct passwd *pw;
> +	struct group *gr;
>  
>  	/* make sure we're starting from beginning */
>  	out[0] = '\0';
>  
>  	/* BB fixme check for separator override BB */
> -	if (getuid()) {
> +	uid = getuid();
> +	if (uid != 0)
>  		got_uid = 1;
> -		snprintf(user, sizeof(user), "%u", getuid());
> +
> +	gid = getgid();
> +	if (gid != 0)
>  		got_gid = 1;
> -		snprintf(group, sizeof(group), "%u", getgid());
> -	}
>  
>  	if (!data)
>  		return EX_USAGE;
> @@ -1014,43 +1019,39 @@ parse_options(const char *data, struct parsed_mount_info *parsed_info)
>  			break;
>  
>  		case OPT_UID:
> -			if (value && *value) {
> -				got_uid = 1;
> -				if (!isdigit(*value)) {
> -					struct passwd *pw;
> -
> -					if (!(pw = getpwnam(value))) {
> -						fprintf(stderr,
> -							"bad user name \"%s\"\n",
> -							value);
> -						return EX_USAGE;
> -					}
> -					snprintf(user, sizeof(user), "%u",
> -						 pw->pw_uid);
> -				}
> -				else
> -					strlcpy(user, value, sizeof(user));
> +			if (!value || !*value)
> +				goto nocopy;
> +
> +			got_uid = 1;
> +			uid = strtoul(value, &ep, 10);
> +			if (errno != EINVAL && *ep == '\0')
> +				goto nocopy;
> +
> +			pw = getpwnam(value);
> +			if (pw == NULL) {
> +				fprintf(stderr, "bad user name \"%s\"\n", value);
> +				return EX_USAGE;
>  			}
> +
> +			uid = pw->pw_uid;
>  			goto nocopy;
>  
>  		case OPT_GID:
> -			if (value && *value) {
> -				got_gid = 1;
> -				if (!isdigit(*value)) {
> -					struct group *gr;
> -
> -					if (!(gr = getgrnam(value))) {
> -						fprintf(stderr,
> -							"bad group name \"%s\"\n",
> -							value);
> -						return EX_USAGE;
> -					}
> -					snprintf(group, sizeof(group), "%u",
> -						 gr->gr_gid);
> -				}
> -				else
> -					strlcpy(group, value, sizeof(group));
> +			if (!value || !*value)
> +				goto nocopy;
> +
> +			got_gid = 1;
> +			gid = strtoul(value, &ep, 10);
> +			if (errno != EINVAL && *ep == '\0')
> +				goto nocopy;
> +
> +			gr = getgrnam(value);
> +			if (gr == NULL) {
> +				fprintf(stderr, "bad group name \"%s\"\n", value);
> +				return EX_USAGE;
>  			}
> +
> +			gid = gr->gr_gid;
>  			goto nocopy;
>  
>  		/* fmask fall through to file_mode */
> @@ -1171,34 +1172,35 @@ nocopy:
>  
>  	/* special-case the uid and gid */
>  	if (got_uid) {
> -		word_len = strlen(user);
> +		word_len = snprintf(txtbuf, sizeof(txtbuf), "%u", uid);
>  
> +		/* comma + "uid=" + terminating NULL == 6 */
>  		if (out_len + word_len + 6 > MAX_OPTIONS_LEN) {
>  			fprintf(stderr, "Options string too long\n");
>  			return EX_USAGE;
>  		}
>  
>  		if (out_len) {
> -			strlcat(out, ",", out_len + word_len + 6);
> +			strlcat(out, ",", MAX_OPTIONS_LEN);
>  			out_len++;
>  		}
> -		snprintf(out + out_len, word_len + 5, "uid=%s", user);
> +		snprintf(out + out_len, word_len + 5, "uid=%s", txtbuf);
>  		out_len = strlen(out);
>  	}
>  	if (got_gid) {
> -		word_len = strlen(group);
> +		word_len = snprintf(txtbuf, sizeof(txtbuf), "%u", gid);
>  
> -		if (out_len + 1 + word_len + 6 > MAX_OPTIONS_LEN) {
> +		/* comma + "gid=" + terminating NULL == 6 */
> +		if (out_len + word_len + 6 > MAX_OPTIONS_LEN) {
>  			fprintf(stderr, "Options string too long\n");
>  			return EX_USAGE;
>  		}
>  
>  		if (out_len) {
> -			strlcat(out, ",", out_len + word_len + 6);
> +			strlcat(out, ",", MAX_OPTIONS_LEN);
>  			out_len++;
>  		}
> -		snprintf(out + out_len, word_len + 5, "gid=%s", group);
> -		out_len = strlen(out);
> +		snprintf(out + out_len, word_len + 5, "gid=%s", txtbuf);
>  	}
>  
>  	return 0;

Committed...
-- 
Jeff Layton <jlayton@xxxxxxxxx>
--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux