All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] xl: Return error when no userdata exists
@ 2011-01-27 17:34 Jim Fehlig
  2011-01-27 18:57 ` Ian Jackson
  0 siblings, 1 reply; 4+ messages in thread
From: Jim Fehlig @ 2011-01-27 17:34 UTC (permalink / raw)
  To: xen-devel

# HG changeset patch
# User Jim Fehlig <jfehlig@novell.com>
# Date 1296149593 25200
# Node ID aa57d7b164e246fb4cf8e971b890bfeb3a287fa9
# Parent  b59f04eb89786e5ae6cb99c5f5dcd8e3790bc3eb
xl: Return error when no userdata exists

The libvirt libxenlight driver will store its own userdata with
id 'libvirt-xml', but currently libxl_userdata_retrieve() does
not fail on non-existent userdata due to inverted error check.

Fix error checking of libxl_read_file_contents() results.

    Signed-off-by: Jim Fehlig <jfehlig@novell.com>

diff -r b59f04eb8978 -r aa57d7b164e2 tools/libxl/libxl_dom.c
--- a/tools/libxl/libxl_dom.c	Fri Jan 21 18:06:23 2011 +0000
+++ b/tools/libxl/libxl_dom.c	Thu Jan 27 10:33:13 2011 -0700
@@ -672,7 +672,7 @@
 
     e = libxl_read_file_contents(ctx, filename, data_r ? &data : 0, &datalen);
 
-    if (!e && !datalen) {
+    if (e && !datalen) {
         LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "userdata file %s is empty", filename);
         if (data_r) assert(!*data_r);
         rc = ERROR_FAIL;

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] xl: Return error when no userdata exists
  2011-01-27 17:34 [PATCH] xl: Return error when no userdata exists Jim Fehlig
@ 2011-01-27 18:57 ` Ian Jackson
  2011-01-27 19:10   ` Jim Fehlig
  0 siblings, 1 reply; 4+ messages in thread
From: Ian Jackson @ 2011-01-27 18:57 UTC (permalink / raw)
  To: Jim Fehlig; +Cc: xen-devel

Jim Fehlig writes ("[Xen-devel] [PATCH] xl: Return error when no userdata exists"):
> xl: Return error when no userdata exists
> 
> The libvirt libxenlight driver will store its own userdata with
> id 'libvirt-xml', but currently libxl_userdata_retrieve() does
> not fail on non-existent userdata due to inverted error check.

Nonexistent userdata is the same as zero-length userdata, according to
the specification.  From libxl.h:

  int libxl_userdata_store(libxl_ctx *ctx, uint32_t domid,
                                const char *userdata_userid,
                                const uint8_t *data, int datalen);
    /* If datalen==0, data is not used and the user data for
     * that domain and userdata_userid is deleted. */

  int libxl_userdata_retrieve(libxl_ctx *ctx, uint32_t domid,
                                   const char *userdata_userid,
                                   uint8_t **data_r, int *datalen_r);
    /* On successful return, *data_r is from malloc.
     * If there is no data for that domain and userdata_userid,
     * *data_r and *datalen_r will be set to 0.
     * data_r and datalen_r may be 0.
     * On error return, *data_r and *datalen_r are undefined.
     */

So I think to detect absence of userdata you should be checking
*data_r or *datalen_r on successful return from
libxl_userdata_retrieve.


You are however correct in that there is a bug in the error handling:
if libxl_read_file_contents fails (ie, e!=0) for a reason other than
ENOENT, libxl_userdata_retrieve improperly ignores it.

I think the patch below fixes this.

Do you agree ?

Thanks,
Ian.


libxl: correct error path in libxl_userdata_retrieve

Firstly, if libxl_read_file_contents fails, it doesn't really leave
*data and *datalen_r undefined - it leaves them unchanged.  Tighten up
the spec for the benefit of libxl_userdata_retrieve.

Secondly, libxl_userdata_retrieve ignored errors, assuming they were
all ENOENT.  Instead it should fail on unexpected errors.

Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>


diff -r 6067a17114bc tools/libxl/libxl_dom.c
--- a/tools/libxl/libxl_dom.c	Thu Jan 27 16:17:27 2011 +0000
+++ b/tools/libxl/libxl_dom.c	Thu Jan 27 18:55:41 2011 +0000
@@ -671,7 +671,10 @@ int libxl_userdata_retrieve(libxl_ctx *c
     }
 
     e = libxl_read_file_contents(ctx, filename, data_r ? &data : 0, &datalen);
-
+    if (e && errno != ENOENT) {
+        rc = ERROR_FAIL;
+        goto out;
+    }
     if (!e && !datalen) {
         LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "userdata file %s is empty", filename);
         if (data_r) assert(!*data_r);
diff -r 6067a17114bc tools/libxl/libxl_utils.h
--- a/tools/libxl/libxl_utils.h	Thu Jan 27 16:17:27 2011 +0000
+++ b/tools/libxl/libxl_utils.h	Thu Jan 27 18:55:41 2011 +0000
@@ -36,7 +36,7 @@ int libxl_read_file_contents(libxl_ctx *
   /* Reads the contents of the plain file filename into a mallocd
    * buffer.  Returns 0 or errno.  Any errors other than ENOENT are logged.
    * If the file is empty, *data_r and *datalen_r are set to 0.
-   * On error, *data_r and *datalen_r are undefined.
+   * On error, *data_r and *datalen_r are unchanged.
    * data_r and/or datalen_r may be 0.
    */

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] xl: Return error when no userdata exists
  2011-01-27 18:57 ` Ian Jackson
@ 2011-01-27 19:10   ` Jim Fehlig
  2011-01-28 16:44     ` Ian Jackson
  0 siblings, 1 reply; 4+ messages in thread
From: Jim Fehlig @ 2011-01-27 19:10 UTC (permalink / raw)
  To: Ian Jackson; +Cc: xen-devel

Ian Jackson wrote:
> Jim Fehlig writes ("[Xen-devel] [PATCH] xl: Return error when no userdata exists"):
>   
>> xl: Return error when no userdata exists
>>
>> The libvirt libxenlight driver will store its own userdata with
>> id 'libvirt-xml', but currently libxl_userdata_retrieve() does
>> not fail on non-existent userdata due to inverted error check.
>>     
>
> Nonexistent userdata is the same as zero-length userdata, according to
> the specification.  From libxl.h:
>
>   int libxl_userdata_store(libxl_ctx *ctx, uint32_t domid,
>                                 const char *userdata_userid,
>                                 const uint8_t *data, int datalen);
>     /* If datalen==0, data is not used and the user data for
>      * that domain and userdata_userid is deleted. */
>
>   int libxl_userdata_retrieve(libxl_ctx *ctx, uint32_t domid,
>                                    const char *userdata_userid,
>                                    uint8_t **data_r, int *datalen_r);
>     /* On successful return, *data_r is from malloc.
>      * If there is no data for that domain and userdata_userid,
>      * *data_r and *datalen_r will be set to 0.
>      * data_r and datalen_r may be 0.
>      * On error return, *data_r and *datalen_r are undefined.
>      */
>
> So I think to detect absence of userdata you should be checking
> *data_r or *datalen_r on successful return from
> libxl_userdata_retrieve.
>   

Okay.

> You are however correct in that there is a bug in the error handling:
> if libxl_read_file_contents fails (ie, e!=0) for a reason other than
> ENOENT, libxl_userdata_retrieve improperly ignores it.
>   

Right.

> I think the patch below fixes this.
>
> Do you agree ?
>   

Yes.

Acked-by: Jim Fehlig <jfehlig@novell.com>

Thanks,
Jim

> Thanks,
> Ian.
>
>
> libxl: correct error path in libxl_userdata_retrieve
>
> Firstly, if libxl_read_file_contents fails, it doesn't really leave
> *data and *datalen_r undefined - it leaves them unchanged.  Tighten up
> the spec for the benefit of libxl_userdata_retrieve.
>
> Secondly, libxl_userdata_retrieve ignored errors, assuming they were
> all ENOENT.  Instead it should fail on unexpected errors.
>
> Signed-off-by: Ian Jackson <ian.jackson@eu.citrix.com>
>
>
> diff -r 6067a17114bc tools/libxl/libxl_dom.c
> --- a/tools/libxl/libxl_dom.c	Thu Jan 27 16:17:27 2011 +0000
> +++ b/tools/libxl/libxl_dom.c	Thu Jan 27 18:55:41 2011 +0000
> @@ -671,7 +671,10 @@ int libxl_userdata_retrieve(libxl_ctx *c
>      }
>  
>      e = libxl_read_file_contents(ctx, filename, data_r ? &data : 0, &datalen);
> -
> +    if (e && errno != ENOENT) {
> +        rc = ERROR_FAIL;
> +        goto out;
> +    }
>      if (!e && !datalen) {
>          LIBXL__LOG(ctx, LIBXL__LOG_ERROR, "userdata file %s is empty", filename);
>          if (data_r) assert(!*data_r);
> diff -r 6067a17114bc tools/libxl/libxl_utils.h
> --- a/tools/libxl/libxl_utils.h	Thu Jan 27 16:17:27 2011 +0000
> +++ b/tools/libxl/libxl_utils.h	Thu Jan 27 18:55:41 2011 +0000
> @@ -36,7 +36,7 @@ int libxl_read_file_contents(libxl_ctx *
>    /* Reads the contents of the plain file filename into a mallocd
>     * buffer.  Returns 0 or errno.  Any errors other than ENOENT are logged.
>     * If the file is empty, *data_r and *datalen_r are set to 0.
> -   * On error, *data_r and *datalen_r are undefined.
> +   * On error, *data_r and *datalen_r are unchanged.
>     * data_r and/or datalen_r may be 0.
>     */
>  
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@lists.xensource.com
> http://lists.xensource.com/xen-devel
>   

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH] xl: Return error when no userdata exists
  2011-01-27 19:10   ` Jim Fehlig
@ 2011-01-28 16:44     ` Ian Jackson
  0 siblings, 0 replies; 4+ messages in thread
From: Ian Jackson @ 2011-01-28 16:44 UTC (permalink / raw)
  To: Jim Fehlig; +Cc: xen-devel@lists.xensource.com

Jim Fehlig writes ("Re: [Xen-devel] [PATCH] xl: Return error when no userdata exists"):
> Ian Jackson wrote:
> > I think the patch below fixes this.
> 
> Yes.
> 
> Acked-by: Jim Fehlig <jfehlig@novell.com>

Thanks, applied.

Do let us know what else you discover that needs fixing.  I won't be
surprised if the API needs changes, in which case we'll put those in
4.2.

Ian.

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2011-01-28 16:44 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-01-27 17:34 [PATCH] xl: Return error when no userdata exists Jim Fehlig
2011-01-27 18:57 ` Ian Jackson
2011-01-27 19:10   ` Jim Fehlig
2011-01-28 16:44     ` Ian Jackson

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.