[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