[Buildroot] [PATCH] ext-toolchain-wrapper: fix paths if executable was resolved by PATH

Peter Korsgaard jacmet at uclibc.org
Fri May 31 20:05:33 UTC 2013


>>>>> "Patrick" == Patrick Ziegler <patrick.ziegler at fh-kl.de> writes:

 Patrick> If ext-toolchain-wrapper or any symbolic link to it was
 Patrick> resolved by PATH, the wrapper takes the working directory to
 Patrick> calculate the relative paths.

 Patrick> Now '/proc/self/exe' is used to resolve the absolute path to
 Patrick> the toolchain directory if the wrapper was called neither with
 Patrick> a relative nor an absolute path.

 Patrick> Signed-off-by: Patrick Ziegler <patrick.ziegler at fh-kl.de>
 Patrick> ---
 Patrick>  toolchain/toolchain-external/ext-toolchain-wrapper.c | 16 ++++++++++++++--
 Patrick>  1 file changed, 14 insertions(+), 2 deletions(-)

 Patrick> diff --git a/toolchain/toolchain-external/ext-toolchain-wrapper.c b/toolchain/toolchain-external/ext-toolchain-wrapper.c
 Patrick> index 9a2fc70..e71a90a 100644
 Patrick> --- a/toolchain/toolchain-external/ext-toolchain-wrapper.c
 Patrick> +++ b/toolchain/toolchain-external/ext-toolchain-wrapper.c
 Patrick> @@ -61,7 +61,7 @@ int main(int argc, char **argv)
 Patrick>  	char *relbasedir, *absbasedir;
 Patrick>  	char *progpath = argv[0];
 Patrick>  	char *basename;
 Patrick> -	int ret;
 Patrick> +	int ret, i, count = 0;
 
 Patrick>  	/* Calculate the relative paths */
 Patrick>  	basename = strrchr(progpath, '/');
 Patrick> @@ -77,7 +77,19 @@ int main(int argc, char **argv)
 Patrick>  		absbasedir = realpath(relbasedir, NULL);
 Patrick>  	} else {
 Patrick>  		basename = progpath;
 Patrick> -		absbasedir = realpath("../..", NULL);
 Patrick> +		absbasedir = malloc(PATH_MAX + 1);
 Patrick> +		ret = readlink("/proc/self/exe", absbasedir, PATH_MAX);
 Patrick> +		if (ret < 0) {
 Patrick> +			perror(__FILE__ ": readlink");
 Patrick> +			return 2;
 Patrick> +		}

 Patrick> +		for (i = ret; i > 0; i--) {
 Patrick> +			if ('/' == absbasedir[i]) {

The output of readlink is NOT null terminated, so you end up accessing
uninitialized data on the first iteration of this loop. I've fixed it by
an explicit:

absbasedir[ret] = '\0';

In the rest of the file we don't do the reverse order checks (value ==
var), so I've swapped those.

The toolchain wrapper has unfortunately grown quite complicated since
I've added it. I THINK we can simply always resolve /proc/self/exe and
get rid of the conditional here, but as we're this close to the release
I decided to apply your patch as it seems the safest option.

Committed, thanks.

-- 
Bye, Peter Korsgaard



More information about the buildroot mailing list