diff options
Diffstat (limited to 'fs/nfs/idmap.c')
| -rw-r--r-- | fs/nfs/idmap.c | 13 | 
1 files changed, 8 insertions, 5 deletions
diff --git a/fs/nfs/idmap.c b/fs/nfs/idmap.c index dc0f98dfa71..c516da5873f 100644 --- a/fs/nfs/idmap.c +++ b/fs/nfs/idmap.c @@ -726,9 +726,9 @@ out1:  	return ret;  } -static int nfs_idmap_instantiate(struct key *key, struct key *authkey, char *data) +static int nfs_idmap_instantiate(struct key *key, struct key *authkey, char *data, size_t datalen)  { -	return key_instantiate_and_link(key, data, strlen(data) + 1, +	return key_instantiate_and_link(key, data, datalen,  					id_resolver_cache->thread_keyring,  					authkey);  } @@ -738,6 +738,7 @@ static int nfs_idmap_read_and_verify_message(struct idmap_msg *im,  		struct key *key, struct key *authkey)  {  	char id_str[NFS_UINT_MAXLEN]; +	size_t len;  	int ret = -ENOKEY;  	/* ret = -ENOKEY */ @@ -747,13 +748,15 @@ static int nfs_idmap_read_and_verify_message(struct idmap_msg *im,  	case IDMAP_CONV_NAMETOID:  		if (strcmp(upcall->im_name, im->im_name) != 0)  			break; -		sprintf(id_str, "%d", im->im_id); -		ret = nfs_idmap_instantiate(key, authkey, id_str); +		/* Note: here we store the NUL terminator too */ +		len = sprintf(id_str, "%d", im->im_id) + 1; +		ret = nfs_idmap_instantiate(key, authkey, id_str, len);  		break;  	case IDMAP_CONV_IDTONAME:  		if (upcall->im_id != im->im_id)  			break; -		ret = nfs_idmap_instantiate(key, authkey, im->im_name); +		len = strlen(im->im_name); +		ret = nfs_idmap_instantiate(key, authkey, im->im_name, len);  		break;  	default:  		ret = -EINVAL;  |