On Wed, Sep 17, 2014 at 07:10:00PM -0700, Jason Gerecke wrote:
> There's not much to like about this function's implementation. The
> few scan-build warnings specific to this particular function suggested
> it should be put to pasture and replaced with something better.
> 
> Signed-off-by: Jason Gerecke <killert...@gmail.com>
> ---
>  tools/xsetwacom.c | 45 ++++++++++++++++++---------------------------
>  1 file changed, 18 insertions(+), 27 deletions(-)
> 
> diff --git a/tools/xsetwacom.c b/tools/xsetwacom.c
> index 9c0f65b..614d476 100644
> --- a/tools/xsetwacom.c
> +++ b/tools/xsetwacom.c
> @@ -44,6 +44,9 @@
>  #define TRACE(...) \
>       if (verbose) fprintf(stderr, "... " __VA_ARGS__)
>  
> +#define safe_realloc(p, n, s) \
> +     ((size_t)-1 / (n) < (s) ? NULL : realloc((p), (n)*(s)))
> +
>  static int verbose = False;
>  
>  enum printformat {
> @@ -1191,36 +1194,24 @@ static int special_map_keystrokes(Display *dpy, int 
> argc, char **argv, unsigned
>   */
>  static char** strjoinsplit(int argc, char **argv, int *nwords)
>  {
> -     char buff[1024] = { 0 };
> -     char **words    = NULL;
> -     char *tmp, *tok;
> -
> -     while(argc--)
> -     {
> -             if (strlen(buff) + strlen(*argv) + 2 >= sizeof(buff))
> -                     break;
> -
> -             strcat(buff, *argv);
> -             strcat(buff, " ");
> -             argv++;
> -     }
> +     char **words = NULL;
> +     int i, n;
>  
>       *nwords = 0;
> +     for (i = 0; i < argc; i++) {
> +             char *tok = strtok(argv[i], " ");
> +             while (tok) {
> +                     char **p = safe_realloc(words, *nwords+1, 
> sizeof(char*));
> +                     if (!p) {
> +                             fprintf(stderr, "Unable to reallocate memory.");
> +                             break;
> +                     }
>  
> -     for (tmp = buff; tmp && *tmp != '\0'; tmp = index((const char*)tmp, ' 
> ') + 1)
> -             (*nwords)++;
> -
> -     if (!*nwords)
> -             return NULL;
> -     else
> -             words = calloc(*nwords, sizeof(char*));
> -
> -     *nwords = 0;
> -     tok = strtok(buff, " ");
> -     while(tok)
> -     {
> -             words[(*nwords)++] = strdup(tok);
> -             tok = strtok(NULL, " ");
> +                     words = p;
> +                     words[*nwords] = strdup(tok);

could argue for quitting here if strdup fails.
either way

Acked-by: Peter Hutterer <peter.hutte...@who-t.net>
for the series with the v2

Cheers,
   Peter


> +                     (*nwords)++;
> +                     tok = strtok(NULL, " ");
> +             }
>       }
>  
>       return words;
> -- 
> 2.1.0
> 

------------------------------------------------------------------------------
Slashdot TV.  Video for Nerds.  Stuff that Matters.
http://pubads.g.doubleclick.net/gampad/clk?id=160591471&iu=/4140/ostg.clktrk
_______________________________________________
Linuxwacom-devel mailing list
Linuxwacom-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linuxwacom-devel

Reply via email to