Fix regression with GCC 6.x.y
Signed-off-by: Peter Lemenkov <lemenkov@redhat.com>
This commit is contained in:
parent
99e86faeb6
commit
35d91694b3
2 changed files with 77 additions and 1 deletions
|
|
@ -69,7 +69,7 @@
|
|||
|
||||
Name: erlang
|
||||
Version: 18.3.3
|
||||
Release: 1%{?dist}
|
||||
Release: 2%{?dist}
|
||||
Summary: General-purpose programming language and runtime environment
|
||||
|
||||
Group: Development/Languages
|
||||
|
|
@ -128,6 +128,9 @@ Patch8: otp-0008-Add-patch-to-crash-dump-on-large-distribution.patch
|
|||
# Fedora specific patch
|
||||
# Don't send unasked for systemd notifications
|
||||
Patch9: otp-0009-Don-t-send-unasked-for-systemd-notifications.patch
|
||||
# Fedora specific patch
|
||||
# Fix decoding of LLONG_MIN in erl_decode
|
||||
Patch10: otp-0010-Fix-decoding-of-LLONG_MIN-in-erl_decode.patch
|
||||
# end of autogenerated patch tag list
|
||||
|
||||
BuildRequires: flex
|
||||
|
|
@ -1025,6 +1028,7 @@ Erlang mode for XEmacs (source lisp files).
|
|||
%patch7 -p1 -b .Split_off_webtool_dependency_from_tools
|
||||
%patch8 -p1 -b .Add_patch_to_crash_dump_on_large_distribution
|
||||
%patch9 -p1 -b .Don_t_send_unasked_for_systemd_notifications
|
||||
%patch10 -p1 -b .Fix_decoding_of_LLONG_MIN_in_erl_decode
|
||||
# end of autogenerated prep patch list
|
||||
|
||||
# FIXME we should come up with a better solution
|
||||
|
|
@ -2445,6 +2449,9 @@ useradd -r -g epmd -d /tmp -s /sbin/nologin \
|
|||
|
||||
|
||||
%changelog
|
||||
* Mon Jun 13 2016 Peter Lemenkov <lemenkov@gmail.com> - 18.3.3-2
|
||||
- Fix regression with GCC 6.x.y
|
||||
|
||||
* Wed May 11 2016 Peter Lemenkov <lemenkov@gmail.com> - 18.3.3-1
|
||||
- Ver. 18.3.3
|
||||
|
||||
|
|
|
|||
69
otp-0010-Fix-decoding-of-LLONG_MIN-in-erl_decode.patch
Normal file
69
otp-0010-Fix-decoding-of-LLONG_MIN-in-erl_decode.patch
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
From: =?UTF-8?q?Bj=C3=B6rn-Egil=20Dahlberg?= <egil@erlang.org>
|
||||
Date: Fri, 10 Jun 2016 16:40:38 +0200
|
||||
Subject: [PATCH] Fix decoding of LLONG_MIN in erl_decode
|
||||
|
||||
Reported-by: Peter Lemenkov
|
||||
|
||||
diff --git a/lib/erl_interface/src/legacy/erl_marshal.c b/lib/erl_interface/src/legacy/erl_marshal.c
|
||||
index a4216c9..6a1b573 100644
|
||||
--- a/lib/erl_interface/src/legacy/erl_marshal.c
|
||||
+++ b/lib/erl_interface/src/legacy/erl_marshal.c
|
||||
@@ -727,6 +727,13 @@ static ETERM *erl_decode_it(unsigned char **ext)
|
||||
((*ext)[2]) << 8 |((*ext)[3]);
|
||||
*ext += 4;
|
||||
big_cont:
|
||||
+
|
||||
+#ifdef _MSC_VER
|
||||
+#define MAX_TO_NEGATE 0x8000000000000000Ui64
|
||||
+#else
|
||||
+#define MAX_TO_NEGATE 0x8000000000000000ULL
|
||||
+#endif
|
||||
+
|
||||
sign = *(*ext)++;
|
||||
if (arity > 8)
|
||||
goto big_truncate;
|
||||
@@ -763,23 +770,28 @@ static ETERM *erl_decode_it(unsigned char **ext)
|
||||
*ext += arity;
|
||||
return ep;
|
||||
} else {
|
||||
- /* Fits in a long long */
|
||||
- int x;
|
||||
- long long l = 0LL;
|
||||
-
|
||||
- for(x = 0 ; x < arity ; x++) {
|
||||
- l |= ((long long)(*ext)[x]) << ((long long)(8*x));
|
||||
- }
|
||||
- if (sign) {
|
||||
- l = -l;
|
||||
- if (l > 0) goto big_truncate;
|
||||
- }
|
||||
-
|
||||
- ERL_TYPE(ep) = ERL_LONGLONG;
|
||||
- ep->uval.llval.i = l;
|
||||
- *ext += arity;
|
||||
- return ep;
|
||||
+ /* Fits in a signed long long */
|
||||
+ int x;
|
||||
+ unsigned long long l = 0LL;
|
||||
+ long long sl;
|
||||
+
|
||||
+ for(x = 0 ; x < arity ; x++) {
|
||||
+ l |= ((unsigned long long)(*ext)[x]) << ((unsigned long long)(8*x));
|
||||
+ }
|
||||
+
|
||||
+ sl = (long long)l;
|
||||
+
|
||||
+ if (sign && l != MAX_TO_NEGATE) {
|
||||
+ sl = -sl;
|
||||
+ if (sl > 0) goto big_truncate;
|
||||
+ }
|
||||
+
|
||||
+ ERL_TYPE(ep) = ERL_LONGLONG;
|
||||
+ ep->uval.llval.i = sl;
|
||||
+ *ext += arity;
|
||||
+ return ep;
|
||||
}
|
||||
+#undef MAX_TO_NEGATE
|
||||
big_truncate:
|
||||
/* truncate to: (+/-) 1 */
|
||||
#ifdef DEBUG
|
||||
Loading…
Add table
Add a link
Reference in a new issue