[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2/2] x86/hvmloader: Improve error handling for xenbus interactions
Consume and ignore all XS_DEBUG packets, and pass the response type back to the caller of xenbus_recv() so the caller can take appropriate action if an unexpected reply was received. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> CC: Jan Beulich <JBeulich@xxxxxxxx> --- tools/firmware/hvmloader/xenbus.c | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/tools/firmware/hvmloader/xenbus.c b/tools/firmware/hvmloader/xenbus.c index 00513f7..d0ed993 100644 --- a/tools/firmware/hvmloader/xenbus.c +++ b/tools/firmware/hvmloader/xenbus.c @@ -208,15 +208,23 @@ static void xenbus_send(uint32_t type, ...) * Returns 0 for success, or an errno for error. * The answer is returned in a static buffer which is only * valid until the next call of xenbus_send(). */ -static int xenbus_recv(uint32_t *reply_len, const char **reply_data) +static int xenbus_recv(uint32_t *reply_len, const char **reply_data, + uint32_t *reply_type) { struct xsd_sockmsg hdr; - /* Pull the reply off the ring */ - ring_read((char *) &hdr, sizeof(hdr)); - ring_read(payload, hdr.len); - /* For sanity's sake, nul-terminate the answer */ - payload[hdr.len] = '\0'; + do + { + /* Pull the reply off the ring */ + ring_read((char *) &hdr, sizeof(hdr)); + ring_read(payload, hdr.len); + /* For sanity's sake, nul-terminate the answer */ + payload[hdr.len] = '\0'; + + } while ( hdr.type == XS_DEBUG ); + + if ( reply_type ) + *reply_type = hdr.type; /* Handle errors */ if ( hdr.type == XS_ERROR ) @@ -247,7 +255,7 @@ static int xenbus_recv(uint32_t *reply_len, const char **reply_data) */ const char *xenstore_read(const char *path, const char *default_resp) { - uint32_t len = 0; + uint32_t len = 0, type = 0; const char *answer = NULL; xenbus_send(XS_READ, @@ -255,7 +263,7 @@ const char *xenstore_read(const char *path, const char *default_resp) "", 1, /* nul separator */ NULL, 0); - if ( xenbus_recv(&len, &answer) ) + if ( xenbus_recv(&len, &answer, &type) || (type != XS_READ) ) answer = NULL; if ( (default_resp != NULL) && ((answer == NULL) || (*answer == '\0')) ) @@ -270,13 +278,23 @@ const char *xenstore_read(const char *path, const char *default_resp) */ int xenstore_write(const char *path, const char *value) { + uint32_t len = 0, type = 0; + const char *answer = NULL; + int ret; + xenbus_send(XS_WRITE, path, strlen(path), "", 1, /* nul separator */ value, strlen(value), NULL, 0); - return ( xenbus_recv(NULL, NULL) ); + ret = xenbus_recv(&len, &answer, &type); + + if ( ret == 0 && ((type != XS_WRITE) || (len != 3) || + !answer || strcmp(answer, "OK")) ) + ret = EIO; + + return ret; } /* -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |