On Thu, Jul 30, 2015 at 04:42:00PM +0200, Marek Chalupa wrote: > scanner does not complain if we put into version attribute > things like -1 1x 1:3 etc. > > Signed-off-by: Marek Chalupa <[email protected]>
Reviewed-by: Bryce Harrington <[email protected]> Yep, nice improvement. Pushed to trunk: To ssh://git.freedesktop.org/git/wayland/wayland 765040d..bbe6795 master -> master > --- > src/scanner.c | 39 ++++++++++++++++++++++++++++++--------- > 1 file changed, 30 insertions(+), 9 deletions(-) > > diff --git a/src/scanner.c b/src/scanner.c > index b0e9ef7..9b41ae4 100644 > --- a/src/scanner.c > +++ b/src/scanner.c > @@ -33,6 +33,7 @@ > #include <ctype.h> > #include <expat.h> > #include <getopt.h> > +#include <limits.h> > > #include "wayland-util.h" > > @@ -499,6 +500,29 @@ free_interface(struct interface *interface) > free(interface); > } > > +/* convert string to unsigned integer, > + * in the case of error, return -1 */ > +static int > +strtouint(const char *str) > +{ > + long int ret; > + char *end; > + int prev_errno = errno; > + > + errno = 0; > + ret = strtol(str, &end, 10); > + if (errno != 0 || end == str || *end != '\0') > + return -1; > + > + /* check range */ > + if (ret < 0 || ret > INT_MAX) { > + return -1; > + } > + > + errno = prev_errno; > + return (int)ret; > +} > + > static void > start_element(void *data, const char *element_name, const char **atts) > { > @@ -516,7 +540,6 @@ start_element(void *data, const char *element_name, const > char **atts) > const char *summary = NULL; > const char *since = NULL; > const char *allow_null = NULL; > - char *end; > int i, version = 0; > > ctx->loc.line_number = XML_GetCurrentLineNumber(ctx->parser); > @@ -524,7 +547,9 @@ start_element(void *data, const char *element_name, const > char **atts) > if (strcmp(atts[i], "name") == 0) > name = atts[i + 1]; > if (strcmp(atts[i], "version") == 0) > - version = atoi(atts[i + 1]); > + version = strtouint(atts[i + 1]); > + if (version == -1) > + fail(&ctx->loc, "wrong version (%s)", atts[i + > 1]); > if (strcmp(atts[i], "type") == 0) > type = atts[i + 1]; > if (strcmp(atts[i], "value") == 0) > @@ -577,13 +602,9 @@ start_element(void *data, const char *element_name, > const char **atts) > message->destructor = 1; > > if (since != NULL) { > - int prev_errno = errno; > - errno = 0; > - version = strtol(since, &end, 0); > - if (errno != 0 || end == since || *end != '\0') > - fail(&ctx->loc, > - "invalid integer (%s)\n", since); > - errno = prev_errno; > + version = strtouint(since); > + if (version == -1) > + fail(&ctx->loc, "invalid integer (%s)\n", > since); > } else { > version = 1; > } > -- > 2.4.3 > > _______________________________________________ > wayland-devel mailing list > [email protected] > http://lists.freedesktop.org/mailman/listinfo/wayland-devel _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
