[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 2 of 7 v2] blktap3/tapback: Introduces functionality required to access XenStore



> On Fri, 2013-01-04 at 12:14 +0000, Thanos Makatos wrote:
> > This patch introduces convenience functions that read/write values
> from/to
> > XenStore.
> >
> > diff -r 0777319f0a6e -r efd3f343f7c7 tools/blktap3/tapback/xenstore.c
> > --- /dev/null       Thu Jan 01 00:00:00 1970 +0000
> > +++ b/tools/blktap3/tapback/xenstore.c      Fri Jan 04 11:54:51 2013
> +0000
> > @@ -0,0 +1,188 @@
> > +/*
> > + * Copyright (C) 2012      Citrix Ltd.
> > + *
> > + * This program is free software; you can redistribute it and/or
> > + * modify it under the terms of the GNU General Public License
> > + * as published by the Free Software Foundation; either version 2
> > + * of the License, or (at your option) any later version.
> > + *
> > + * This program is distributed in the hope that it will be useful,
> > + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> > + * GNU General Public License for more details.
> > + *
> > + * You should have received a copy of the GNU General Public License
> > + * along with this program; if not, write to the Free Software
> > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
> 02110-1301,
> > + * USA.
> > + */
> > +
> > +#include <stdarg.h>
> > +#include <stdio.h>
> > +#include <xenstore.h>
> > +#include <assert.h>
> > +#include <stdlib.h>
> > +#include <string.h>
> > +
> > +#include "blktap3.h"
> > +#include "tapback.h"
> > +#include "xenstore.h"
> > +
> > +/**
> > + * Prints the supplied arguments to a buffer and returns it. The
> buffer must
> > + * be deallocated by the user.
> 
> I'm not sure how much value this function has for callers over and
> above
> just using (v)asprintf directly, likewise for mprintf.

You're right they don't add anything, I'll remove them.

> 
> > + */
> > +static char *
> > +vmprintf(const char * const fmt, va_list ap)
> > +{
> > +    char *s = NULL;
> 
> No need to init s.

Regarding initialising variables, isn't it a good programming practice to 
initialise variables even if they'll be shortly assigned a value? Won't the 
compiler easily optimise such cases? Or does it make it too cumbersome to read? 
In any case, I checked the coding style document and it doesn't specify this, 
so I think it would be a meaningful addition.

> 
> > +
> > +    if (vasprintf(&s, fmt, ap) < 0)
> > +        s = NULL;
> > +
> > +    return s;
> > +}
> > +
> > +__printf(1, 2)
> > +char *
> > +mprintf(const char * const fmt, ...)
> > +{
> > +    va_list ap;
> > +    char *s = NULL;
> 
> No need to init s.
> 
> > +
> > +    va_start(ap, fmt);
> > +    s = vmprintf(fmt, ap);
> > +    va_end(ap);
> > +
> > +    return s;
> > +}
> > +
> > +char *
> > +tapback_xs_vread(struct xs_handle * const xs, xs_transaction_t xst,
> > +        const char * const fmt, va_list ap)
> 
> This might be an interesting/useful addition to libxenstore?

Sure.

> 
> > +{
> > +    char *path = NULL, *data = NULL;
> 
> No need to init path.
> 
> > +    unsigned int len = 0;
> > +
> > +    assert(xs);
> > +
> > +    path = vmprintf(fmt, ap);
> > +    data = xs_read(xs, xst, path, &len);
> 
> This uses path without checking if it is NULL.
> 
> I think you can pass len == NULL if you don't care about the length of
> the result.

Right.

> 
> However xenstore values generally can contain nulls and are not
> necessarily NULL terminated (see docs/misc/xenstore.txt), but perhaps
> the block protocol tightens this restriction such that you can rely on
> NULL termination (at least in practice)?

Hm.. I saw this in tools/xenstore/xenstore.h and I though xs_read does end the 
string with a NULL:

/* Get the value of a single file, nul terminated.
 * Returns a malloced value: call free() on it after use.
 * len indicates length in bytes, not including terminator.
 */
void *xs_read(struct xs_handle *h, xs_transaction_t t,
              const char *path, unsigned int *len);

Am I missing something?

> 
> > +    free(path);
> > +
> > +    return data;
> > +}
> > +
> > +__printf(3, 4)
> > +char *
> > +tapback_xs_read(struct xs_handle * const xs, xs_transaction_t xst,
> > +        const char * const fmt, ...)
> > +{
> > +    va_list ap;
> > +    char *s = NULL;
> 
> No need to init s.
> 
> > +
> > +    assert(xs);
> > +
> > +    va_start(ap, fmt);
> > +    s = tapback_xs_vread(xs, xst, fmt, ap);
> > +    va_end(ap);
> > +
> > +    return s;
> > +}
> > +
> 
> > +__scanf(3, 4)
> > +int
> > +tapback_device_scanf_otherend(vbd_t * const device,
> > +        const char * const path, const char * const fmt, ...)
> > +{
> > +    va_list ap;
> > +    int n = 0;
> > +    char *s = NULL;
> > +
> > +    assert(device);
> > +    assert(path);
> > +
> > +    if (!(s = tapback_device_read_otherend(device, path)))
> > +        return -1;
> 
> Since s here is read from the frontend you probably can't trust it to
> be
> NULL terminated.
> 
> > +    va_start(ap, fmt);
> > +    n = vsscanf(s, fmt, ap);
> > +    free(s);
> > +    va_end(ap);
> > +
> > +    return n;
> > +}
> > +
> 
> Ian.

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.