[Buildroot] [PATCH] ext-toolchain-wrapper.c: Handle an arbitrary amount of arguments

Bjørn Forsman bjorn.forsman at gmail.com
Tue Jun 21 17:47:22 UTC 2011


2011/6/21 Daniel Nyström <daniel.nystrom at timeterminal.se>:
> Even though MAXARGS 1000 seems large, it wasn't enought for at least
> QtWebKit package. This new version does not have any predefined limits.
>
> Signed-off-by: Daniel Nyström <daniel.nystrom at timeterminal.se>
> Reported-by: Thomas Björk <thomas.bjork at home.se>
> ---
>  .../toolchain-external/ext-toolchain-wrapper.c     |   26 ++++++++++++-------
>  1 files changed, 16 insertions(+), 10 deletions(-)
>
> diff --git a/toolchain/toolchain-external/ext-toolchain-wrapper.c b/toolchain/toolchain-external/ext-toolchain-wrapper.c
> index a485e74..51f85e7 100644
> --- a/toolchain/toolchain-external/ext-toolchain-wrapper.c
> +++ b/toolchain/toolchain-external/ext-toolchain-wrapper.c
> @@ -4,6 +4,7 @@
>  * to ensure the external toolchain uses the correct configuration.
>  *
>  * (C) 2011 Peter Korsgaard <jacmet at sunsite.dk>
> + * (C) 2011 Daniel Nyström <daniel.nystrom at timeterminal.se>
>  *
>  * This file is licensed under the terms of the GNU General Public License
>  * version 2.  This program is licensed "as is" without any warranty of any
> @@ -14,12 +15,11 @@
>  #include <string.h>
>  #include <limits.h>
>  #include <unistd.h>
> -
> -#define MAXARGS 1000
> +#include <stdlib.h>
>
>  static char path[PATH_MAX] = BR_CROSS_PATH;
>
> -static char *args[MAXARGS] = {
> +static char *predef_args[] = {
>        path,
>        "--sysroot", BR_SYSROOT,
>  #ifdef BR_ARCH
> @@ -55,21 +55,27 @@ static const char *get_basename(const char *name)
>  int main(int argc, char **argv)
>  {
>        int i;
> +       char **args, **cur;
> +
> +       cur = args = malloc(sizeof(predef_args) + (sizeof(char *) * argc));

Would you mind checking for args == NULL here, to avoid possible
segfault on the next line (...and invalid free() later)? Thanks!

> -       for (i=0; args[i]; i++);
> +       /* start with predefined args */
> +       memcpy(cur, predef_args, sizeof(predef_args));
> +       cur += sizeof(predef_args) / sizeof(predef_args[0]);
>
> -       if ((argc+i) >= MAXARGS) {
> -               fputs("Too many arguments\n", stderr);
> -               return 1;
> -       }
> +       /* append forward args */
> +       memcpy(cur, &argv[1], sizeof(char *) * (argc - 1));
> +       cur += argc - 1;
>
> -       /* forward args */
> -       memcpy(&args[i], &argv[1], sizeof(argv[0]) * (argc - 1));
> +       /* finish with NULL termination */
> +       *cur = NULL;
>
>        strcat(path, get_basename(argv[0]));
>
>        if (execv(path, args))
>                perror(path);
>
> +       free(args);
> +
>        return 2;
>  }
> --
> 1.7.4.1
>
> _______________________________________________
> buildroot mailing list
> buildroot at busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot



More information about the buildroot mailing list