[PATCH wayland] scanner: check sanity of version
Bryce Harrington
bryce at osg.samsung.com
Thu Jul 30 18:34:20 PDT 2015
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 <mchqwerty at gmail.com>
Reviewed-by: Bryce Harrington <bryce at osg.samsung.com>
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
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
More information about the wayland-devel
mailing list