[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] xenstore test crash
On Thu, 2005-06-09 at 22:21 -0500, Paul Larson wrote: > Yeah, seemed odd to me too, but it was easily reproducible as long as I > was using --readonly. Without the --readonly flag, the test passed with > no crash. Untested code is buggy code. Here's the patch (should apply with maybe some minor fixups). Rusty. Index: xs_test.c =================================================================== RCS file: /var/cvs/xeno-unstable/tools/xenstore/xs_test.c,v retrieving revision 1.7 diff -u -r1.7 xs_test.c --- xs_test.c 8 Jun 2005 09:06:12 -0000 1.7 +++ xs_test.c 10 Jun 2005 14:06:40 -0000 @@ -176,11 +176,11 @@ " watch <path> <token> <prio>\n" " waitwatch\n" " ackwatch <token>\n" - " unwatch <path>\n" + " unwatch <path> <token>\n" " close\n" " start <node>\n" " abort\n" - " introduce <domid> <mfn> <eventchn>\n" + " introduce <domid> <mfn> <eventchn> <path>\n" " commit\n" " sleep <seconds>\n" " dump\n"); Index: xsdaemon_core.c =================================================================== RCS file: /var/cvs/xeno-unstable/tools/xenstore/xsdaemon_core.c,v retrieving revision 1.25 diff -u -r1.25 xsdaemon_core.c --- xsdaemon_core.c 9 Jun 2005 04:52:01 -0000 1.25 +++ xsdaemon_core.c 10 Jun 2005 14:06:41 -0000 @@ -645,7 +645,7 @@ return false; } - if (!conn->write && (perm & XS_PERM_WRITE)) { + if (!conn->can_write && (perm & XS_PERM_WRITE)) { errno = EROFS; return false; } @@ -972,9 +972,12 @@ return do_set_perms(conn, in); case XS_SHUTDOWN: + /* FIXME: Implement gentle shutdown too. */ /* Only tools can do this. */ if (conn->id != 0) return send_error(conn, EACCES); + if (!conn->can_write) + return send_error(conn, EROFS); send_ack(conn, XS_SHUTDOWN); /* Everything hangs off auto-free context, freed at exit. */ exit(0); @@ -1173,6 +1176,7 @@ new->transaction = NULL; new->write = write; new->read = read; + new->can_write = true; talloc_set_fail_handler(out_of_mem, &talloc_fail); if (setjmp(talloc_fail)) { @@ -1206,10 +1210,11 @@ if (fd < 0) return; - conn = new_connection(canwrite ? writefd : NULL, readfd); - if (conn) + conn = new_connection(writefd, readfd); + if (conn) { conn->fd = fd; - else + conn->can_write = canwrite; + } else close(fd); } Index: xsdaemon_core.h =================================================================== RCS file: /var/cvs/xeno-unstable/tools/xenstore/xsdaemon_core.h,v retrieving revision 1.9 diff -u -r1.9 xsdaemon_core.h --- xsdaemon_core.h 8 Jun 2005 09:06:12 -0000 1.9 +++ xsdaemon_core.h 10 Jun 2005 14:06:42 -0000 @@ -56,6 +56,9 @@ /* Are we blocked waiting for a transaction to end? Contains node. */ char *blocked; + /* Is this a read-only connection? */ + bool can_write; + /* Are we waiting for a watch event ack? */ bool waiting_for_ack; Index: xsdaemon_domain.c =================================================================== RCS file: /var/cvs/xeno-unstable/tools/xenstore/xsdaemon_domain.c,v retrieving revision 1.16 diff -u -r1.16 xsdaemon_domain.c --- xsdaemon_domain.c 6 Jun 2005 01:30:55 -0000 1.16 +++ xsdaemon_domain.c 10 Jun 2005 14:06:42 -0000 @@ -271,6 +271,9 @@ if (conn->id != 0) return send_error(conn, EACCES); + if (!conn->can_write) + return send_error(conn, EROFS); + /* Hang domain off "in" until we're finished. */ domain = talloc(in, struct domain); domain->domid = atoi(vec[0]); -- A bad analogy is like a leaky screwdriver -- Richard Braakman _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |