[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] linux: Fix xenbus device write function.
# HG changeset patch # User kfraser@xxxxxxxxxxxxxxxxxxxxx # Date 1172852816 0 # Node ID 36b923615369583d75bd3afb8d9bcbb27b222cb6 # Parent bc265a79dd32d3776160766e7c542cc790fd0155 linux: Fix xenbus device write function. Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> --- linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c | 36 +++++++++++-------- 1 files changed, 22 insertions(+), 14 deletions(-) diff -r bc265a79dd32 -r 36b923615369 linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c --- a/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c Fri Mar 02 16:15:28 2007 +0000 +++ b/linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_dev.c Fri Mar 02 16:26:56 2007 +0000 @@ -173,7 +173,7 @@ static ssize_t xenbus_dev_write(struct f void *reply; char *path, *token; struct watch_adapter *watch, *tmp_watch; - int err; + int err, rc = len; if ((len + u->len) > sizeof(u->u.buffer)) return -EINVAL; @@ -182,8 +182,9 @@ static ssize_t xenbus_dev_write(struct f return -EFAULT; u->len += len; - if (u->len < (sizeof(u->u.msg) + u->u.msg.len)) - return len; + if ((u->len < sizeof(u->u.msg)) || + (u->len < (sizeof(u->u.msg) + u->u.msg.len))) + return rc; msg_type = u->u.msg.type; @@ -201,14 +202,17 @@ static ssize_t xenbus_dev_write(struct f case XS_SET_PERMS: if (msg_type == XS_TRANSACTION_START) { trans = kmalloc(sizeof(*trans), GFP_KERNEL); - if (!trans) - return -ENOMEM; + if (!trans) { + rc = -ENOMEM; + goto out; + } } reply = xenbus_dev_request_and_reply(&u->u.msg); if (IS_ERR(reply)) { kfree(trans); - return PTR_ERR(reply); + rc = PTR_ERR(reply); + goto out; } if (msg_type == XS_TRANSACTION_START) { @@ -231,8 +235,10 @@ static ssize_t xenbus_dev_write(struct f case XS_UNWATCH: path = u->u.buffer + sizeof(u->u.msg); token = memchr(path, 0, u->u.msg.len); - if (token == NULL) - return -EILSEQ; + if (token == NULL) { + rc = -EILSEQ; + goto out; + } token++; if (msg_type == XS_WATCH) { @@ -251,7 +257,8 @@ static ssize_t xenbus_dev_write(struct f err = register_xenbus_watch(&watch->watch); if (err) { free_watch_adapter(watch); - return err; + rc = err; + goto out; } list_add(&watch->list, &u->watches); @@ -265,7 +272,6 @@ static ssize_t xenbus_dev_write(struct f &u->watches, list) { if (!strcmp(watch->token, token) && !strcmp(watch->watch.node, path)) - break; { unregister_xenbus_watch(&watch->watch); list_del(&watch->list); @@ -278,11 +284,13 @@ static ssize_t xenbus_dev_write(struct f break; default: - return -EINVAL; - } - + rc = -EINVAL; + break; + } + + out: u->len = 0; - return len; + return rc; } static int xenbus_dev_open(struct inode *inode, struct file *filp) _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |