Accepting request 815425 from devel:libraries:c_c++

OBS-URL: https://build.opensuse.org/request/show/815425
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/json-c?expand=0&rev=25
This commit is contained in:
Dominique Leuenberger 2020-06-19 14:48:27 +00:00 committed by Git OBS Bridge
commit 311f849165
3 changed files with 145 additions and 5 deletions

View File

@ -0,0 +1,131 @@
From eec4df641cbce416c86f2e7d6c740d85b8906451 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn=20Esser?= <besser82@fedoraproject.org>
Date: Mon, 25 May 2020 13:03:31 +0200
Subject: [PATCH] Detect broken RDRAND during initialization.
Some CPUs advertise RDRAND in CPUID, but return
0xFFFFFFFF unconditionally. To avoid locking up
later, test RDRAND during initialization, and if
it returns 0xFFFFFFFF, mark it as nonexistent.
Also fix a possible segmentation fault in CPUID check.
This commit is a squashed backport of the following
commits on the master branch:
* 0e5bbcaa162ac7850eb4fcd8f91391837d0efb50
* 4d36b0287d3ab0912ba8a4790340ca099960b2b0
* 80863140263be5f2dc630938ed8f0066f8a1ab43
---
random_seed.c | 66 ++++++++++++++++++++++++++++++++++++++-------------
1 file changed, 49 insertions(+), 17 deletions(-)
diff --git a/random_seed.c b/random_seed.c
index fc19e26d13..b5f8a0795e 100644
--- a/random_seed.c
+++ b/random_seed.c
@@ -26,19 +26,8 @@
static void do_cpuid(int regs[], int h)
{
/* clang-format off */
- __asm__ __volatile__(
-#if defined __x86_64__
- "pushq %%rbx;\n"
-#else
- "pushl %%ebx;\n"
-#endif
- "cpuid;\n"
-#if defined __x86_64__
- "popq %%rbx;\n"
-#else
- "popl %%ebx;\n"
-#endif
- : "=a"(regs[0]), [ebx] "=r"(regs[1]), "=c"(regs[2]), "=d"(regs[3])
+ __asm__ __volatile__("cpuid"
+ : "=a"(regs[0]), "=b"(regs[1]), "=c"(regs[2]), "=d"(regs[3])
: "a"(h));
/* clang-format on */
}
@@ -54,12 +43,51 @@ static void do_cpuid(int regs[], int h)
#if HAS_X86_CPUID
+static int get_rdrand_seed(void);
+
+/* Valid values are -1 (haven't tested), 0 (no), and 1 (yes). */
+static int _has_rdrand = -1;
+
static int has_rdrand(void)
{
- // CPUID.01H:ECX.RDRAND[bit 30] == 1
+ if (_has_rdrand != -1)
+ {
+ return _has_rdrand;
+ }
+
+ /* CPUID.01H:ECX.RDRAND[bit 30] == 1 */
int regs[4];
do_cpuid(regs, 1);
- return (regs[2] & (1 << 30)) != 0;
+ if (!(regs[2] & (1 << 30)))
+ {
+ _has_rdrand = 0;
+ return 0;
+ }
+
+ /*
+ * Some CPUs advertise RDRAND in CPUID, but return 0xFFFFFFFF
+ * unconditionally. To avoid locking up later, test RDRAND here. If over
+ * 3 trials RDRAND has returned the same value, declare it broken.
+ * Example CPUs are AMD Ryzen 3000 series
+ * and much older AMD APUs, such as the E1-1500
+ * https://github.com/systemd/systemd/issues/11810
+ * https://linuxreviews.org/RDRAND_stops_returning_random_values_on_older_AMD_CPUs_after_suspend
+ */
+ _has_rdrand = 0;
+ int prev = get_rdrand_seed();
+ for (int i = 0; i < 3; i++)
+ {
+ int temp = get_rdrand_seed();
+ if (temp != prev)
+ {
+ _has_rdrand = 1;
+ break;
+ }
+
+ prev = temp;
+ }
+
+ return _has_rdrand;
}
#endif
@@ -74,7 +102,7 @@ static int get_rdrand_seed(void)
{
DEBUG_SEED("get_rdrand_seed");
int _eax;
- // rdrand eax
+ /* rdrand eax */
/* clang-format off */
__asm__ __volatile__("1: .byte 0x0F\n"
" .byte 0xC7\n"
@@ -114,7 +142,7 @@ static int get_rdrand_seed(void)
DEBUG_SEED("get_rdrand_seed");
int _eax;
retry:
- // rdrand eax
+ /* rdrand eax */
__asm _emit 0x0F __asm _emit 0xC7 __asm _emit 0xF0
__asm jnc retry
__asm mov _eax, eax
@@ -188,6 +216,10 @@ static int get_dev_random_seed(void)
/* clang-format off */
#include <windows.h>
+
+/* Caution: these blank lines must remain so clang-format doesn't reorder
+ includes to put windows.h after wincrypt.h */
+
#include <wincrypt.h>
/* clang-format on */
#ifndef __GNUC__

View File

@ -1,3 +1,11 @@
-------------------------------------------------------------------
Wed Jun 17 08:04:43 UTC 2020 - Dan Čermák <dcermak@suse.com>
- Add upstream fix for boo#1173022
* Added patch 0001-Detect-broken-RDRAND-during-initialization.patch
* use URL from the releases page on github
* run spec-cleaner over the spec file
-------------------------------------------------------------------
Tue Apr 28 07:45:45 UTC 2020 - Paolo Stivanin <info@paolostivanin.com>

View File

@ -25,10 +25,11 @@ Release: 0
Summary: JSON implementation in C
License: MIT
Group: Development/Libraries/C and C++
URL: https://github.com/json-c/json-c/wiki
#Git-Clone git://github.com/json-c/json-c
Source0: https://s3.amazonaws.com/json-c_releases/releases/%{name}-%{version}.tar.gz
URL: https://github.com/json-c/json-c
Source0: %{URL}/archive/%{name}-%{version}-20200419.tar.gz#/%{name}-%{version}.tar.gz
Source1: baselibs.conf
# fix for boo#1173022
Patch0: https://patch-diff.githubusercontent.com/raw/json-c/json-c/pull/624.patch#/0001-Detect-broken-RDRAND-during-initialization.patch
BuildRequires: cmake
BuildRequires: fdupes
BuildRequires: libtool
@ -86,7 +87,7 @@ representation of JSON objects.
This package includes the json-c documentation.
%prep
%setup -q
%autosetup -p1
%build
%if 0%{?suse_version} <= 1110
@ -95,7 +96,7 @@ autoreconf -fiv
%endif
%cmake \
-DCMAKE_BUILD_TYPE=None \
-DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_INSTALL_PREFIX=%{_prefix} \
-DCMAKE_INSTALL_LIBDIR=%{_libdir} \
-DENABLE_THREADING=ON \
-DENABLE_RDRAND=ON