[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Fix race between xspy_read_watch and xspy_watch, by placing the watch in the
# HG changeset patch # User emellor@xxxxxxxxxxxxxxxxxxxxxx # Node ID a064c5804eae2893bd19597116c31c41f1a25d41 # Parent bb0e5f7f94fd186868b68379aeb81938a1967d25 Fix race between xspy_read_watch and xspy_watch, by placing the watch in the xshandle's list of watches *before* registering the watch with Xend. Closes bug #392. Signed-off-by: Ewan Mellor <ewan@xxxxxxxxxxxxx> diff -r bb0e5f7f94fd -r a064c5804eae tools/python/xen/lowlevel/xs/xs.c --- a/tools/python/xen/lowlevel/xs/xs.c Tue Nov 15 15:24:31 2005 +++ b/tools/python/xen/lowlevel/xs/xs.c Tue Nov 15 16:22:04 2005 @@ -16,7 +16,7 @@ * * Copyright (C) 2005 Mike Wray Hewlett-Packard * Copyright (C) 2005 Christian Limpach <Christian.Limpach@xxxxxxxxxxxx> - * + * Copyright (C) 2005 XenSource Ltd. */ #include <Python.h> @@ -453,25 +453,20 @@ XsHandle *xsh = (XsHandle *)self; struct xs_handle *xh = xshandle(self); - PyObject *val = NULL; int xsval = 0; if (!xh) - goto exit; + return NULL; if (!PyArg_ParseTupleAndKeywords(args, kwds, arg_spec, kwd_spec, &path, &token)) - goto exit; + return NULL; + + /* Note that we have to store the watch token in the xs->watches list + before registering the watch with xs_watch, otherwise this function + races with xs_read_watch. + */ + Py_INCREF(token); - sprintf(token_str, "%li", (unsigned long)token); - Py_BEGIN_ALLOW_THREADS - xsval = xs_watch(xh, path, token_str); - Py_END_ALLOW_THREADS - if (!xsval) { - PyErr_SetFromErrno(PyExc_RuntimeError); - Py_DECREF(token); - goto exit; - } - for (i = 0; i < PyList_Size(xsh->watches); i++) { if (PyList_GetItem(xsh->watches, i) == Py_None) { PyList_SetItem(xsh->watches, i, token); @@ -480,10 +475,26 @@ } if (i == PyList_Size(xsh->watches)) PyList_Append(xsh->watches, token); + + sprintf(token_str, "%li", (unsigned long)token); + Py_BEGIN_ALLOW_THREADS + xsval = xs_watch(xh, path, token_str); + Py_END_ALLOW_THREADS + if (!xsval) { + for (i = 0; i < PyList_Size(xsh->watches); i++) { + if (PyList_GetItem(xsh->watches, i) == token) { + Py_INCREF(Py_None); + PyList_SetItem(xsh->watches, i, Py_None); + break; + } + } + + PyErr_SetFromErrno(PyExc_RuntimeError); + return NULL; + } + Py_INCREF(Py_None); - val = Py_None; - exit: - return val; + return Py_None; } #define xspy_read_watch_doc "\n" \ @@ -944,3 +955,11 @@ module = Py_InitModule(PYPKG, xs_methods); } + + +/* + * Local variables: + * c-indent-level: 4 + * c-basic-offset: 4 + * End: + */ _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |