[Toybox] Env sh runs toysh instead of system shell

Denys Nykula nykula at ukr.net
Fri Jul 5 07:34:48 PDT 2019


Hi, this is entry point of nodejs helper for building native modules:

#!/usr/bin/env sh
if [ "x$npm_config_node_gyp" = "x" ]; then
  node "`dirname "$0"`/../../node_modules/node-gyp/bin/node-gyp.js" "$@"
else
  "$npm_config_node_gyp" "$@"
fi

When running e.g. npm i -S better-sqlite3, it gets stuck:

sh: exec if: No such file or directory
...
Error: Cannot find module '/.../node_modules/integer/"`dirname'
...
sh: exec else: No such file or directory
sh: exec "$npm_config_node_gyp": No such file or directory
sh: exec fi: No such file or directory

Toybox toys/posix/env.c env_main() calls xexec() from lib/wrap.c, which has:

// Only recurse to builtin when we have multiplexer and !vfork context.
if (CFG_TOYBOX && !CFG_TOYBOX_NORECURSE && toys.stacktop && **argv != '/')
  toy_exec(argv);

Is it clean to set toys.stacktop = 0 in env, so it runs my system shell?
How to approach writing a test for this?
---
>From 1ef072946aa860bfc0a762782ab4f82d4734b693 Mon Sep 17 00:00:00 2001
From: Denys Nykula <nykula at ukr.net>
Date: Fri, 5 Jul 2019 14:27:24 +0000
Subject: [PATCH] Have env exec, not recurse to builtin.

My app runs npm i -S better-sqlite3, and node-gyp-bin from the npm
upstream has #!/usr/bin/env sh, expecting the system shell.
---
 toys/posix/env.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/toys/posix/env.c b/toys/posix/env.c
index 3a251334..01aa5ec4 100644
--- a/toys/posix/env.c
+++ b/toys/posix/env.c
@@ -44,7 +44,7 @@ void env_main(void)

   for (; *ev; ev++)
     if (strchr(*ev, '=')) xsetenv(xstrdup(*ev), 0);
-    else xexec(ev);
+    else toys.stacktop = 0, xexec(ev);

   for (ev = environ; *ev; ev++) xprintf("%s%c", *ev, '\n'*!FLAG(0));
 }



More information about the Toybox mailing list