diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-12 09:59:23 +0900 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-10-12 09:59:23 +0900 | 
| commit | 940e3a8dd6683a3787faf769b3df7a06f1c2fa31 (patch) | |
| tree | 5f722b4a63fcaf288e2689576d75c16e0dfc700d /fs | |
| parent | 12250d843e8489ee00b5b7726da855e51694e792 (diff) | |
| parent | 759f42987f98915764bad922ee123acb0eadbe33 (diff) | |
| download | linux-940e3a8dd6683a3787faf769b3df7a06f1c2fa31.tar.bz2 | |
Merge tag 'for-linus-merge-3.7' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs
Pull v9fs update from Eric Van Hensbergen.
* tag 'for-linus-merge-3.7' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs:
  9P: Fix race between p9_write_work() and p9_fd_request()
  9P: Fix race in p9_write_work()
  9P: fix test at the end of p9_write_work()
  9P: Fix race in p9_read_work()
  9p: don't use __getname/__putname for uname/aname
  net/9p: Check errno validity
  fs/9p: avoid debug OOPS when reading a long symlink
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/9p/v9fs.c | 30 | ||||
| -rw-r--r-- | fs/9p/vfs_inode.c | 8 | 
2 files changed, 23 insertions, 15 deletions
| diff --git a/fs/9p/v9fs.c b/fs/9p/v9fs.c index 392c5dac1981..d934f04e7736 100644 --- a/fs/9p/v9fs.c +++ b/fs/9p/v9fs.c @@ -184,10 +184,20 @@ static int v9fs_parse_options(struct v9fs_session_info *v9ses, char *opts)  			v9ses->afid = option;  			break;  		case Opt_uname: -			match_strlcpy(v9ses->uname, &args[0], PATH_MAX); +			kfree(v9ses->uname); +			v9ses->uname = match_strdup(&args[0]); +			if (!v9ses->uname) { +				ret = -ENOMEM; +				goto free_and_return; +			}  			break;  		case Opt_remotename: -			match_strlcpy(v9ses->aname, &args[0], PATH_MAX); +			kfree(v9ses->aname); +			v9ses->aname = match_strdup(&args[0]); +			if (!v9ses->aname) { +				ret = -ENOMEM; +				goto free_and_return; +			}  			break;  		case Opt_nodevmap:  			v9ses->nodev = 1; @@ -287,21 +297,21 @@ struct p9_fid *v9fs_session_init(struct v9fs_session_info *v9ses,  	struct p9_fid *fid;  	int rc; -	v9ses->uname = __getname(); +	v9ses->uname = kstrdup(V9FS_DEFUSER, GFP_KERNEL);  	if (!v9ses->uname)  		return ERR_PTR(-ENOMEM); -	v9ses->aname = __getname(); +	v9ses->aname = kstrdup(V9FS_DEFANAME, GFP_KERNEL);  	if (!v9ses->aname) { -		__putname(v9ses->uname); +		kfree(v9ses->uname);  		return ERR_PTR(-ENOMEM);  	}  	init_rwsem(&v9ses->rename_sem);  	rc = bdi_setup_and_register(&v9ses->bdi, "9p", BDI_CAP_MAP_COPY);  	if (rc) { -		__putname(v9ses->aname); -		__putname(v9ses->uname); +		kfree(v9ses->aname); +		kfree(v9ses->uname);  		return ERR_PTR(rc);  	} @@ -309,8 +319,6 @@ struct p9_fid *v9fs_session_init(struct v9fs_session_info *v9ses,  	list_add(&v9ses->slist, &v9fs_sessionlist);  	spin_unlock(&v9fs_sessionlist_lock); -	strcpy(v9ses->uname, V9FS_DEFUSER); -	strcpy(v9ses->aname, V9FS_DEFANAME);  	v9ses->uid = ~0;  	v9ses->dfltuid = V9FS_DEFUID;  	v9ses->dfltgid = V9FS_DEFGID; @@ -412,8 +420,8 @@ void v9fs_session_close(struct v9fs_session_info *v9ses)  		kfree(v9ses->cachetag);  	}  #endif -	__putname(v9ses->uname); -	__putname(v9ses->aname); +	kfree(v9ses->uname); +	kfree(v9ses->aname);  	bdi_destroy(&v9ses->bdi); diff --git a/fs/9p/vfs_inode.c b/fs/9p/vfs_inode.c index cbf9dbb1b2a2..890bed538f9b 100644 --- a/fs/9p/vfs_inode.c +++ b/fs/9p/vfs_inode.c @@ -1276,12 +1276,12 @@ static int v9fs_readlink(struct dentry *dentry, char *buffer, int buflen)  	}  	/* copy extension buffer into buffer */ -	strncpy(buffer, st->extension, buflen); +	retval = min(strlen(st->extension)+1, (size_t)buflen); +	memcpy(buffer, st->extension, retval); -	p9_debug(P9_DEBUG_VFS, "%s -> %s (%s)\n", -		 dentry->d_name.name, st->extension, buffer); +	p9_debug(P9_DEBUG_VFS, "%s -> %s (%.*s)\n", +		 dentry->d_name.name, st->extension, buflen, buffer); -	retval = strnlen(buffer, buflen);  done:  	p9stat_free(st);  	kfree(st); |