this hunk from 81207825c50fa9a4ec1475024543f830dee247fd:

diff --git a/toys.h b/toys.h
index 4083725a..df37b55e 100644
--- a/toys.h
+++ b/toys.h
@@ -108,7 +108,7 @@ extern struct toy_context {
   char wasroot;            // dropped setuid

   // This is at the end so toy_init() doesn't zero it.
-  jmp_buf *rebound;        // longjmp here instead of exit when do_rebound set
+  sigjmp_buf *rebound;     // longjmp here instead of exit when do_rebound set
   struct arg_list *xexit;  // atexit() functions for xexit(), set by sigatexit(
)
   void *stacktop;          // nested toy_exec() call count, or 0 if vforked
 } toys;

caused:

external/toybox/toys/net/netcat.c:188:37: error: incompatible pointer
types assigning to 'sigjmp_buf *' (aka 'long (*)[33]') from 'jmp_buf
*' (aka 'long (*)[32]') [-Werror,-Wincompatible-pointer-types]
          if (toys.optflags&FLAG_L) NOEXIT(child = XVFORK());
                                    ^~~~~~~~~~~~~~~~~~~~~~~~
external/toybox/lib/lib.h:375:19: note: expanded from macro 'NOEXIT'
#define NOEXIT(x) WOULD_EXIT(_noexit_res, x)
                  ^~~~~~~~~~~~~~~~~~~~~~~~~~
external/toybox/lib/lib.h:367:16: note: expanded from macro 'WOULD_EXIT'
  toys.rebound = &_noexit; \
               ^ ~~~~~~~~
1 error generated.

hmm... looks like you always call setjmp (rather than sigsetjmp) but
also always call siglongjmp?

so the real fix is probably to s/setjmp/sigsetjmp/ and move _noexit
over to sigjmp_buf too:

#define WOULD_EXIT(y, x) do { jmp_buf _noexit; \

patch attached...
From 067cae0253d54cfc8b92d379605b1f74bbc43161 Mon Sep 17 00:00:00 2001
From: Elliott Hughes <[email protected]>
Date: Tue, 22 Jan 2019 12:52:55 -0800
Subject: [PATCH] Fix sigjmp_buf/jmp_buf mismatches.

Broke the bionic build:

  external/toybox/toys/net/netcat.c:188:37: error: incompatible pointer types assigning to 'sigjmp_buf *' (aka 'long (*)[33]') from 'jmp_buf *' (aka 'long (*)[32]') [-Werror,-Wincompatible-pointer-types]
          if (toys.optflags&FLAG_L) NOEXIT(child = XVFORK());
                                    ^~~~~~~~~~~~~~~~~~~~~~~~
  external/toybox/lib/lib.h:375:19: note: expanded from macro 'NOEXIT'
  #define NOEXIT(x) WOULD_EXIT(_noexit_res, x)
                    ^~~~~~~~~~~~~~~~~~~~~~~~~~
  external/toybox/lib/lib.h:367:16: note: expanded from macro 'WOULD_EXIT'
    toys.rebound = &_noexit; \
                 ^ ~~~~~~~~
  1 error generated.
---
 lib/lib.h         | 6 +++---
 toys.h            | 2 +-
 toys/pending/sh.c | 4 ++--
 www/code.html     | 2 +-
 4 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/lib/lib.h b/lib/lib.h
index 546b32b3..ed31ffa9 100644
--- a/lib/lib.h
+++ b/lib/lib.h
@@ -360,12 +360,12 @@ void names_to_pid(char **names, int (*callback)(pid_t pid, char *name));
 pid_t __attribute__((returns_twice)) xvforkwrap(pid_t pid);
 #define XVFORK() xvforkwrap(vfork())
 
-// Wrapper to make xfuncs() return (via longjmp) instead of exiting.
+// Wrapper to make xfuncs() return (via siglongjmp) instead of exiting.
 // Assigns true/false "did it exit" value to first argument.
-#define WOULD_EXIT(y, x) do { jmp_buf _noexit; \
+#define WOULD_EXIT(y, x) do { sigjmp_buf _noexit; \
   int _noexit_res; \
   toys.rebound = &_noexit; \
-  _noexit_res = setjmp(_noexit); \
+  _noexit_res = sigsetjmp(_noexit, 1); \
   if (!_noexit_res) do {x;} while(0); \
   toys.rebound = 0; \
   y = _noexit_res; \
diff --git a/toys.h b/toys.h
index df37b55e..a22054b1 100644
--- a/toys.h
+++ b/toys.h
@@ -108,7 +108,7 @@ extern struct toy_context {
   char wasroot;            // dropped setuid
 
   // This is at the end so toy_init() doesn't zero it.
-  sigjmp_buf *rebound;     // longjmp here instead of exit when do_rebound set
+  sigjmp_buf *rebound;     // siglongjmp here instead of exit when do_rebound set
   struct arg_list *xexit;  // atexit() functions for xexit(), set by sigatexit()
   void *stacktop;          // nested toy_exec() call count, or 0 if vforked
 } toys;
diff --git a/toys/pending/sh.c b/toys/pending/sh.c
index 0bfd32c5..8a9e93b6 100644
--- a/toys/pending/sh.c
+++ b/toys/pending/sh.c
@@ -205,13 +205,13 @@ static void run_pipeline(struct pipeline *line)
   // Is this command a builtin that should run in this process?
   if (tl && (tl->flags & TOYFLAG_NOFORK)) {
     struct toy_context temp;
-    jmp_buf rebound;
+    sigjmp_buf rebound;
 
     // This fakes lots of what toybox_main() does.
     memcpy(&temp, &toys, sizeof(struct toy_context));
     memset(&toys, 0, sizeof(struct toy_context));
 
-    if (!setjmp(rebound)) {
+    if (!sigsetjmp(rebound, 1)) {
       toys.rebound = &rebound;
       toy_init(tl, cmd->argv);
       tl->toy_main();
diff --git a/www/code.html b/www/code.html
index b1b17ef5..953c53bb 100644
--- a/www/code.html
+++ b/www/code.html
@@ -653,7 +653,7 @@ and change the exit code to indicate error, lets our toys.exit function
 change happen for signal exit paths and lets us remove the functions
 after we've called them.</p>
 
-<p>You can intercept our exit by assigning a setjmp/longjmp buffer to
+<p>You can intercept our exit by assigning a sigsetjmp/siglongjmp buffer to
 toys.rebound (set it back to zero to restore the default behavior).
 If you do this, cleaning up resource leaks is your problem.</p>
 
-- 
2.20.1.321.g9e740568ce-goog

_______________________________________________
Toybox mailing list
[email protected]
http://lists.landley.net/listinfo.cgi/toybox-landley.net

Reply via email to