for-linus-3.12-merge minor 9p fixes and tweaks for 3.12 merge window
The first fixes namespace issues which causes a kernel NULL pointer dereference, the second fixes uevent handling to work better with udev, and the third switches some code to use srlcpy instead of strncpy in order to be safer. All changes have been baking in for-next for at least 2 weeks. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) Comment: GPGTools - http://gpgtools.org iQIcBAABAgAGBQJSMJjZAAoJEDZk62b0Tg6x81sQAKa60QStBKhnL65bvG+ooIsS mhwfmFyaWOKw1ezwY2Vk0+JnmKDBpKmqjjwyL3nLP18TcRZStPiFdcJBKWl+czge FTv14t54CcjysYPbYN7+gUap4F5mfg0mcHaR0UGow505dNyjwd7mqkZhy1IqhdvP Ue/h0RE46GeNtdirxrKBdEfW/7TAL0tcoRgjKu0ev1V2sXCJZywuXgkzWjByRXwT JOg04gGnYThuek0/KUPRhf0KxB0CyKrZiics7LGb40HkYYxs7ahADACttLyiDr8l GntfHXLgvVlU5QcSbKRfLp0zNbi7AxWmJrwYsEwpas4tUw1Q+pVJ2EE2Ameuq5G+ LrMGmRVQCVYw8UN+OYUO7glhXEJcCPJj6vxgm+NVXx24yaQyGI1aTsIEjHwZ/hkm wlQHC47z6/fIypkXpsU6pYWF/r3GwXHokYReejATQWEPIzIxvHeThe0jjqMLth7F zmsHZTpmECqtti1fizy5wBZD25wAIxdf+rf8nKy1VvcSN4s08ESSlC/kV/siNeko efFnL8xbjP5SPEVoBtXM6eTDHrQ0S+ACSGWtp0FGXKOW4PKzS60ve2Stp+FYZgQc WgXI7+NBU6Z9z+cZ9bsY0hrGwK1YZiR4F3KJ5ofTuxAO6n7zd+N3fGBuQJ2tiW9P pKtIXNozWqnAU9Wx4rGa =YbFT -----END PGP SIGNATURE----- Merge tag 'for-linus-3.12-merge' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs Pull 9p updates from Eric Van Hensbergen: "Minor 9p fixes and tweaks for 3.12 merge window The first fixes namespace issues which causes a kernel NULL pointer dereference, the second fixes uevent handling to work better with udev, and the third switches some code to use srlcpy instead of strncpy in order to be safer. All changes have been baking in for-next for at least 2 weeks" * tag 'for-linus-3.12-merge' of git://git.kernel.org/pub/scm/linux/kernel/git/ericvh/v9fs: fs/9p: avoid accessing utsname after namespace has been torn down 9p: send uevent after adding/removing mount_tag attribute fs: 9p: use strlcpy instead of strncpy
This commit is contained in:
commit
2b76db6a0f
@ -183,7 +183,7 @@ static int v9fs_file_do_lock(struct file *filp, int cmd, struct file_lock *fl)
|
||||
else
|
||||
flock.length = fl->fl_end - fl->fl_start + 1;
|
||||
flock.proc_id = fl->fl_pid;
|
||||
flock.client_id = utsname()->nodename;
|
||||
flock.client_id = fid->clnt->name;
|
||||
if (IS_SETLKW(cmd))
|
||||
flock.flags = P9_LOCK_FLAGS_BLOCK;
|
||||
|
||||
@ -260,7 +260,7 @@ static int v9fs_file_getlock(struct file *filp, struct file_lock *fl)
|
||||
else
|
||||
glock.length = fl->fl_end - fl->fl_start + 1;
|
||||
glock.proc_id = fl->fl_pid;
|
||||
glock.client_id = utsname()->nodename;
|
||||
glock.client_id = fid->clnt->name;
|
||||
|
||||
res = p9_client_getlock_dotl(fid, &glock);
|
||||
if (res < 0)
|
||||
|
@ -146,7 +146,7 @@ static umode_t p9mode2unixmode(struct v9fs_session_info *v9ses,
|
||||
char type = 0, ext[32];
|
||||
int major = -1, minor = -1;
|
||||
|
||||
strncpy(ext, stat->extension, sizeof(ext));
|
||||
strlcpy(ext, stat->extension, sizeof(ext));
|
||||
sscanf(ext, "%c %u %u", &type, &major, &minor);
|
||||
switch (type) {
|
||||
case 'c':
|
||||
@ -1186,7 +1186,7 @@ v9fs_stat2inode(struct p9_wstat *stat, struct inode *inode,
|
||||
* this even with .u extension. So check
|
||||
* for non NULL stat->extension
|
||||
*/
|
||||
strncpy(ext, stat->extension, sizeof(ext));
|
||||
strlcpy(ext, stat->extension, sizeof(ext));
|
||||
/* HARDLINKCOUNT %u */
|
||||
sscanf(ext, "%13s %u", tag_name, &i_nlink);
|
||||
if (!strncmp(tag_name, "HARDLINKCOUNT", 13))
|
||||
|
@ -26,6 +26,8 @@
|
||||
#ifndef NET_9P_CLIENT_H
|
||||
#define NET_9P_CLIENT_H
|
||||
|
||||
#include <linux/utsname.h>
|
||||
|
||||
/* Number of requests per row */
|
||||
#define P9_ROW_MAXTAG 255
|
||||
|
||||
@ -134,6 +136,7 @@ struct p9_req_t {
|
||||
* @tagpool - transaction id accounting for session
|
||||
* @reqs - 2D array of requests
|
||||
* @max_tag - current maximum tag id allocated
|
||||
* @name - node name used as client id
|
||||
*
|
||||
* The client structure is used to keep track of various per-client
|
||||
* state that has been instantiated.
|
||||
@ -164,6 +167,8 @@ struct p9_client {
|
||||
struct p9_idpool *tagpool;
|
||||
struct p9_req_t *reqs[P9_ROW_MAXTAG];
|
||||
int max_tag;
|
||||
|
||||
char name[__NEW_UTS_LEN + 1];
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -987,6 +987,7 @@ struct p9_client *p9_client_create(const char *dev_name, char *options)
|
||||
{
|
||||
int err;
|
||||
struct p9_client *clnt;
|
||||
char *client_id;
|
||||
|
||||
err = 0;
|
||||
clnt = kmalloc(sizeof(struct p9_client), GFP_KERNEL);
|
||||
@ -995,6 +996,10 @@ struct p9_client *p9_client_create(const char *dev_name, char *options)
|
||||
|
||||
clnt->trans_mod = NULL;
|
||||
clnt->trans = NULL;
|
||||
|
||||
client_id = utsname()->nodename;
|
||||
memcpy(clnt->name, client_id, strlen(client_id) + 1);
|
||||
|
||||
spin_lock_init(&clnt->lock);
|
||||
INIT_LIST_HEAD(&clnt->fidlist);
|
||||
|
||||
|
@ -577,6 +577,10 @@ static int p9_virtio_probe(struct virtio_device *vdev)
|
||||
mutex_lock(&virtio_9p_lock);
|
||||
list_add_tail(&chan->chan_list, &virtio_chan_list);
|
||||
mutex_unlock(&virtio_9p_lock);
|
||||
|
||||
/* Let udev rules use the new mount_tag attribute. */
|
||||
kobject_uevent(&(vdev->dev.kobj), KOBJ_CHANGE);
|
||||
|
||||
return 0;
|
||||
|
||||
out_free_tag:
|
||||
@ -654,6 +658,7 @@ static void p9_virtio_remove(struct virtio_device *vdev)
|
||||
list_del(&chan->chan_list);
|
||||
mutex_unlock(&virtio_9p_lock);
|
||||
sysfs_remove_file(&(vdev->dev.kobj), &dev_attr_mount_tag.attr);
|
||||
kobject_uevent(&(vdev->dev.kobj), KOBJ_CHANGE);
|
||||
kfree(chan->tag);
|
||||
kfree(chan->vc_wq);
|
||||
kfree(chan);
|
||||
|
Loading…
x
Reference in New Issue
Block a user