diff mbox series

toolchain-external: handle case of dangling symlink

Message ID 20220624221901.514921-1-mmayer@broadcom.com
State Accepted
Headers show
Series toolchain-external: handle case of dangling symlink | expand

Commit Message

Markus Mayer June 24, 2022, 10:19 p.m. UTC
copy_toolchain_lib_root was not handling the case of "readlink"
returning nothing, which will happen if the symlink it is trying to
resolve does not point to a valid file on the build host. This
shouldn't happen, but it can.

The end result of this situation would be an endless loop of error
messages that would only end if aborted manually.

    [...]
    cp: missing destination file operand after
    '/local/users/mmayer/buildroot/output/arm64/target//'
    Try 'cp --help' for more information.
    readlink: missing operand
    Try 'readlink --help' for more information.
    basename: missing operand
    Try 'basename --help' for more information.
    dirname: missing operand
    Try 'dirname --help' for more information.
    ^C
    make[1]: *** [package/pkg-generic.mk:384:

Instead of looping endlessly without explanation, let's abort and
inform the user that something seems amiss with their setup.

Signed-off-by: Markus Mayer <mmayer@broadcom.com>
---
 toolchain/helpers.mk | 5 +++++
 1 file changed, 5 insertions(+)

Comments

Romain Naour Jan. 11, 2023, 2:47 p.m. UTC | #1
Hello Markus,

Le 25/06/2022 à 00:19, Markus Mayer via buildroot a écrit :
> copy_toolchain_lib_root was not handling the case of "readlink"
> returning nothing, which will happen if the symlink it is trying to
> resolve does not point to a valid file on the build host. This
> shouldn't happen, but it can.

Indeed.

It could happen if the user provide such symlink in BR2_TOOLCHAIN_EXTRA_LIBS.

> 
> The end result of this situation would be an endless loop of error
> messages that would only end if aborted manually.
> 
>     [...]
>     cp: missing destination file operand after
>     '/local/users/mmayer/buildroot/output/arm64/target//'
>     Try 'cp --help' for more information.
>     readlink: missing operand
>     Try 'readlink --help' for more information.
>     basename: missing operand
>     Try 'basename --help' for more information.
>     dirname: missing operand
>     Try 'dirname --help' for more information.
>     ^C
>     make[1]: *** [package/pkg-generic.mk:384:
> 
> Instead of looping endlessly without explanation, let's abort and
> inform the user that something seems amiss with their setup.
> 
> Signed-off-by: Markus Mayer <mmayer@broadcom.com>
> ---
>  toolchain/helpers.mk | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/toolchain/helpers.mk b/toolchain/helpers.mk
> index 05aa47a0dd8b..788f5ef671ce 100644
> --- a/toolchain/helpers.mk
> +++ b/toolchain/helpers.mk
> @@ -19,7 +19,12 @@ copy_toolchain_lib_root = \
>  			rm -fr $(TARGET_DIR)/$${DESTDIR}/$${LIBNAME}; \
>  			if test -h $${LIBPATH} ; then \
>  				cp -d $${LIBPATH} $(TARGET_DIR)/$${DESTDIR}/$${LIBNAME}; \
> +				OLD_LIBPATH="$${LIBPATH}"; \
>  				LIBPATH="`readlink -f $${LIBPATH}`"; \
> +				if [ "$${LIBPATH}" = "" ]; then \
> +					echo "LIBPATH empty after trying to resolve symlink $${OLD_LIBPATH}" 1>&2; \
> +					exit 1; \
> +				fi; \

I'm not sure it's ok to fail here on a dangling symlink.
Maybe add a check and ignore such dangling symlink with a warning for the user.

It's unlikely that such dangling symlink provided by the toolchain will be useful.

Best regards,
Romain


>  			elif test -f $${LIBPATH}; then \
>  				$(INSTALL) -D -m0755 $${LIBPATH} $(TARGET_DIR)/$${DESTDIR}/$${LIBNAME}; \
>  				break ; \
Thomas Petazzoni Feb. 7, 2023, 9:21 a.m. UTC | #2
On Fri, 24 Jun 2022 15:19:01 -0700
Markus Mayer via buildroot <buildroot@buildroot.org> wrote:

> copy_toolchain_lib_root was not handling the case of "readlink"
> returning nothing, which will happen if the symlink it is trying to
> resolve does not point to a valid file on the build host. This
> shouldn't happen, but it can.
> 
> The end result of this situation would be an endless loop of error
> messages that would only end if aborted manually.
> 
>     [...]
>     cp: missing destination file operand after
>     '/local/users/mmayer/buildroot/output/arm64/target//'
>     Try 'cp --help' for more information.
>     readlink: missing operand
>     Try 'readlink --help' for more information.
>     basename: missing operand
>     Try 'basename --help' for more information.
>     dirname: missing operand
>     Try 'dirname --help' for more information.
>     ^C
>     make[1]: *** [package/pkg-generic.mk:384:
> 
> Instead of looping endlessly without explanation, let's abort and
> inform the user that something seems amiss with their setup.
> 
> Signed-off-by: Markus Mayer <mmayer@broadcom.com>
> ---
>  toolchain/helpers.mk | 5 +++++
>  1 file changed, 5 insertions(+)

Applied to master, thanks.

Thomas
Thomas Petazzoni Feb. 7, 2023, 9:23 a.m. UTC | #3
Hello Romain,

On Wed, 11 Jan 2023 15:47:50 +0100
Romain Naour <romain.naour@smile.fr> wrote:

> > +				if [ "$${LIBPATH}" = "" ]; then \
> > +					echo "LIBPATH empty after trying to resolve symlink $${OLD_LIBPATH}" 1>&2; \
> > +					exit 1; \
> > +				fi; \  
> 
> I'm not sure it's ok to fail here on a dangling symlink.
> Maybe add a check and ignore such dangling symlink with a warning for the user.
> 
> It's unlikely that such dangling symlink provided by the toolchain will be useful.

I hesitated a bit on this. But for now, I believe a toolchain with a
dangling symlink is badly broken, and we should not work with it. A
warning message with a build continuing will never be noticed by the
user, so if we don't abort with hard error, nobody will notice. So I
applied the patch of Markus as is for now.

We will see if people complain that this breaks with their toolchain,
and if it does, we will change the exit to a break to simply move on to
handle the next library.

Best regards,

Thomas
diff mbox series

Patch

diff --git a/toolchain/helpers.mk b/toolchain/helpers.mk
index 05aa47a0dd8b..788f5ef671ce 100644
--- a/toolchain/helpers.mk
+++ b/toolchain/helpers.mk
@@ -19,7 +19,12 @@  copy_toolchain_lib_root = \
 			rm -fr $(TARGET_DIR)/$${DESTDIR}/$${LIBNAME}; \
 			if test -h $${LIBPATH} ; then \
 				cp -d $${LIBPATH} $(TARGET_DIR)/$${DESTDIR}/$${LIBNAME}; \
+				OLD_LIBPATH="$${LIBPATH}"; \
 				LIBPATH="`readlink -f $${LIBPATH}`"; \
+				if [ "$${LIBPATH}" = "" ]; then \
+					echo "LIBPATH empty after trying to resolve symlink $${OLD_LIBPATH}" 1>&2; \
+					exit 1; \
+				fi; \
 			elif test -f $${LIBPATH}; then \
 				$(INSTALL) -D -m0755 $${LIBPATH} $(TARGET_DIR)/$${DESTDIR}/$${LIBNAME}; \
 				break ; \