[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH V4 09/24] libxl_json: introduce parser functions for builtin types
On Tue, May 06, 2014 at 04:42:20PM +0100, Wei Liu wrote: > On Tue, May 06, 2014 at 04:14:53PM +0100, Anthony PERARD wrote: > > On Tue, May 06, 2014 at 03:49:06PM +0100, Wei Liu wrote: > > > On Tue, May 06, 2014 at 03:45:47PM +0100, Wei Liu wrote: > > > > On Tue, May 06, 2014 at 03:35:27PM +0100, Anthony PERARD wrote: > > > > [...] > > > > > > +/* Macro to generate: > > > > > > + * libxl__uint8_parse_json > > > > > > + * libxl__uint16_parse_json > > > > > > + * libxl__uint32_parse_json > > > > > > + * libxl__uint64_parse_json > > > > > > + */ > > > > > > +#define PARSE_UINT(width) > > > > > > \ > > > > > > + int libxl__uint ## width ## _parse_json(libxl__gc *gc, > > > > > > \ > > > > > > + const > > > > > > libxl__json_object *o,\ > > > > > > + void *p) > > > > > > \ > > > > > > + { > > > > > > \ > > > > > > + long long i; > > > > > > \ > > > > > > + > > > > > > \ > > > > > > + if (!libxl__json_object_is_integer(o)) > > > > > > \ > > > > > > + return ERROR_FAIL; > > > > > > \ > > > > > > + > > > > > > \ > > > > > > + i = libxl__json_object_get_integer(o); > > > > > > \ > > > > > > + > > > > > > \ > > > > > > + if (i > UINT ## width ## _MAX) > > > > > > \ > > > > > > + return ERROR_FAIL; > > > > > > \ > > > > > > > > > > My guest is this will always be false for uint64 and maybe for uint32. > > > > > The value return by get_interger can only be <= LLONG_MAX which I > > > > > suppose is still < UINT64_MAX. > > > > > > > > > > > > > I was just being lazy about it. > > > > > > > > > Also, 'i' might be < 0. > > > > > > > > > > > > > Phew, I knew this but somehow I thought it was OK. :-( > > > > > > > > So the two things combined, the check should be > > > > > > > > (i > 0 && i < UINT ## width ## _MAX) > > > > > > > > What do you think? > > > > 0 is also valid ;), and I think UINTX_MAX is valid too, > > so (i >= 0 && i <= UINT ## width ## _MAX) should do. > > Or: > > if (i < 0 || i > UINT ## width ## _MAX) > > return ERROR_FAIL; > > > > > > > > > If json contain a value > LLONG_MAX, the value will be store as a > > > > > string > > > > > with the type number. > > > > > > > > > > > > > This is also true, but I coded like this on purpose. You won't be able > > > > to convert that string anyway because that's why it's stored as string > > > > in the first place. We should just return ERROR_FAIL in this case, which > > > > we do already with the check libxl__json_object_is_integer. > > > > > > > > > > Of course with the sole exception of uint64_t parser. This is a special > > > case that needs to be handled. > > > > Right. > > > > For your convenient I paste the relevant code snippet here: > > +/* Macro to generate: > + * libxl__uint8_parse_json > + * libxl__uint16_parse_json > + * libxl__uint32_parse_json > + */ > +#define PARSE_UINT(width) \ > + int libxl__uint ## width ## _parse_json(libxl__gc *gc, \ > + const libxl__json_object *o,\ > + void *p) \ > + { \ > + long long i; \ > + \ > + if (!libxl__json_object_is_integer(o)) \ > + return ERROR_FAIL; \ > + \ > + i = libxl__json_object_get_integer(o); \ > + \ > + if (i < 0 || i > UINT ## width ## _MAX) \ > + return ERROR_FAIL; \ > + \ > + *((uint ## width ## _t *)p) = i; \ > + \ > + return 0; \ > + } > + > +PARSE_UINT(8); > +PARSE_UINT(16); > +PARSE_UINT(32); > + > +int libxl__uint64_parse_json(libxl__gc *gc, const libxl__json_object *o, > + void *p) > +{ > + if (!libxl__json_object_is_integer(o) && > + !libxl__json_object_is_number(o)) > + return ERROR_FAIL; > + > + if (libxl__json_object_is_integer(o)) { > + long long i = libxl__json_object_get_integer(o); > + > + if (i < 0) > + return ERROR_FAIL; > + > + *((uint64_t *)p) = i; > + } else { > + const char *s; > + unsigned long long i; > + int saved_errno = errno; > + > + s = libxl__json_object_get_number(o); > + > + errno = 0; > + i = strtoull(s, NULL, 10); > + > + if (i == ULLONG_MAX && errno == ERANGE) > + return ERROR_FAIL; > + > + errno = saved_errno; > + *((uint64_t *)p) = i; > + } > + > + return 0; > +} That look good now. Ack on the all patch. -- Anthony PERARD _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |