summaryrefslogtreecommitdiff
path: root/dev-util/b2/files
diff options
context:
space:
mode:
authorV3n3RiX <venerix@koprulu.sector>2023-02-20 20:21:39 +0000
committerV3n3RiX <venerix@koprulu.sector>2023-02-20 20:21:39 +0000
commitdd03974882f85ca04e35cfbc97f7ff756f5d5c20 (patch)
tree4fabcc91c51083e19657dd0a557043e74468106e /dev-util/b2/files
parentd542bd2ef95af892c7ef62be1489b0288b1df9e3 (diff)
gentoo auto-resync : 20:02:2023 - 20:21:39
Diffstat (limited to 'dev-util/b2/files')
-rw-r--r--dev-util/b2/files/b2-4.9.3-fix-apple-m1-crash-by-explicit-pointer-cast.patch55
1 files changed, 55 insertions, 0 deletions
diff --git a/dev-util/b2/files/b2-4.9.3-fix-apple-m1-crash-by-explicit-pointer-cast.patch b/dev-util/b2/files/b2-4.9.3-fix-apple-m1-crash-by-explicit-pointer-cast.patch
new file mode 100644
index 000000000000..753c60fd14ce
--- /dev/null
+++ b/dev-util/b2/files/b2-4.9.3-fix-apple-m1-crash-by-explicit-pointer-cast.patch
@@ -0,0 +1,55 @@
+https://github.com/bfgroup/b2/issues/152
+https://github.com/bfgroup/b2/pull/214
+https://bugs.gentoo.org/895524
+
+From 62dc6ff74a0b9717b4a8dd61ce06770e6fb7c177 Mon Sep 17 00:00:00 2001
+From: Yifeng Li <tomli@tomli.me>
+Date: Mon, 20 Feb 2023 09:52:32 +0000
+Subject: [PATCH] Fix #152 crash on Apple M1 by casting 0 to (OBJECT *)
+ explicitly.
+
+Currently, when the NULL-terminated variadic function call_rule()
+is invoked, the value "0" is passed as the last argument to act
+as a terminator. However, this is an integer value, which is
+incompatible with the pointer data type expected by call_rule().
+
+This is undefined behavior in C, correct operation is not
+guaranteed. In fact, it causes b2 to crash on Apple M1 when GCC
+is used - the loop is not terminated when it should, instead, it
+keeps running, creating the following error:
+
+> lol_add failed due to reached limit of 19 elements
+
+In some cases, it can even corrupt the internal state of the program,
+creating an infinite loop.
+
+This commit fixes the problem by explicitly casting the value 0 to
+the correct pointer type (OBJECT *).
+
+Signed-off-by: Yifeng Li <tomli@tomli.me>
+---
+ src/engine/modules/property-set.cpp | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/engine/modules/property-set.cpp b/src/engine/modules/property-set.cpp
+index 6e190a7639..b0d3c2dab8 100644
+--- src/engine/modules/property-set.cpp
++++ src/engine/modules/property-set.cpp
+@@ -162,7 +162,7 @@ LIST * property_set_create( FRAME * frame, int flags )
+ OBJECT * rulename = object_new( "new" );
+ OBJECT * varname = object_new( "self.raw" );
+ LIST * val = call_rule( rulename, frame,
+- list_new( object_new( "property-set" ) ), 0 );
++ list_new( object_new( "property-set" ) ), (OBJECT *) 0 );
+ LISTITER iter, end;
+ object_free( rulename );
+ pos->value = object_copy( list_front( val ) );
+@@ -183,7 +183,7 @@ LIST * property_set_create( FRAME * frame, int flags )
+ import_module( imports, frame->module );
+ rulename = object_new( "errors.error" );
+ call_rule( rulename, frame,
+- list_new( object_new( message->value ) ), 0 );
++ list_new( object_new( message->value ) ), (OBJECT *) 0 );
+ /* unreachable */
+ string_free( message );
+ list_free( imports );