me
/
guix
Archived
1
0
Fork 0

gnu: smalltalk: Fix integer multiplication overflow.

* gnu/local.mk (dist_patch_DATA): Add Smalltalk patch.
* gnu/packages/patches/smalltalk-multiplication-overflow.patch: Patch
from upstream commit 72ada189aba0283c551ead16635c1983968080b8.
* gnu/packages/smalltalk.scm (smalltalk): Use patch and link with gmp
and lightning libraries instead of the included source.
master
Miguel Ángel Arruga Vivas 2020-12-28 10:36:48 +01:00
parent c25285b6a1
commit e3281657c8
No known key found for this signature in database
GPG Key ID: 634C6E8979FABEC2
3 changed files with 164 additions and 5 deletions

View File

@ -1451,6 +1451,7 @@ dist_patch_DATA = \
%D%/packages/patches/sdl-pango-header-guard.patch \
%D%/packages/patches/sdl-pango-matrix_declarations.patch \
%D%/packages/patches/sdl-pango-sans-serif.patch \
%D%/packages/patches/smalltalk-multiplication-overflow.patch \
%D%/packages/patches/sqlite-hurd.patch \
%D%/packages/patches/sunxi-tools-remove-sys-io.patch \
%D%/packages/patches/patchutils-test-perms.patch \

View File

@ -0,0 +1,121 @@
Extracted from this commit without the ChangeLog to avoid conflicts:
http://git.savannah.gnu.org/cgit/smalltalk.git/commit/?id=72ada189aba0283c551ead16635c1983968080b8
The upstream commit message is
From 72ada189aba0283c551ead16635c1983968080b8 Mon Sep 17 00:00:00 2001
From: Holger Hans Peter Freyther <holger@moiji-mobile.com>
Date: Sat, 7 Nov 2015 18:09:31 +0100
Subject: libgst: Add alternative multiplication overflow check
Apple clang on OSX and the version on FreeBSD optimize the
multiplication check away. Clang introduced a family of
builtins to do the multiplication and check for the overflow
and GCC made the API usable. For clang we would need to know
if intptr_t is of type int, long int, long long int and
then use the smul, smull smulll.
Luckily clang is adopting the better interface and this is
what we are starting to use now. This means the new code
will be used on GCC5 (and later) and some future versions of
clang.
2015-11-07 Holger Hans Peter Freyther <holger@freyther.de>
* build-aux/overflow-builtins.m4: Add new macro.
* configure.ac: Use GST_C_OVERFLOW_BUILTINS macro.
2015-11-07 Holger Hans Peter Freyther <holger@freyther.de>
* interp.inl: Add alternative mul_with_check implementation.
---
ChangeLog | 5 +++++
build-aux/overflow-builtins.m4 | 23 +++++++++++++++++++++++
configure.ac | 1 +
libgst/ChangeLog | 4 ++++
libgst/interp.inl | 22 ++++++++++++++++++++++
5 files changed, 55 insertions(+)
create mode 100644 build-aux/overflow-builtins.m4
diff --git a/build-aux/overflow-builtins.m4 b/build-aux/overflow-builtins.m4
new file mode 100644
index 00000000..9d050196
--- /dev/null
+++ b/build-aux/overflow-builtins.m4
@@ -0,0 +1,23 @@
+dnl Check whether the host supports synchronization builtins.
+
+AC_DEFUN([GST_C_OVERFLOW_BUILTINS], [
+ AC_REQUIRE([AC_CANONICAL_HOST])
+ AC_CACHE_CHECK([whether the host supports __builtin_mul_overflow],
+ gst_cv_have_builtin_mul_overflow, [
+ save_CFLAGS="$CFLAGS"
+ case $host in
+ i?86-apple-darwin*) ;;
+ i?86-*-*) CFLAGS="$CFLAGS -march=i486" ;;
+ esac
+ AC_LINK_IFELSE([AC_LANG_PROGRAM([[int foovar = 0;]], [[
+if (__builtin_mul_overflow(44444, 55555, &foovar))
+ return 23;]])],
+ [gst_cv_have_builtin_mul_overflow=yes],
+ [gst_cv_have_builtin_mul_overflow=no])
+ CFLAGS="$save_CFLAGS"
+ ])
+ if test $gst_cv_have_builtin_mul_overflow = yes; then
+ AC_DEFINE(HAVE_OVERFLOW_BUILTINS, 1,
+ [Define to 1 if the host supports __builtin_*_overflow builtins])
+ fi
+])
diff --git a/configure.ac b/configure.ac
index e789be45..0bac23ef 100644
--- a/configure.ac
+++ b/configure.ac
@@ -243,6 +243,7 @@ GST_C_SYNC_BUILTINS
if test $gst_cv_have_sync_fetch_and_add = no; then
AC_MSG_ERROR([Synchronization primitives not found, please use a newer compiler.])
fi
+GST_C_OVERFLOW_BUILTINS
GST_LOCK
AC_SYS_LARGEFILE
diff --git a/libgst/interp.inl b/libgst/interp.inl
index e18e27c7..dbc631bc 100644
--- a/libgst/interp.inl
+++ b/libgst/interp.inl
@@ -159,6 +159,27 @@ sub_with_check (OOP op1, OOP op2, mst_Boolean *overflow)
OOP
mul_with_check (OOP op1, OOP op2, mst_Boolean *overflow)
{
+#ifdef HAVE_OVERFLOW_BUILTINS
+ intptr_t a = TO_INT (op1);
+ intptr_t b = TO_INT (op2);
+ intptr_t result;
+
+ if (__builtin_mul_overflow(a, b, &result))
+ {
+ *overflow = true;
+ return FROM_INT(0);
+ }
+
+
+ if (result < MIN_ST_INT || result > MAX_ST_INT)
+ {
+ *overflow = true;
+ return FROM_INT(0);
+ }
+
+ *overflow = false;
+ return FROM_INT(result);
+#else
intptr_t a = TO_INT (op1);
intptr_t b = TO_INT (op2);
intmax_t result = (intmax_t)a * b;
@@ -188,6 +209,7 @@ mul_with_check (OOP op1, OOP op2, mst_Boolean *overflow)
}
return FROM_INT (0);
+#endif
}
/* State of the random generator.
--
2.29.2

View File

@ -26,6 +26,8 @@
#:use-module (guix download)
#:use-module (guix build-system cmake)
#:use-module (guix build-system gnu)
#:use-module (gnu packages)
#:use-module (gnu packages assembly)
#:use-module (gnu packages audio)
#:use-module (gnu packages autotools)
#:use-module (gnu packages base)
@ -36,6 +38,7 @@
#:use-module (gnu packages libffi)
#:use-module (gnu packages libsigsegv)
#:use-module (gnu packages linux)
#:use-module (gnu packages multiprecision)
#:use-module (gnu packages pkg-config)
#:use-module (gnu packages pulseaudio)
#:use-module (gnu packages xorg))
@ -51,18 +54,52 @@
version ".tar.xz"))
(sha256
(base32
"1k2ssrapfzhngc7bg1zrnd9n2vyxp9c9m70byvsma6wapbvib6l1"))))
"1k2ssrapfzhngc7bg1zrnd9n2vyxp9c9m70byvsma6wapbvib6l1"))
;; XXX: To be removed with the next release of Smalltalk.
(patches (search-patches "smalltalk-multiplication-overflow.patch"))))
(build-system gnu-build-system)
(native-inputs
`(("libffi" ,libffi)
`(("pkg-config" ,pkg-config)
;; XXX: To be removed with the next release of Smalltalk.
("autoconf" ,autoconf)
("automake" ,automake)
("libtool" ,libtool)))
;; TODO: These optional dependencies raise the closure size to ~1 GiB
;; from the current ~100 MiB, although some of them might be very
;; useful for end users:
;; - freeglut
;; - glib
;; - gobject-introspection
;; - gtk+-2
;; - tcl/tk
;; - SDL (sdl-union)
;; - sqlite
;; - zlib
(inputs
`(("gmp" ,gmp)
("libffi" ,libffi)
("libltdl" ,libltdl)
("libsigsegv" ,libsigsegv)
("pkg-config" ,pkg-config)))
(inputs
`(("zip" ,zip)))
("lightning" ,lightning)
("zip" ,zip)))
(arguments
`(#:phases
(modify-phases %standard-phases
;; XXX: To be removed with the next release of Smalltalk.
;; The overflow patch modifies configure.ac, therefore remove
;; old configure script and enforce an autoreconf.
(add-before 'bootstrap 'remove-unpatched-configure
(lambda _
(delete-file "configure")
#t))
;; XXX: To be removed with the next release of Smalltalk.
;; We don't want to regenerate the info files.
(add-after 'build 'keep-generated-info-manual
(lambda _
(for-each (lambda (file)
(invoke "touch" file))
(find-files "doc" "\\.info"))
#t))
(add-before 'configure 'fix-libc
(lambda _
(let ((libc (assoc-ref %build-inputs "libc")))