Upgrade to Ruby 3.3.0.
Imported from Fedora @ 3008410 Resolves: RHEL-17089
This commit is contained in:
parent
03fd963481
commit
d97bc213ea
|
@ -2,14 +2,31 @@
|
||||||
%gem_dir %{_datadir}/gems
|
%gem_dir %{_datadir}/gems
|
||||||
%gem_archdir %{_libdir}/gems
|
%gem_archdir %{_libdir}/gems
|
||||||
|
|
||||||
|
# %gem_name_version - Provides gem_name-version string.
|
||||||
|
#
|
||||||
|
# Usage: %gem_name_version [custom_gem_name]
|
||||||
|
#
|
||||||
|
# Prints gem_name-version string, by default joining %gem_name, %version and
|
||||||
|
# %prerelease macros. When [custom_gem_name] is provided, the
|
||||||
|
# custom_gem_name is joined with %custom_gem_name_version macro which needs
|
||||||
|
# to be predefined. Please note that for the version macros are the dashes
|
||||||
|
# replaced by underscores.
|
||||||
|
#
|
||||||
|
%gem_name_version() %{?1}%{!?1:%{gem_name}}-%{?1:%{lua: st = string.gsub(rpm.expand(\"%{1}\"), \"-\", \"_\"); print(rpm.expand('%{'..st..'_version}'))}}%{!?1:%{version}}%{?prerelease}
|
||||||
|
|
||||||
# Common gem locations and files.
|
# Common gem locations and files.
|
||||||
%gem_instdir %{gem_dir}/gems/%{gem_name}-%{version}%{?prerelease}
|
#
|
||||||
%gem_extdir_mri %{gem_archdir}/%{name}/%{gem_name}-%{version}%{?prerelease}
|
# These macros leverages %gem_name_version macro and accepts custom gem_name.
|
||||||
%gem_libdir %{gem_instdir}/lib
|
#
|
||||||
%gem_cache %{gem_dir}/cache/%{gem_name}-%{version}%{?prerelease}.gem
|
# -d Use default gem install location.
|
||||||
%gem_spec %{gem_dir}/specifications/%{gem_name}-%{version}%{?prerelease}.gemspec
|
#
|
||||||
%gem_docdir %{gem_dir}/doc/%{gem_name}-%{version}%{?prerelease}
|
%gem_instdir() %{gem_dir}/gems/%{gem_name_version %{?1}}
|
||||||
%gem_plugin %{gem_dir}/plugins/%{gem_name}_plugin.rb
|
%gem_extdir_mri() %{gem_archdir}/%{name}/%{gem_name_version %{?1}}
|
||||||
|
%gem_libdir() %{gem_instdir %{?1}}/lib
|
||||||
|
%gem_cache() %{gem_dir}/cache/%{gem_name_version %{?1}}.gem
|
||||||
|
%gem_spec(d) %{gem_dir}/specifications%{?-d:/default}/%{gem_name_version %{?1}}.gemspec
|
||||||
|
%gem_docdir() %{gem_dir}/doc/%{gem_name_version %{?1}}
|
||||||
|
%gem_plugin() %{gem_dir}/plugins/%{?1}%{!?1:%{gem_name}}_plugin.rb
|
||||||
|
|
||||||
|
|
||||||
# %gem_install - Install gem into appropriate directory.
|
# %gem_install - Install gem into appropriate directory.
|
||||||
|
|
|
@ -87,34 +87,34 @@ module Gem
|
||||||
# Remove methods we are going to override. This avoids "method redefined;"
|
# Remove methods we are going to override. This avoids "method redefined;"
|
||||||
# warnings otherwise issued by Ruby.
|
# warnings otherwise issued by Ruby.
|
||||||
|
|
||||||
remove_method :operating_system_defaults if method_defined? :operating_system_defaults
|
|
||||||
remove_method :default_dir if method_defined? :default_dir
|
remove_method :default_dir if method_defined? :default_dir
|
||||||
|
remove_method :default_specifications_dir if method_defined? :default_specifications_dir
|
||||||
remove_method :default_path if method_defined? :default_path
|
remove_method :default_path if method_defined? :default_path
|
||||||
|
remove_method :default_bindir if method_defined? :default_bindir
|
||||||
remove_method :default_ext_dir_for if method_defined? :default_ext_dir_for
|
remove_method :default_ext_dir_for if method_defined? :default_ext_dir_for
|
||||||
|
|
||||||
##
|
|
||||||
# Regular user installs into user directory, root manages /usr/local.
|
|
||||||
|
|
||||||
def operating_system_defaults
|
|
||||||
unless opt_build_root?
|
|
||||||
options = if Process.uid == 0
|
|
||||||
"--install-dir=#{Gem.default_dirs[:local][:gem_dir]} --bindir #{Gem.default_dirs[:local][:bin_dir]}"
|
|
||||||
else
|
|
||||||
"--user-install --bindir #{File.join [Dir.home, 'bin']}"
|
|
||||||
end
|
|
||||||
|
|
||||||
{"gem" => options}
|
|
||||||
else
|
|
||||||
{}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
##
|
##
|
||||||
# RubyGems default overrides.
|
# RubyGems default overrides.
|
||||||
|
|
||||||
def default_dir
|
def default_dir
|
||||||
|
if opt_build_root?
|
||||||
Gem.default_dirs[:system][:gem_dir]
|
Gem.default_dirs[:system][:gem_dir]
|
||||||
|
elsif Process.uid == 0
|
||||||
|
Gem.default_dirs[:local][:gem_dir]
|
||||||
|
else
|
||||||
|
Gem.user_dir
|
||||||
end
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# Path to specification files of default gems.
|
||||||
|
|
||||||
|
def default_specifications_dir
|
||||||
|
@default_specifications_dir ||= File.join(Gem.default_dirs[:system][:gem_dir], "specifications", "default")
|
||||||
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# Default gem load path
|
||||||
|
|
||||||
def default_path
|
def default_path
|
||||||
path = default_dirs.collect {|location, paths| paths[:gem_dir]}
|
path = default_dirs.collect {|location, paths| paths[:gem_dir]}
|
||||||
|
@ -122,6 +122,16 @@ module Gem
|
||||||
path
|
path
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def default_bindir
|
||||||
|
if opt_build_root?
|
||||||
|
Gem.default_dirs[:system][:bin_dir]
|
||||||
|
elsif Process.uid == 0
|
||||||
|
Gem.default_dirs[:local][:bin_dir]
|
||||||
|
else
|
||||||
|
File.join [Dir.home, 'bin']
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def default_ext_dir_for base_dir
|
def default_ext_dir_for base_dir
|
||||||
dir = if rpmbuild?
|
dir = if rpmbuild?
|
||||||
build_dir = base_dir.chomp Gem.default_dirs[:system][:gem_dir]
|
build_dir = base_dir.chomp Gem.default_dirs[:system][:gem_dir]
|
||||||
|
|
|
@ -1,25 +0,0 @@
|
||||||
From 28cc0749d6729aa2444661ee7b411e183fe220b0 Mon Sep 17 00:00:00 2001
|
|
||||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
|
||||||
Date: Mon, 19 Nov 2012 15:14:51 +0100
|
|
||||||
Subject: [PATCH] Verbose mkmf.
|
|
||||||
|
|
||||||
---
|
|
||||||
lib/mkmf.rb | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/lib/mkmf.rb b/lib/mkmf.rb
|
|
||||||
index 682eb46..e6b1445 100644
|
|
||||||
--- a/lib/mkmf.rb
|
|
||||||
+++ b/lib/mkmf.rb
|
|
||||||
@@ -1974,7 +1974,7 @@ def configuration(srcdir)
|
|
||||||
SHELL = /bin/sh
|
|
||||||
|
|
||||||
# V=0 quiet, V=1 verbose. other values don't work.
|
|
||||||
-V = 0
|
|
||||||
+V = 1
|
|
||||||
V0 = $(V:0=)
|
|
||||||
Q1 = $(V:1=)
|
|
||||||
Q = $(Q1:0=@)
|
|
||||||
--
|
|
||||||
1.8.3.1
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ diff --git a/configure.ac b/configure.ac
|
||||||
index d261ea57b5..3c13076b82 100644
|
index d261ea57b5..3c13076b82 100644
|
||||||
--- a/configure.ac
|
--- a/configure.ac
|
||||||
+++ b/configure.ac
|
+++ b/configure.ac
|
||||||
@@ -3368,6 +3368,11 @@ AS_IF([test ${multiarch+set}], [
|
@@ -3470,6 +3470,11 @@ AS_IF([test ${multiarch+set}], [
|
||||||
])
|
])
|
||||||
|
|
||||||
archlibdir='${libdir}/${arch}'
|
archlibdir='${libdir}/${arch}'
|
||||||
|
@ -23,6 +23,3 @@ index d261ea57b5..3c13076b82 100644
|
||||||
sitearchlibdir='${libdir}/${sitearch}'
|
sitearchlibdir='${libdir}/${sitearch}'
|
||||||
archincludedir='${includedir}/${arch}'
|
archincludedir='${includedir}/${arch}'
|
||||||
sitearchincludedir='${includedir}/${sitearch}'
|
sitearchincludedir='${includedir}/${sitearch}'
|
||||||
--
|
|
||||||
2.22.0
|
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ diff --git a/configure.ac b/configure.ac
|
||||||
index c42436c23d..d261ea57b5 100644
|
index c42436c23d..d261ea57b5 100644
|
||||||
--- a/configure.ac
|
--- a/configure.ac
|
||||||
+++ b/configure.ac
|
+++ b/configure.ac
|
||||||
@@ -4026,7 +4026,8 @@ AS_CASE(["$ruby_version_dir_name"],
|
@@ -4309,7 +4309,8 @@ AS_CASE(["$ruby_version_dir_name"],
|
||||||
ruby_version_dir=/'${ruby_version_dir_name}'
|
ruby_version_dir=/'${ruby_version_dir_name}'
|
||||||
|
|
||||||
if test -z "${ruby_version_dir_name}"; then
|
if test -z "${ruby_version_dir_name}"; then
|
||||||
|
@ -75,6 +75,3 @@ index 07076d4..35e6c3c 100755
|
||||||
when /^ARCH_FLAG$/
|
when /^ARCH_FLAG$/
|
||||||
val = "arch_flag || #{val}" if universal
|
val = "arch_flag || #{val}" if universal
|
||||||
when /^UNIVERSAL_ARCHNAMES$/
|
when /^UNIVERSAL_ARCHNAMES$/
|
||||||
--
|
|
||||||
1.9.0
|
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ diff --git a/configure.ac b/configure.ac
|
||||||
index 3c13076b82..93af30321d 100644
|
index 3c13076b82..93af30321d 100644
|
||||||
--- a/configure.ac
|
--- a/configure.ac
|
||||||
+++ b/configure.ac
|
+++ b/configure.ac
|
||||||
@@ -4090,6 +4090,8 @@ AC_SUBST(vendorarchdir)dnl
|
@@ -4373,6 +4373,8 @@ AC_SUBST(vendorarchdir)dnl
|
||||||
AC_SUBST(CONFIGURE, "`echo $0 | sed 's|.*/||'`")dnl
|
AC_SUBST(CONFIGURE, "`echo $0 | sed 's|.*/||'`")dnl
|
||||||
AC_SUBST(configure_args, "`echo "${ac_configure_args}" | sed 's/\\$/$$/g'`")dnl
|
AC_SUBST(configure_args, "`echo "${ac_configure_args}" | sed 's/\\$/$$/g'`")dnl
|
||||||
|
|
||||||
|
@ -20,6 +20,3 @@ index 3c13076b82..93af30321d 100644
|
||||||
AS_IF([test "${universal_binary-no}" = yes ], [
|
AS_IF([test "${universal_binary-no}" = yes ], [
|
||||||
arch="universal-${target_os}"
|
arch="universal-${target_os}"
|
||||||
AS_IF([test "${rb_cv_architecture_available}" = yes], [
|
AS_IF([test "${rb_cv_architecture_available}" = yes], [
|
||||||
--
|
|
||||||
1.8.3.1
|
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,7 @@ diff --git a/configure.ac b/configure.ac
|
||||||
index 93af30321d..bc13397e0e 100644
|
index 93af30321d..bc13397e0e 100644
|
||||||
--- a/configure.ac
|
--- a/configure.ac
|
||||||
+++ b/configure.ac
|
+++ b/configure.ac
|
||||||
@@ -4062,6 +4062,10 @@ AC_ARG_WITH(vendorarchdir,
|
@@ -4345,6 +4345,10 @@ AC_ARG_WITH(vendorarchdir,
|
||||||
[vendorarchdir=$withval],
|
[vendorarchdir=$withval],
|
||||||
[vendorarchdir=${multiarch+'${rubysitearchprefix}/vendor_ruby'${ruby_version_dir}}${multiarch-'${vendorlibdir}/${sitearch}'}])
|
[vendorarchdir=${multiarch+'${rubysitearchprefix}/vendor_ruby'${ruby_version_dir}}${multiarch-'${vendorlibdir}/${sitearch}'}])
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ index 93af30321d..bc13397e0e 100644
|
||||||
AS_IF([test "${LOAD_RELATIVE+set}"], [
|
AS_IF([test "${LOAD_RELATIVE+set}"], [
|
||||||
AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
|
AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
|
||||||
RUBY_EXEC_PREFIX=''
|
RUBY_EXEC_PREFIX=''
|
||||||
@@ -4086,6 +4090,7 @@ AC_SUBST(sitearchdir)dnl
|
@@ -4369,6 +4373,7 @@ AC_SUBST(sitearchdir)dnl
|
||||||
AC_SUBST(vendordir)dnl
|
AC_SUBST(vendordir)dnl
|
||||||
AC_SUBST(vendorlibdir)dnl
|
AC_SUBST(vendorlibdir)dnl
|
||||||
AC_SUBST(vendorarchdir)dnl
|
AC_SUBST(vendorarchdir)dnl
|
||||||
|
@ -75,7 +75,7 @@ index e9110a17ca..76a1f0a315 100755
|
||||||
mandir = CONFIG["mandir", true]
|
mandir = CONFIG["mandir", true]
|
||||||
docdir = CONFIG["docdir", true]
|
docdir = CONFIG["docdir", true]
|
||||||
enable_shared = CONFIG["ENABLE_SHARED"] == 'yes'
|
enable_shared = CONFIG["ENABLE_SHARED"] == 'yes'
|
||||||
@@ -590,7 +591,16 @@ def stub
|
@@ -595,7 +596,16 @@ def stub
|
||||||
install?(:local, :comm, :lib) do
|
install?(:local, :comm, :lib) do
|
||||||
prepare "library scripts", rubylibdir
|
prepare "library scripts", rubylibdir
|
||||||
noinst = %w[*.txt *.rdoc *.gemspec]
|
noinst = %w[*.txt *.rdoc *.gemspec]
|
||||||
|
@ -92,6 +92,3 @@ index e9110a17ca..76a1f0a315 100755
|
||||||
end
|
end
|
||||||
|
|
||||||
install?(:local, :comm, :hdr, :'comm-hdr') do
|
install?(:local, :comm, :hdr, :'comm-hdr') do
|
||||||
--
|
|
||||||
1.8.3.1
|
|
||||||
|
|
||||||
|
|
|
@ -12,15 +12,15 @@ ruby_version_dir_name now specifies custom version string for versioned
|
||||||
directories, e.g. instead of default X.Y.Z, you can specify whatever
|
directories, e.g. instead of default X.Y.Z, you can specify whatever
|
||||||
string.
|
string.
|
||||||
---
|
---
|
||||||
configure.ac | 64 ++++++++++++++++++++++++---------------------
|
configure.ac | 66 ++++++++++++++++++++++++---------------------
|
||||||
template/ruby.pc.in | 1 +
|
template/ruby.pc.in | 1 +
|
||||||
2 files changed, 35 insertions(+), 30 deletions(-)
|
2 files changed, 36 insertions(+), 31 deletions(-)
|
||||||
|
|
||||||
diff --git a/configure.ac b/configure.ac
|
diff --git a/configure.ac b/configure.ac
|
||||||
index 80b137e380..63cd3b4f8b 100644
|
index 80b137e380..63cd3b4f8b 100644
|
||||||
--- a/configure.ac
|
--- a/configure.ac
|
||||||
+++ b/configure.ac
|
+++ b/configure.ac
|
||||||
@@ -3977,9 +3977,6 @@ AS_CASE(["$target_os"],
|
@@ -4259,9 +4259,6 @@ AS_CASE(["$target_os"],
|
||||||
rubyw_install_name='$(RUBYW_INSTALL_NAME)'
|
rubyw_install_name='$(RUBYW_INSTALL_NAME)'
|
||||||
])
|
])
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ index 80b137e380..63cd3b4f8b 100644
|
||||||
rubyarchprefix=${multiarch+'${archlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${arch}'}
|
rubyarchprefix=${multiarch+'${archlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${arch}'}
|
||||||
AC_ARG_WITH(rubyarchprefix,
|
AC_ARG_WITH(rubyarchprefix,
|
||||||
AS_HELP_STRING([--with-rubyarchprefix=DIR],
|
AS_HELP_STRING([--with-rubyarchprefix=DIR],
|
||||||
@@ -4002,56 +3999,62 @@ AC_ARG_WITH(ridir,
|
@@ -4284,57 +4281,63 @@ AC_ARG_WITH(ridir,
|
||||||
AC_SUBST(ridir)
|
AC_SUBST(ridir)
|
||||||
AC_SUBST(RI_BASE_NAME)
|
AC_SUBST(RI_BASE_NAME)
|
||||||
|
|
||||||
|
@ -46,6 +46,7 @@ index 80b137e380..63cd3b4f8b 100644
|
||||||
-AS_IF([test ${RUBY_LIB_VERSION_STYLE+set}], [
|
-AS_IF([test ${RUBY_LIB_VERSION_STYLE+set}], [
|
||||||
- {
|
- {
|
||||||
- echo "#define RUBY_LIB_VERSION_STYLE $RUBY_LIB_VERSION_STYLE"
|
- echo "#define RUBY_LIB_VERSION_STYLE $RUBY_LIB_VERSION_STYLE"
|
||||||
|
- echo '@%:@include "confdefs.h"'
|
||||||
- echo '#define STRINGIZE(x) x'
|
- echo '#define STRINGIZE(x) x'
|
||||||
- test -f revision.h -o -f "${srcdir}/revision.h" || echo '#define RUBY_REVISION 0'
|
- test -f revision.h -o -f "${srcdir}/revision.h" || echo '#define RUBY_REVISION 0'
|
||||||
- echo '#include "version.h"'
|
- echo '#include "version.h"'
|
||||||
|
@ -61,6 +62,7 @@ index 80b137e380..63cd3b4f8b 100644
|
||||||
+RUBY_LIB_VERSION_STYLE='3 /* full */'
|
+RUBY_LIB_VERSION_STYLE='3 /* full */'
|
||||||
+{
|
+{
|
||||||
+echo "#define RUBY_LIB_VERSION_STYLE $RUBY_LIB_VERSION_STYLE"
|
+echo "#define RUBY_LIB_VERSION_STYLE $RUBY_LIB_VERSION_STYLE"
|
||||||
|
+echo '@%:@include "confdefs.h"'
|
||||||
+echo '#define STRINGIZE(x) x'
|
+echo '#define STRINGIZE(x) x'
|
||||||
+test -f revision.h -o -f "${srcdir}/revision.h" || echo '#define RUBY_REVISION 0'
|
+test -f revision.h -o -f "${srcdir}/revision.h" || echo '#define RUBY_REVISION 0'
|
||||||
+echo '#include "version.h"'
|
+echo '#include "version.h"'
|
||||||
|
@ -120,7 +122,7 @@ index 80b137e380..63cd3b4f8b 100644
|
||||||
|
|
||||||
AS_IF([test "${LOAD_RELATIVE+set}"], [
|
AS_IF([test "${LOAD_RELATIVE+set}"], [
|
||||||
AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
|
AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
|
||||||
@@ -4068,6 +4071,7 @@ AC_SUBST(sitearchincludedir)dnl
|
@@ -4351,6 +4354,7 @@ AC_SUBST(sitearchincludedir)dnl
|
||||||
AC_SUBST(arch)dnl
|
AC_SUBST(arch)dnl
|
||||||
AC_SUBST(sitearch)dnl
|
AC_SUBST(sitearch)dnl
|
||||||
AC_SUBST(ruby_version)dnl
|
AC_SUBST(ruby_version)dnl
|
||||||
|
@ -140,8 +142,6 @@ index 8a2c066..c81b211 100644
|
||||||
RUBY_API_VERSION=@RUBY_API_VERSION@
|
RUBY_API_VERSION=@RUBY_API_VERSION@
|
||||||
RUBY_PROGRAM_VERSION=@RUBY_PROGRAM_VERSION@
|
RUBY_PROGRAM_VERSION=@RUBY_PROGRAM_VERSION@
|
||||||
arch=@arch@
|
arch=@arch@
|
||||||
--
|
|
||||||
2.1.0
|
|
||||||
|
|
||||||
|
|
||||||
From 518850aba6eee76de7715aae8d37330e34b01983 Mon Sep 17 00:00:00 2001
|
From 518850aba6eee76de7715aae8d37330e34b01983 Mon Sep 17 00:00:00 2001
|
||||||
|
@ -171,7 +171,7 @@ diff --git a/tool/rbinstall.rb b/tool/rbinstall.rb
|
||||||
index d4c110e..d39c9a6 100755
|
index d4c110e..d39c9a6 100755
|
||||||
--- a/tool/rbinstall.rb
|
--- a/tool/rbinstall.rb
|
||||||
+++ b/tool/rbinstall.rb
|
+++ b/tool/rbinstall.rb
|
||||||
@@ -448,7 +448,7 @@ def CONFIG.[](name, mandatory = false)
|
@@ -453,7 +453,7 @@ def CONFIG.[](name, mandatory = false)
|
||||||
|
|
||||||
install?(:doc, :rdoc) do
|
install?(:doc, :rdoc) do
|
||||||
if $rdocdir
|
if $rdocdir
|
||||||
|
@ -180,9 +180,6 @@ index d4c110e..d39c9a6 100755
|
||||||
prepare "rdoc", ridatadir
|
prepare "rdoc", ridatadir
|
||||||
install_recursive($rdocdir, ridatadir, :no_install => rdoc_noinst, :mode => $data_mode)
|
install_recursive($rdocdir, ridatadir, :no_install => rdoc_noinst, :mode => $data_mode)
|
||||||
end
|
end
|
||||||
--
|
|
||||||
2.23.0
|
|
||||||
|
|
||||||
|
|
||||||
From 9f0ec0233f618cbb862629816b22491c3df79578 Mon Sep 17 00:00:00 2001
|
From 9f0ec0233f618cbb862629816b22491c3df79578 Mon Sep 17 00:00:00 2001
|
||||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||||
|
@ -198,31 +195,31 @@ diff --git a/lib/rubygems/defaults.rb b/lib/rubygems/defaults.rb
|
||||||
index d4ff4a262c..3f9a5bf590 100644
|
index d4ff4a262c..3f9a5bf590 100644
|
||||||
--- a/lib/rubygems/defaults.rb
|
--- a/lib/rubygems/defaults.rb
|
||||||
+++ b/lib/rubygems/defaults.rb
|
+++ b/lib/rubygems/defaults.rb
|
||||||
@@ -34,7 +34,7 @@ def self.default_spec_cache_dir
|
@@ -35,7 +35,7 @@ def self.default_spec_cache_dir
|
||||||
# specified in the environment
|
# specified in the environment
|
||||||
|
|
||||||
def self.default_dir
|
def self.default_dir
|
||||||
- @default_dir ||= File.join(RbConfig::CONFIG['rubylibprefix'], 'gems', RbConfig::CONFIG['ruby_version'])
|
- @default_dir ||= File.join(RbConfig::CONFIG["rubylibprefix"], "gems", RbConfig::CONFIG["ruby_version"])
|
||||||
+ @default_dir ||= File.join(RbConfig::CONFIG['rubylibprefix'], 'gems', RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version'])
|
+ @default_dir ||= File.join(RbConfig::CONFIG["rubylibprefix"], "gems", RbConfig::CONFIG["ruby_version_dir_name"] || RbConfig::CONFIG["ruby_version"])
|
||||||
end
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
@@ -103,7 +103,8 @@ def self.user_dir
|
@@ -104,7 +104,8 @@ def self.user_dir
|
||||||
gem_dir = File.join(Gem.user_home, ".gem")
|
gem_dir = File.join(Gem.user_home, ".gem")
|
||||||
gem_dir = File.join(Gem.data_home, "gem") unless File.exist?(gem_dir)
|
gem_dir = File.join(Gem.data_home, "gem") unless File.exist?(gem_dir)
|
||||||
parts = [gem_dir, ruby_engine]
|
parts = [gem_dir, ruby_engine]
|
||||||
- parts << RbConfig::CONFIG['ruby_version'] unless RbConfig::CONFIG['ruby_version'].empty?
|
- parts << RbConfig::CONFIG["ruby_version"] unless RbConfig::CONFIG["ruby_version"].empty?
|
||||||
+ ruby_version_dir_name = RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']
|
+ ruby_version_dir_name = RbConfig::CONFIG["ruby_version_dir_name"] || RbConfig::CONFIG["ruby_version"]
|
||||||
+ parts << ruby_version_dir_name unless ruby_version_dir_name.empty?
|
+ parts << ruby_version_dir_name unless ruby_version_dir_name.empty?
|
||||||
File.join parts
|
File.join parts
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -234,7 +235,7 @@ def self.vendor_dir # :nodoc:
|
@@ -265,7 +266,7 @@ def self.vendor_dir # :nodoc:
|
||||||
return nil unless RbConfig::CONFIG.key? 'vendordir'
|
return nil unless RbConfig::CONFIG.key? "vendordir"
|
||||||
|
|
||||||
File.join RbConfig::CONFIG['vendordir'], 'gems',
|
File.join RbConfig::CONFIG["vendordir"], "gems",
|
||||||
- RbConfig::CONFIG['ruby_version']
|
- RbConfig::CONFIG["ruby_version"]
|
||||||
+ RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']
|
+ RbConfig::CONFIG["ruby_version_dir_name"] || RbConfig::CONFIG["ruby_version"]
|
||||||
end
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
|
@ -230,27 +227,25 @@ diff --git a/test/rubygems/test_gem.rb b/test/rubygems/test_gem.rb
|
||||||
index b25068405d..e9fef4a311 100644
|
index b25068405d..e9fef4a311 100644
|
||||||
--- a/test/rubygems/test_gem.rb
|
--- a/test/rubygems/test_gem.rb
|
||||||
+++ b/test/rubygems/test_gem.rb
|
+++ b/test/rubygems/test_gem.rb
|
||||||
@@ -1410,7 +1410,8 @@ def test_self_use_paths
|
@@ -1351,7 +1351,8 @@ def test_self_use_paths
|
||||||
|
|
||||||
def test_self_user_dir
|
def test_self_user_dir
|
||||||
parts = [@userhome, '.gem', Gem.ruby_engine]
|
parts = [@userhome, ".gem", Gem.ruby_engine]
|
||||||
- parts << RbConfig::CONFIG['ruby_version'] unless RbConfig::CONFIG['ruby_version'].empty?
|
- parts << RbConfig::CONFIG["ruby_version"] unless RbConfig::CONFIG["ruby_version"].empty?
|
||||||
+ ruby_version_dir_name = RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']
|
+ ruby_version_dir_name = RbConfig::CONFIG["ruby_version_dir_name"] || RbConfig::CONFIG["ruby_version"]
|
||||||
+ parts << ruby_version_dir_name unless ruby_version_dir_name.empty?
|
+ parts << ruby_version_dir_name unless ruby_version_dir_name.empty?
|
||||||
|
|
||||||
FileUtils.mkdir_p File.join(parts)
|
FileUtils.mkdir_p File.join(parts)
|
||||||
|
|
||||||
@@ -1486,7 +1487,7 @@ def test_self_vendor_dir
|
@@ -1427,7 +1428,7 @@ def test_self_vendor_dir
|
||||||
vendordir(File.join(@tempdir, 'vendor')) do
|
vendordir(File.join(@tempdir, "vendor")) do
|
||||||
expected =
|
expected =
|
||||||
File.join RbConfig::CONFIG['vendordir'], 'gems',
|
File.join RbConfig::CONFIG["vendordir"], "gems",
|
||||||
- RbConfig::CONFIG['ruby_version']
|
- RbConfig::CONFIG["ruby_version"]
|
||||||
+ RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']
|
+ RbConfig::CONFIG["ruby_version_dir_name"] || RbConfig::CONFIG["ruby_version"]
|
||||||
|
|
||||||
assert_equal expected, Gem.vendor_dir
|
assert_equal expected, Gem.vendor_dir
|
||||||
end
|
end
|
||||||
--
|
|
||||||
2.1.0
|
|
||||||
|
|
||||||
|
|
||||||
From 88c38a030c22dbf9422ece847bdfbf87d6659313 Mon Sep 17 00:00:00 2001
|
From 88c38a030c22dbf9422ece847bdfbf87d6659313 Mon Sep 17 00:00:00 2001
|
||||||
|
@ -267,7 +262,7 @@ diff --git a/configure.ac b/configure.ac
|
||||||
index a00f2b6776..999e2d6d5d 100644
|
index a00f2b6776..999e2d6d5d 100644
|
||||||
--- a/configure.ac
|
--- a/configure.ac
|
||||||
+++ b/configure.ac
|
+++ b/configure.ac
|
||||||
@@ -108,7 +108,7 @@ RUBY_BASE_NAME=`echo ruby | sed "$program_transform_name"`
|
@@ -135,7 +135,7 @@ RUBY_BASE_NAME=`echo ruby | sed "$program_transform_name"`
|
||||||
RUBYW_BASE_NAME=`echo rubyw | sed "$program_transform_name"`
|
RUBYW_BASE_NAME=`echo rubyw | sed "$program_transform_name"`
|
||||||
AC_SUBST(RUBY_BASE_NAME)
|
AC_SUBST(RUBY_BASE_NAME)
|
||||||
AC_SUBST(RUBYW_BASE_NAME)
|
AC_SUBST(RUBYW_BASE_NAME)
|
||||||
|
@ -276,6 +271,3 @@ index a00f2b6776..999e2d6d5d 100644
|
||||||
|
|
||||||
dnl checks for alternative programs
|
dnl checks for alternative programs
|
||||||
AC_CANONICAL_BUILD
|
AC_CANONICAL_BUILD
|
||||||
--
|
|
||||||
2.1.0
|
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,8 @@ To keep the things simple for now, load the ABRT hook via C.
|
||||||
abrt.c | 12 ++++++++++++
|
abrt.c | 12 ++++++++++++
|
||||||
common.mk | 3 ++-
|
common.mk | 3 ++-
|
||||||
ruby.c | 4 ++++
|
ruby.c | 4 ++++
|
||||||
3 files changed, 18 insertions(+), 1 deletion(-)
|
spec/ruby/core/kernel/require_spec.rb | 2 ++
|
||||||
|
4 files changed, 20 insertions(+), 1 deletion(-)
|
||||||
create mode 100644 abrt.c
|
create mode 100644 abrt.c
|
||||||
|
|
||||||
diff --git a/abrt.c b/abrt.c
|
diff --git a/abrt.c b/abrt.c
|
||||||
|
@ -43,9 +44,9 @@ diff --git a/common.mk b/common.mk
|
||||||
index b2e5b2b6d0..f39f81da5c 100644
|
index b2e5b2b6d0..f39f81da5c 100644
|
||||||
--- a/common.mk
|
--- a/common.mk
|
||||||
+++ b/common.mk
|
+++ b/common.mk
|
||||||
@@ -82,7 +82,8 @@ ENC_MK = enc.mk
|
@@ -111,7 +111,8 @@ PRISM_FILES = prism/api_node.$(OBJEXT) \
|
||||||
MAKE_ENC = -f $(ENC_MK) V="$(V)" UNICODE_HDR_DIR="$(UNICODE_HDR_DIR)" \
|
prism/prism.$(OBJEXT) \
|
||||||
RUBY="$(MINIRUBY)" MINIRUBY="$(MINIRUBY)" $(mflags)
|
prism_init.$(OBJEXT)
|
||||||
|
|
||||||
-COMMONOBJS = array.$(OBJEXT) \
|
-COMMONOBJS = array.$(OBJEXT) \
|
||||||
+COMMONOBJS = abrt.$(OBJEXT) \
|
+COMMONOBJS = abrt.$(OBJEXT) \
|
||||||
|
@ -57,7 +58,7 @@ diff --git a/ruby.c b/ruby.c
|
||||||
index 60c57d6259..1eec16f2c8 100644
|
index 60c57d6259..1eec16f2c8 100644
|
||||||
--- a/ruby.c
|
--- a/ruby.c
|
||||||
+++ b/ruby.c
|
+++ b/ruby.c
|
||||||
@@ -1611,10 +1611,14 @@ proc_options(long argc, char **argv, ruby_cmdline_options_t *opt, int envopt)
|
@@ -1724,10 +1724,14 @@ proc_options(long argc, char **argv, ruby_cmdline_options_t *opt, int envopt)
|
||||||
|
|
||||||
void Init_builtin_features(void);
|
void Init_builtin_features(void);
|
||||||
|
|
||||||
|
@ -72,6 +73,16 @@ index 60c57d6259..1eec16f2c8 100644
|
||||||
rb_const_remove(rb_cObject, rb_intern_const("TMP_RUBY_PREFIX"));
|
rb_const_remove(rb_cObject, rb_intern_const("TMP_RUBY_PREFIX"));
|
||||||
}
|
}
|
||||||
|
|
||||||
--
|
diff --git a/spec/ruby/core/kernel/require_spec.rb b/spec/ruby/core/kernel/require_spec.rb
|
||||||
2.24.1
|
index 60c57d6259..1eec16f2c8 100644
|
||||||
|
--- a/spec/ruby/core/kernel/require_spec.rb
|
||||||
|
+++ b/spec/ruby/core/kernel/require_spec.rb
|
||||||
|
@@ -25,6 +25,8 @@
|
||||||
|
out = ruby_exe("puts $LOADED_FEATURES", options: '--disable-gems --disable-did-you-mean')
|
||||||
|
features = out.lines.map { |line| File.basename(line.chomp, '.*') }
|
||||||
|
|
||||||
|
+ # Ignore ABRT
|
||||||
|
+ features -= %w[abrt]
|
||||||
|
# Ignore CRuby internals
|
||||||
|
features -= %w[encdb transdb windows_1252]
|
||||||
|
features.reject! { |feature| feature.end_with?('-fake') }
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
From 9b42fce32bff25e0569581f76f532b9d57865aef Mon Sep 17 00:00:00 2001
|
|
||||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
|
||||||
Date: Mon, 27 Jul 2020 14:56:05 +0200
|
|
||||||
Subject: [PATCH] Timeout the test_bug_reporter_add witout raising error.
|
|
||||||
|
|
||||||
While timeouting the threads might be still good idea, it does not seems
|
|
||||||
the timeout impacts the TestBugReporter#test_bug_reporter_add result,
|
|
||||||
because the output of the child process has been already collected
|
|
||||||
earlier.
|
|
||||||
|
|
||||||
It seems that when the system is under heavy load, the thread might not
|
|
||||||
be sheduled to finish its processing. Even finishing the child process
|
|
||||||
might take tens of seconds and therefore the test case finish might take
|
|
||||||
a while.
|
|
||||||
---
|
|
||||||
test/-ext-/bug_reporter/test_bug_reporter.rb | 2 +-
|
|
||||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/test/-ext-/bug_reporter/test_bug_reporter.rb b/test/-ext-/bug_reporter/test_bug_reporter.rb
|
|
||||||
index 628fcd0340..2c677cc8a7 100644
|
|
||||||
--- a/test/-ext-/bug_reporter/test_bug_reporter.rb
|
|
||||||
+++ b/test/-ext-/bug_reporter/test_bug_reporter.rb
|
|
||||||
@@ -22,7 +22,7 @@ def test_bug_reporter_add
|
|
||||||
args = ["--disable-gems", "-r-test-/bug_reporter",
|
|
||||||
"-C", tmpdir]
|
|
||||||
stdin = "register_sample_bug_reporter(12345); Process.kill :SEGV, $$"
|
|
||||||
- assert_in_out_err(args, stdin, [], expected_stderr, encoding: "ASCII-8BIT")
|
|
||||||
+ assert_in_out_err(args, stdin, [], expected_stderr, encoding: "ASCII-8BIT", timeout_error: nil)
|
|
||||||
ensure
|
|
||||||
FileUtils.rm_rf(tmpdir) if tmpdir
|
|
||||||
end
|
|
||||||
--
|
|
||||||
2.27.0
|
|
||||||
|
|
|
@ -1,43 +0,0 @@
|
||||||
From 0ade5611df9f981005eed32b369d1e699e520221 Mon Sep 17 00:00:00 2001
|
|
||||||
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
|
||||||
Date: Thu, 10 Feb 2022 13:26:44 +0100
|
|
||||||
Subject: [PATCH] Don't query `RubyVM::FrozenCore` for class path.
|
|
||||||
|
|
||||||
The `RubyVM::FrozenCore` class path is corrupted during GC cycle and
|
|
||||||
returns random garbage, which might result in segfault.
|
|
||||||
|
|
||||||
But since it is easy to detect the `RubyVM::FrozenCore`, just provide
|
|
||||||
the class path explicitly as a workaround.
|
|
||||||
|
|
||||||
Other possibility would be to ignore `RubyVM::FrozenCore` simlarly as
|
|
||||||
TracePoint API does:
|
|
||||||
|
|
||||||
https://github.com/ruby/ruby/blob/46f6575157d4c2f6bbd5693896e26a65037e5552/vm_trace.c#L411
|
|
||||||
---
|
|
||||||
vm.c | 10 +++++++++-
|
|
||||||
1 file changed, 9 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/vm.c b/vm.c
|
|
||||||
index 8ce8b279d4..3d189fa63a 100644
|
|
||||||
--- a/vm.c
|
|
||||||
+++ b/vm.c
|
|
||||||
@@ -479,7 +479,15 @@ rb_dtrace_setup(rb_execution_context_t *ec, VALUE klass, ID id,
|
|
||||||
}
|
|
||||||
type = BUILTIN_TYPE(klass);
|
|
||||||
if (type == T_CLASS || type == T_ICLASS || type == T_MODULE) {
|
|
||||||
- VALUE name = rb_class_path(klass);
|
|
||||||
+ VALUE name = Qnil;
|
|
||||||
+ /*
|
|
||||||
+ * Special treatment for rb_mRubyVMFrozenCore wchi is broken by GC.
|
|
||||||
+ * https://bugs.ruby-lang.org/issues/18257
|
|
||||||
+ */
|
|
||||||
+ if (klass == rb_mRubyVMFrozenCore)
|
|
||||||
+ name = rb_str_new_cstr("RubyVM::FrozenCore");
|
|
||||||
+ else
|
|
||||||
+ name = rb_class_path(klass);
|
|
||||||
const char *classname, *filename;
|
|
||||||
const char *methodname = rb_id2name(id);
|
|
||||||
if (methodname && (filename = rb_source_location_cstr(&args->line_no)) != 0) {
|
|
||||||
--
|
|
||||||
2.34.1
|
|
||||||
|
|
|
@ -1,31 +0,0 @@
|
||||||
--- ext/openssl/ossl_ocsp.c.orig 2022-04-07 16:40:13.263752886 +0200
|
|
||||||
+++ ext/openssl/ossl_ocsp.c 2022-04-07 16:45:56.818971187 +0200
|
|
||||||
@@ -382,7 +382,7 @@
|
|
||||||
if (!NIL_P(flags))
|
|
||||||
flg = NUM2INT(flags);
|
|
||||||
if (NIL_P(digest))
|
|
||||||
- md = EVP_sha1();
|
|
||||||
+ md = NULL;
|
|
||||||
else
|
|
||||||
md = ossl_evp_get_digestbyname(digest);
|
|
||||||
if (NIL_P(certs))
|
|
||||||
@@ -1033,7 +1033,7 @@
|
|
||||||
if (!NIL_P(flags))
|
|
||||||
flg = NUM2INT(flags);
|
|
||||||
if (NIL_P(digest))
|
|
||||||
- md = EVP_sha1();
|
|
||||||
+ md = NULL;
|
|
||||||
else
|
|
||||||
md = ossl_evp_get_digestbyname(digest);
|
|
||||||
if (NIL_P(certs))
|
|
||||||
--- test/openssl/test_ocsp.rb.orig 2022-04-08 08:20:31.400739869 +0200
|
|
||||||
+++ test/openssl/test_ocsp.rb 2022-04-08 08:20:37.208727488 +0200
|
|
||||||
@@ -99,7 +99,7 @@
|
|
||||||
request.sign(@cert, @cert_key, [@ca_cert], 0)
|
|
||||||
asn1 = OpenSSL::ASN1.decode(request.to_der)
|
|
||||||
assert_equal cid.to_der, asn1.value[0].value.find { |a| a.tag_class == :UNIVERSAL }.value[0].value[0].to_der
|
|
||||||
- assert_equal OpenSSL::ASN1.ObjectId("sha1WithRSAEncryption").to_der, asn1.value[1].value[0].value[0].value[0].to_der
|
|
||||||
+ assert_equal OpenSSL::ASN1.ObjectId("sha256WithRSAEncryption").to_der, asn1.value[1].value[0].value[0].value[0].to_der
|
|
||||||
assert_equal @cert.to_der, asn1.value[1].value[0].value[2].value[0].value[0].to_der
|
|
||||||
assert_equal @ca_cert.to_der, asn1.value[1].value[0].value[2].value[0].value[1].to_der
|
|
||||||
assert_equal asn1.to_der, OpenSSL::OCSP::Request.new(asn1.to_der).to_der
|
|
|
@ -1,609 +0,0 @@
|
||||||
diff --git a/ext/openssl/extconf.rb b/ext/openssl/extconf.rb
|
|
||||||
index fedcb93..53ad621 100644
|
|
||||||
--- a/ext/openssl/extconf.rb
|
|
||||||
+++ b/ext/openssl/extconf.rb
|
|
||||||
@@ -169,6 +169,7 @@ have_func("SSL_CTX_set_post_handshake_auth")
|
|
||||||
|
|
||||||
# added in 1.1.1
|
|
||||||
have_func("EVP_PKEY_check")
|
|
||||||
+have_func("SSL_CTX_set_ciphersuites")
|
|
||||||
|
|
||||||
# added in 3.0.0
|
|
||||||
have_func("SSL_set0_tmp_dh_pkey")
|
|
||||||
diff --git a/ext/openssl/ossl.h b/ext/openssl/ossl.h
|
|
||||||
index 4b51268..2ab8aea 100644
|
|
||||||
--- a/ext/openssl/ossl.h
|
|
||||||
+++ b/ext/openssl/ossl.h
|
|
||||||
@@ -43,13 +43,13 @@
|
|
||||||
#ifndef LIBRESSL_VERSION_NUMBER
|
|
||||||
# define OSSL_IS_LIBRESSL 0
|
|
||||||
# define OSSL_OPENSSL_PREREQ(maj, min, pat) \
|
|
||||||
- (OPENSSL_VERSION_NUMBER >= (maj << 28) | (min << 20) | (pat << 12))
|
|
||||||
+ (OPENSSL_VERSION_NUMBER >= ((maj << 28) | (min << 20) | (pat << 12)))
|
|
||||||
# define OSSL_LIBRESSL_PREREQ(maj, min, pat) 0
|
|
||||||
#else
|
|
||||||
# define OSSL_IS_LIBRESSL 1
|
|
||||||
# define OSSL_OPENSSL_PREREQ(maj, min, pat) 0
|
|
||||||
# define OSSL_LIBRESSL_PREREQ(maj, min, pat) \
|
|
||||||
- (LIBRESSL_VERSION_NUMBER >= (maj << 28) | (min << 20) | (pat << 12))
|
|
||||||
+ (LIBRESSL_VERSION_NUMBER >= ((maj << 28) | (min << 20) | (pat << 12)))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if !defined(OPENSSL_NO_ENGINE) && !OSSL_OPENSSL_PREREQ(3, 0, 0)
|
|
||||||
diff --git a/ext/openssl/ossl_asn1.c b/ext/openssl/ossl_asn1.c
|
|
||||||
index a61d3ee..0d3fa9a 100644
|
|
||||||
--- a/ext/openssl/ossl_asn1.c
|
|
||||||
+++ b/ext/openssl/ossl_asn1.c
|
|
||||||
@@ -1522,7 +1522,7 @@ Init_ossl_asn1(void)
|
|
||||||
*
|
|
||||||
* An Array that stores the name of a given tag number. These names are
|
|
||||||
* the same as the name of the tag constant that is additionally defined,
|
|
||||||
- * e.g. +UNIVERSAL_TAG_NAME[2] = "INTEGER"+ and +OpenSSL::ASN1::INTEGER = 2+.
|
|
||||||
+ * e.g. <tt>UNIVERSAL_TAG_NAME[2] = "INTEGER"</tt> and <tt>OpenSSL::ASN1::INTEGER = 2</tt>.
|
|
||||||
*
|
|
||||||
* == Example usage
|
|
||||||
*
|
|
||||||
diff --git a/ext/openssl/ossl_pkey.c b/ext/openssl/ossl_pkey.c
|
|
||||||
index 2a4835a..24d0da4 100644
|
|
||||||
--- a/ext/openssl/ossl_pkey.c
|
|
||||||
+++ b/ext/openssl/ossl_pkey.c
|
|
||||||
@@ -670,7 +670,7 @@ ossl_pkey_export_traditional(int argc, VALUE *argv, VALUE self, int to_der)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
-#if OPENSSL_VERSION_NUMBER >= 0x10100000 && !defined(LIBRESSL_VERSION_NUMBER)
|
|
||||||
+#if OSSL_OPENSSL_PREREQ(1, 1, 0) || OSSL_LIBRESSL_PREREQ(3, 5, 0)
|
|
||||||
if (!PEM_write_bio_PrivateKey_traditional(bio, pkey, enc, NULL, 0,
|
|
||||||
ossl_pem_passwd_cb,
|
|
||||||
(void *)pass)) {
|
|
||||||
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
|
|
||||||
index 9a0682a..af262d9 100644
|
|
||||||
--- a/ext/openssl/ossl_ssl.c
|
|
||||||
+++ b/ext/openssl/ossl_ssl.c
|
|
||||||
@@ -959,27 +959,13 @@ ossl_sslctx_get_ciphers(VALUE self)
|
|
||||||
return ary;
|
|
||||||
}
|
|
||||||
|
|
||||||
-/*
|
|
||||||
- * call-seq:
|
|
||||||
- * ctx.ciphers = "cipher1:cipher2:..."
|
|
||||||
- * ctx.ciphers = [name, ...]
|
|
||||||
- * ctx.ciphers = [[name, version, bits, alg_bits], ...]
|
|
||||||
- *
|
|
||||||
- * Sets the list of available cipher suites for this context. Note in a server
|
|
||||||
- * context some ciphers require the appropriate certificates. For example, an
|
|
||||||
- * RSA cipher suite can only be chosen when an RSA certificate is available.
|
|
||||||
- */
|
|
||||||
static VALUE
|
|
||||||
-ossl_sslctx_set_ciphers(VALUE self, VALUE v)
|
|
||||||
+build_cipher_string(VALUE v)
|
|
||||||
{
|
|
||||||
- SSL_CTX *ctx;
|
|
||||||
VALUE str, elem;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
- rb_check_frozen(self);
|
|
||||||
- if (NIL_P(v))
|
|
||||||
- return v;
|
|
||||||
- else if (RB_TYPE_P(v, T_ARRAY)) {
|
|
||||||
+ if (RB_TYPE_P(v, T_ARRAY)) {
|
|
||||||
str = rb_str_new(0, 0);
|
|
||||||
for (i = 0; i < RARRAY_LEN(v); i++) {
|
|
||||||
elem = rb_ary_entry(v, i);
|
|
||||||
@@ -993,14 +979,67 @@ ossl_sslctx_set_ciphers(VALUE self, VALUE v)
|
|
||||||
StringValue(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
+ return str;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+/*
|
|
||||||
+ * call-seq:
|
|
||||||
+ * ctx.ciphers = "cipher1:cipher2:..."
|
|
||||||
+ * ctx.ciphers = [name, ...]
|
|
||||||
+ * ctx.ciphers = [[name, version, bits, alg_bits], ...]
|
|
||||||
+ *
|
|
||||||
+ * Sets the list of available cipher suites for this context. Note in a server
|
|
||||||
+ * context some ciphers require the appropriate certificates. For example, an
|
|
||||||
+ * RSA cipher suite can only be chosen when an RSA certificate is available.
|
|
||||||
+ */
|
|
||||||
+static VALUE
|
|
||||||
+ossl_sslctx_set_ciphers(VALUE self, VALUE v)
|
|
||||||
+{
|
|
||||||
+ SSL_CTX *ctx;
|
|
||||||
+ VALUE str;
|
|
||||||
+
|
|
||||||
+ rb_check_frozen(self);
|
|
||||||
+ if (NIL_P(v))
|
|
||||||
+ return v;
|
|
||||||
+
|
|
||||||
+ str = build_cipher_string(v);
|
|
||||||
+
|
|
||||||
GetSSLCTX(self, ctx);
|
|
||||||
- if (!SSL_CTX_set_cipher_list(ctx, StringValueCStr(str))) {
|
|
||||||
+ if (!SSL_CTX_set_cipher_list(ctx, StringValueCStr(str)))
|
|
||||||
ossl_raise(eSSLError, "SSL_CTX_set_cipher_list");
|
|
||||||
- }
|
|
||||||
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
+#ifdef HAVE_SSL_CTX_SET_CIPHERSUITES
|
|
||||||
+/*
|
|
||||||
+ * call-seq:
|
|
||||||
+ * ctx.ciphersuites = "cipher1:cipher2:..."
|
|
||||||
+ * ctx.ciphersuites = [name, ...]
|
|
||||||
+ * ctx.ciphersuites = [[name, version, bits, alg_bits], ...]
|
|
||||||
+ *
|
|
||||||
+ * Sets the list of available TLSv1.3 cipher suites for this context.
|
|
||||||
+ */
|
|
||||||
+static VALUE
|
|
||||||
+ossl_sslctx_set_ciphersuites(VALUE self, VALUE v)
|
|
||||||
+{
|
|
||||||
+ SSL_CTX *ctx;
|
|
||||||
+ VALUE str;
|
|
||||||
+
|
|
||||||
+ rb_check_frozen(self);
|
|
||||||
+ if (NIL_P(v))
|
|
||||||
+ return v;
|
|
||||||
+
|
|
||||||
+ str = build_cipher_string(v);
|
|
||||||
+
|
|
||||||
+ GetSSLCTX(self, ctx);
|
|
||||||
+ if (!SSL_CTX_set_ciphersuites(ctx, StringValueCStr(str)))
|
|
||||||
+ ossl_raise(eSSLError, "SSL_CTX_set_ciphersuites");
|
|
||||||
+
|
|
||||||
+ return v;
|
|
||||||
+}
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
#ifndef OPENSSL_NO_DH
|
|
||||||
/*
|
|
||||||
* call-seq:
|
|
||||||
@@ -2703,6 +2742,9 @@ Init_ossl_ssl(void)
|
|
||||||
ossl_sslctx_set_minmax_proto_version, 2);
|
|
||||||
rb_define_method(cSSLContext, "ciphers", ossl_sslctx_get_ciphers, 0);
|
|
||||||
rb_define_method(cSSLContext, "ciphers=", ossl_sslctx_set_ciphers, 1);
|
|
||||||
+#ifdef HAVE_SSL_CTX_SET_CIPHERSUITES
|
|
||||||
+ rb_define_method(cSSLContext, "ciphersuites=", ossl_sslctx_set_ciphersuites, 1);
|
|
||||||
+#endif
|
|
||||||
#ifndef OPENSSL_NO_DH
|
|
||||||
rb_define_method(cSSLContext, "tmp_dh=", ossl_sslctx_set_tmp_dh, 1);
|
|
||||||
#endif
|
|
||||||
diff --git a/test/openssl/test_asn1.rb b/test/openssl/test_asn1.rb
|
|
||||||
index 0fd7971..c79bc14 100644
|
|
||||||
--- a/test/openssl/test_asn1.rb
|
|
||||||
+++ b/test/openssl/test_asn1.rb
|
|
||||||
@@ -14,7 +14,7 @@ class OpenSSL::TestASN1 < OpenSSL::TestCase
|
|
||||||
["keyUsage","keyCertSign, cRLSign",true],
|
|
||||||
["subjectKeyIdentifier","hash",false],
|
|
||||||
]
|
|
||||||
- dgst = OpenSSL::Digest.new('SHA1')
|
|
||||||
+ dgst = OpenSSL::Digest.new('SHA256')
|
|
||||||
cert = OpenSSL::TestUtils.issue_cert(
|
|
||||||
subj, key, s, exts, nil, nil, digest: dgst, not_before: now, not_after: now+3600)
|
|
||||||
|
|
||||||
@@ -42,7 +42,7 @@ class OpenSSL::TestASN1 < OpenSSL::TestCase
|
|
||||||
assert_equal(OpenSSL::ASN1::Sequence, sig.class)
|
|
||||||
assert_equal(2, sig.value.size)
|
|
||||||
assert_equal(OpenSSL::ASN1::ObjectId, sig.value[0].class)
|
|
||||||
- assert_equal("1.2.840.113549.1.1.5", sig.value[0].oid)
|
|
||||||
+ assert_equal("1.2.840.113549.1.1.11", sig.value[0].oid)
|
|
||||||
assert_equal(OpenSSL::ASN1::Null, sig.value[1].class)
|
|
||||||
|
|
||||||
dn = tbs_cert.value[3] # issuer
|
|
||||||
@@ -189,7 +189,7 @@ class OpenSSL::TestASN1 < OpenSSL::TestCase
|
|
||||||
assert_equal(OpenSSL::ASN1::Null, pkey.value[0].value[1].class)
|
|
||||||
|
|
||||||
assert_equal(OpenSSL::ASN1::BitString, sig_val.class)
|
|
||||||
- cululated_sig = key.sign(OpenSSL::Digest.new('SHA1'), tbs_cert.to_der)
|
|
||||||
+ cululated_sig = key.sign(OpenSSL::Digest.new('SHA256'), tbs_cert.to_der)
|
|
||||||
assert_equal(cululated_sig, sig_val.value)
|
|
||||||
end
|
|
||||||
|
|
||||||
diff --git a/test/openssl/test_ns_spki.rb b/test/openssl/test_ns_spki.rb
|
|
||||||
index ed3be86..383931b 100644
|
|
||||||
--- a/test/openssl/test_ns_spki.rb
|
|
||||||
+++ b/test/openssl/test_ns_spki.rb
|
|
||||||
@@ -22,7 +22,7 @@ class OpenSSL::TestNSSPI < OpenSSL::TestCase
|
|
||||||
spki = OpenSSL::Netscape::SPKI.new
|
|
||||||
spki.challenge = "RandomString"
|
|
||||||
spki.public_key = key1.public_key
|
|
||||||
- spki.sign(key1, OpenSSL::Digest.new('SHA1'))
|
|
||||||
+ spki.sign(key1, OpenSSL::Digest.new('SHA256'))
|
|
||||||
assert(spki.verify(spki.public_key))
|
|
||||||
assert(spki.verify(key1.public_key))
|
|
||||||
assert(!spki.verify(key2.public_key))
|
|
||||||
diff --git a/test/openssl/test_pkey_dsa.rb b/test/openssl/test_pkey_dsa.rb
|
|
||||||
index 726b7db..08213df 100644
|
|
||||||
--- a/test/openssl/test_pkey_dsa.rb
|
|
||||||
+++ b/test/openssl/test_pkey_dsa.rb
|
|
||||||
@@ -36,8 +36,8 @@ class OpenSSL::TestPKeyDSA < OpenSSL::PKeyTestCase
|
|
||||||
assert_equal true, dsa512.verify(OpenSSL::Digest.new('DSS1'), signature, data)
|
|
||||||
end
|
|
||||||
|
|
||||||
- signature = dsa512.sign("SHA1", data)
|
|
||||||
- assert_equal true, dsa512.verify("SHA1", signature, data)
|
|
||||||
+ signature = dsa512.sign("SHA256", data)
|
|
||||||
+ assert_equal true, dsa512.verify("SHA256", signature, data)
|
|
||||||
|
|
||||||
signature0 = (<<~'end;').unpack("m")[0]
|
|
||||||
MCwCFH5h40plgU5Fh0Z4wvEEpz0eE9SnAhRPbkRB8ggsN/vsSEYMXvJwjGg/
|
|
||||||
diff --git a/test/openssl/test_pkey_ec.rb b/test/openssl/test_pkey_ec.rb
|
|
||||||
index ffe5a94..c06fe6f 100644
|
|
||||||
--- a/test/openssl/test_pkey_ec.rb
|
|
||||||
+++ b/test/openssl/test_pkey_ec.rb
|
|
||||||
@@ -98,8 +98,8 @@ class OpenSSL::TestEC < OpenSSL::PKeyTestCase
|
|
||||||
def test_sign_verify
|
|
||||||
p256 = Fixtures.pkey("p256")
|
|
||||||
data = "Sign me!"
|
|
||||||
- signature = p256.sign("SHA1", data)
|
|
||||||
- assert_equal true, p256.verify("SHA1", signature, data)
|
|
||||||
+ signature = p256.sign("SHA256", data)
|
|
||||||
+ assert_equal true, p256.verify("SHA256", signature, data)
|
|
||||||
|
|
||||||
signature0 = (<<~'end;').unpack("m")[0]
|
|
||||||
MEQCIEOTY/hD7eI8a0qlzxkIt8LLZ8uwiaSfVbjX2dPAvN11AiAQdCYx56Fq
|
|
||||||
diff --git a/test/openssl/test_pkey_rsa.rb b/test/openssl/test_pkey_rsa.rb
|
|
||||||
index 4bb39ed..9e06e43 100644
|
|
||||||
--- a/test/openssl/test_pkey_rsa.rb
|
|
||||||
+++ b/test/openssl/test_pkey_rsa.rb
|
|
||||||
@@ -80,8 +80,8 @@ class OpenSSL::TestPKeyRSA < OpenSSL::PKeyTestCase
|
|
||||||
def test_sign_verify
|
|
||||||
rsa1024 = Fixtures.pkey("rsa1024")
|
|
||||||
data = "Sign me!"
|
|
||||||
- signature = rsa1024.sign("SHA1", data)
|
|
||||||
- assert_equal true, rsa1024.verify("SHA1", signature, data)
|
|
||||||
+ signature = rsa1024.sign("SHA256", data)
|
|
||||||
+ assert_equal true, rsa1024.verify("SHA256", signature, data)
|
|
||||||
|
|
||||||
signature0 = (<<~'end;').unpack("m")[0]
|
|
||||||
oLCgbprPvfhM4pjFQiDTFeWI9Sk+Og7Nh9TmIZ/xSxf2CGXQrptlwo7NQ28+
|
|
||||||
@@ -113,10 +113,10 @@ class OpenSSL::TestPKeyRSA < OpenSSL::PKeyTestCase
|
|
||||||
def test_sign_verify_raw
|
|
||||||
key = Fixtures.pkey("rsa-1")
|
|
||||||
data = "Sign me!"
|
|
||||||
- hash = OpenSSL::Digest.digest("SHA1", data)
|
|
||||||
- signature = key.sign_raw("SHA1", hash)
|
|
||||||
- assert_equal true, key.verify_raw("SHA1", signature, hash)
|
|
||||||
- assert_equal true, key.verify("SHA1", signature, data)
|
|
||||||
+ hash = OpenSSL::Digest.digest("SHA256", data)
|
|
||||||
+ signature = key.sign_raw("SHA256", hash)
|
|
||||||
+ assert_equal true, key.verify_raw("SHA256", signature, hash)
|
|
||||||
+ assert_equal true, key.verify("SHA256", signature, data)
|
|
||||||
|
|
||||||
# Too long data
|
|
||||||
assert_raise(OpenSSL::PKey::PKeyError) {
|
|
||||||
@@ -129,9 +129,9 @@ class OpenSSL::TestPKeyRSA < OpenSSL::PKeyTestCase
|
|
||||||
"rsa_pss_saltlen" => 20,
|
|
||||||
"rsa_mgf1_md" => "SHA256"
|
|
||||||
}
|
|
||||||
- sig_pss = key.sign_raw("SHA1", hash, pssopts)
|
|
||||||
- assert_equal true, key.verify("SHA1", sig_pss, data, pssopts)
|
|
||||||
- assert_equal true, key.verify_raw("SHA1", sig_pss, hash, pssopts)
|
|
||||||
+ sig_pss = key.sign_raw("SHA256", hash, pssopts)
|
|
||||||
+ assert_equal true, key.verify("SHA256", sig_pss, data, pssopts)
|
|
||||||
+ assert_equal true, key.verify_raw("SHA256", sig_pss, hash, pssopts)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_sign_verify_raw_legacy
|
|
||||||
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
|
|
||||||
index a7607da..3ba8b39 100644
|
|
||||||
--- a/test/openssl/test_ssl.rb
|
|
||||||
+++ b/test/openssl/test_ssl.rb
|
|
||||||
@@ -676,10 +676,16 @@ class OpenSSL::TestSSL < OpenSSL::SSLTestCase
|
|
||||||
# buzz.example.net, respectively). ...
|
|
||||||
assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
|
|
||||||
create_cert_with_san('DNS:baz*.example.com'), 'baz1.example.com'))
|
|
||||||
+
|
|
||||||
+ # LibreSSL 3.5.0+ doesn't support other wildcard certificates
|
|
||||||
+ # (it isn't required to, as RFC states MAY, not MUST)
|
|
||||||
+ return if libressl?(3, 5, 0)
|
|
||||||
+
|
|
||||||
assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
|
|
||||||
create_cert_with_san('DNS:*baz.example.com'), 'foobaz.example.com'))
|
|
||||||
assert_equal(true, OpenSSL::SSL.verify_certificate_identity(
|
|
||||||
create_cert_with_san('DNS:b*z.example.com'), 'buzz.example.com'))
|
|
||||||
+
|
|
||||||
# Section 6.4.3 of RFC6125 states that client should NOT match identifier
|
|
||||||
# where wildcard is other than left-most label.
|
|
||||||
#
|
|
||||||
@@ -1563,6 +1569,99 @@ class OpenSSL::TestSSL < OpenSSL::SSLTestCase
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
+ def test_ciphersuites_method_tls_connection
|
|
||||||
+ ssl_ctx = OpenSSL::SSL::SSLContext.new
|
|
||||||
+ if !tls13_supported? || !ssl_ctx.respond_to?(:ciphersuites=)
|
|
||||||
+ pend 'TLS 1.3 not supported'
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ csuite = ['TLS_AES_128_GCM_SHA256', 'TLSv1.3', 128, 128]
|
|
||||||
+ inputs = [csuite[0], [csuite[0]], [csuite]]
|
|
||||||
+
|
|
||||||
+ start_server do |port|
|
|
||||||
+ inputs.each do |input|
|
|
||||||
+ cli_ctx = OpenSSL::SSL::SSLContext.new
|
|
||||||
+ cli_ctx.min_version = cli_ctx.max_version = OpenSSL::SSL::TLS1_3_VERSION
|
|
||||||
+ cli_ctx.ciphersuites = input
|
|
||||||
+
|
|
||||||
+ server_connect(port, cli_ctx) do |ssl|
|
|
||||||
+ assert_equal('TLSv1.3', ssl.ssl_version)
|
|
||||||
+ if libressl?(3, 4, 0) && !libressl?(3, 5, 0)
|
|
||||||
+ assert_equal("AEAD-AES128-GCM-SHA256", ssl.cipher[0])
|
|
||||||
+ else
|
|
||||||
+ assert_equal(csuite[0], ssl.cipher[0])
|
|
||||||
+ end
|
|
||||||
+ ssl.puts('abc'); assert_equal("abc\n", ssl.gets)
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ def test_ciphersuites_method_nil_argument
|
|
||||||
+ ssl_ctx = OpenSSL::SSL::SSLContext.new
|
|
||||||
+ pend 'ciphersuites= method is missing' unless ssl_ctx.respond_to?(:ciphersuites=)
|
|
||||||
+
|
|
||||||
+ assert_nothing_raised { ssl_ctx.ciphersuites = nil }
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ def test_ciphersuites_method_frozen_object
|
|
||||||
+ ssl_ctx = OpenSSL::SSL::SSLContext.new
|
|
||||||
+ pend 'ciphersuites= method is missing' unless ssl_ctx.respond_to?(:ciphersuites=)
|
|
||||||
+
|
|
||||||
+ ssl_ctx.freeze
|
|
||||||
+ assert_raise(FrozenError) { ssl_ctx.ciphersuites = 'TLS_AES_256_GCM_SHA384' }
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ def test_ciphersuites_method_bogus_csuite
|
|
||||||
+ ssl_ctx = OpenSSL::SSL::SSLContext.new
|
|
||||||
+ pend 'ciphersuites= method is missing' unless ssl_ctx.respond_to?(:ciphersuites=)
|
|
||||||
+
|
|
||||||
+ assert_raise_with_message(
|
|
||||||
+ OpenSSL::SSL::SSLError,
|
|
||||||
+ /SSL_CTX_set_ciphersuites: no cipher match/i
|
|
||||||
+ ) { ssl_ctx.ciphersuites = 'BOGUS' }
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ def test_ciphers_method_tls_connection
|
|
||||||
+ csuite = ['ECDHE-RSA-AES256-GCM-SHA384', 'TLSv1.2', 256, 256]
|
|
||||||
+ inputs = [csuite[0], [csuite[0]], [csuite]]
|
|
||||||
+
|
|
||||||
+ start_server do |port|
|
|
||||||
+ inputs.each do |input|
|
|
||||||
+ cli_ctx = OpenSSL::SSL::SSLContext.new
|
|
||||||
+ cli_ctx.min_version = cli_ctx.max_version = OpenSSL::SSL::TLS1_2_VERSION
|
|
||||||
+ cli_ctx.ciphers = input
|
|
||||||
+
|
|
||||||
+ server_connect(port, cli_ctx) do |ssl|
|
|
||||||
+ assert_equal('TLSv1.2', ssl.ssl_version)
|
|
||||||
+ assert_equal(csuite[0], ssl.cipher[0])
|
|
||||||
+ ssl.puts('abc'); assert_equal("abc\n", ssl.gets)
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ def test_ciphers_method_nil_argument
|
|
||||||
+ ssl_ctx = OpenSSL::SSL::SSLContext.new
|
|
||||||
+ assert_nothing_raised { ssl_ctx.ciphers = nil }
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ def test_ciphers_method_frozen_object
|
|
||||||
+ ssl_ctx = OpenSSL::SSL::SSLContext.new
|
|
||||||
+
|
|
||||||
+ ssl_ctx.freeze
|
|
||||||
+ assert_raise(FrozenError) { ssl_ctx.ciphers = 'ECDHE-RSA-AES128-SHA' }
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ def test_ciphers_method_bogus_csuite
|
|
||||||
+ ssl_ctx = OpenSSL::SSL::SSLContext.new
|
|
||||||
+
|
|
||||||
+ assert_raise_with_message(
|
|
||||||
+ OpenSSL::SSL::SSLError,
|
|
||||||
+ /SSL_CTX_set_cipher_list: no cipher match/i
|
|
||||||
+ ) { ssl_ctx.ciphers = 'BOGUS' }
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
def test_connect_works_when_setting_dh_callback_to_nil
|
|
||||||
ctx_proc = -> ctx {
|
|
||||||
ctx.max_version = :TLS1_2
|
|
||||||
diff --git a/test/openssl/test_x509cert.rb b/test/openssl/test_x509cert.rb
|
|
||||||
index d696b98..4e2bd0c 100644
|
|
||||||
--- a/test/openssl/test_x509cert.rb
|
|
||||||
+++ b/test/openssl/test_x509cert.rb
|
|
||||||
@@ -180,6 +180,7 @@ class OpenSSL::TestX509Certificate < OpenSSL::TestCase
|
|
||||||
assert_equal(false, certificate_error_returns_false { cert.verify(@dsa512) })
|
|
||||||
cert.serial = 2
|
|
||||||
assert_equal(false, cert.verify(@rsa2048))
|
|
||||||
+ rescue OpenSSL::X509::CertificateError # RHEL 9 disables SHA1
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_sign_and_verify_rsa_md5
|
|
||||||
@@ -226,9 +227,8 @@ class OpenSSL::TestX509Certificate < OpenSSL::TestCase
|
|
||||||
assert_equal("dsa_with_SHA256", cert.signature_algorithm)
|
|
||||||
# TODO: need more tests for dsa + sha2
|
|
||||||
|
|
||||||
- # SHA1 is allowed from OpenSSL 1.0.0 (0.9.8 requires DSS1)
|
|
||||||
- cert = issue_cert(@ca, @dsa256, 1, [], nil, nil, digest: "sha1")
|
|
||||||
- assert_equal("dsaWithSHA1", cert.signature_algorithm)
|
|
||||||
+ cert = issue_cert(@ca, @dsa256, 1, [], nil, nil, digest: "sha512")
|
|
||||||
+ assert_equal("dsa_with_SHA512", cert.signature_algorithm)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_check_private_key
|
|
||||||
diff --git a/test/openssl/test_x509crl.rb b/test/openssl/test_x509crl.rb
|
|
||||||
index bcdb0a6..146ee07 100644
|
|
||||||
--- a/test/openssl/test_x509crl.rb
|
|
||||||
+++ b/test/openssl/test_x509crl.rb
|
|
||||||
@@ -20,7 +20,7 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
|
|
||||||
|
|
||||||
cert = issue_cert(@ca, @rsa2048, 1, [], nil, nil)
|
|
||||||
crl = issue_crl([], 1, now, now+1600, [],
|
|
||||||
- cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
|
|
||||||
+ cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
|
|
||||||
assert_equal(1, crl.version)
|
|
||||||
assert_equal(cert.issuer.to_der, crl.issuer.to_der)
|
|
||||||
assert_equal(now, crl.last_update)
|
|
||||||
@@ -57,7 +57,7 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
|
|
||||||
]
|
|
||||||
cert = issue_cert(@ca, @rsa2048, 1, [], nil, nil)
|
|
||||||
crl = issue_crl(revoke_info, 1, Time.now, Time.now+1600, [],
|
|
||||||
- cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
|
|
||||||
+ cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
|
|
||||||
revoked = crl.revoked
|
|
||||||
assert_equal(5, revoked.size)
|
|
||||||
assert_equal(1, revoked[0].serial)
|
|
||||||
@@ -98,7 +98,7 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
|
|
||||||
|
|
||||||
revoke_info = (1..1000).collect{|i| [i, now, 0] }
|
|
||||||
crl = issue_crl(revoke_info, 1, Time.now, Time.now+1600, [],
|
|
||||||
- cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
|
|
||||||
+ cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
|
|
||||||
revoked = crl.revoked
|
|
||||||
assert_equal(1000, revoked.size)
|
|
||||||
assert_equal(1, revoked[0].serial)
|
|
||||||
@@ -124,7 +124,7 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
|
|
||||||
|
|
||||||
cert = issue_cert(@ca, @rsa2048, 1, cert_exts, nil, nil)
|
|
||||||
crl = issue_crl([], 1, Time.now, Time.now+1600, crl_exts,
|
|
||||||
- cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
|
|
||||||
+ cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
|
|
||||||
exts = crl.extensions
|
|
||||||
assert_equal(3, exts.size)
|
|
||||||
assert_equal("1", exts[0].value)
|
|
||||||
@@ -160,24 +160,24 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
|
|
||||||
assert_equal(false, exts[2].critical?)
|
|
||||||
|
|
||||||
no_ext_crl = issue_crl([], 1, Time.now, Time.now+1600, [],
|
|
||||||
- cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
|
|
||||||
+ cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
|
|
||||||
assert_equal nil, no_ext_crl.authority_key_identifier
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_crlnumber
|
|
||||||
cert = issue_cert(@ca, @rsa2048, 1, [], nil, nil)
|
|
||||||
crl = issue_crl([], 1, Time.now, Time.now+1600, [],
|
|
||||||
- cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
|
|
||||||
+ cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
|
|
||||||
assert_match(1.to_s, crl.extensions[0].value)
|
|
||||||
assert_match(/X509v3 CRL Number:\s+#{1}/m, crl.to_text)
|
|
||||||
|
|
||||||
crl = issue_crl([], 2**32, Time.now, Time.now+1600, [],
|
|
||||||
- cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
|
|
||||||
+ cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
|
|
||||||
assert_match((2**32).to_s, crl.extensions[0].value)
|
|
||||||
assert_match(/X509v3 CRL Number:\s+#{2**32}/m, crl.to_text)
|
|
||||||
|
|
||||||
crl = issue_crl([], 2**100, Time.now, Time.now+1600, [],
|
|
||||||
- cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
|
|
||||||
+ cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
|
|
||||||
assert_match(/X509v3 CRL Number:\s+#{2**100}/m, crl.to_text)
|
|
||||||
assert_match((2**100).to_s, crl.extensions[0].value)
|
|
||||||
end
|
|
||||||
@@ -185,7 +185,7 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
|
|
||||||
def test_sign_and_verify
|
|
||||||
cert = issue_cert(@ca, @rsa2048, 1, [], nil, nil)
|
|
||||||
crl = issue_crl([], 1, Time.now, Time.now+1600, [],
|
|
||||||
- cert, @rsa2048, OpenSSL::Digest.new('SHA1'))
|
|
||||||
+ cert, @rsa2048, OpenSSL::Digest.new('SHA256'))
|
|
||||||
assert_equal(false, crl.verify(@rsa1024))
|
|
||||||
assert_equal(true, crl.verify(@rsa2048))
|
|
||||||
assert_equal(false, crl_error_returns_false { crl.verify(@dsa256) })
|
|
||||||
@@ -195,7 +195,7 @@ class OpenSSL::TestX509CRL < OpenSSL::TestCase
|
|
||||||
|
|
||||||
cert = issue_cert(@ca, @dsa512, 1, [], nil, nil)
|
|
||||||
crl = issue_crl([], 1, Time.now, Time.now+1600, [],
|
|
||||||
- cert, @dsa512, OpenSSL::Digest.new('SHA1'))
|
|
||||||
+ cert, @dsa512, OpenSSL::Digest.new('SHA256'))
|
|
||||||
assert_equal(false, crl_error_returns_false { crl.verify(@rsa1024) })
|
|
||||||
assert_equal(false, crl_error_returns_false { crl.verify(@rsa2048) })
|
|
||||||
assert_equal(false, crl.verify(@dsa256))
|
|
||||||
diff --git a/test/openssl/test_x509req.rb b/test/openssl/test_x509req.rb
|
|
||||||
index ee9c678..a84b162 100644
|
|
||||||
--- a/test/openssl/test_x509req.rb
|
|
||||||
+++ b/test/openssl/test_x509req.rb
|
|
||||||
@@ -23,31 +23,31 @@ class OpenSSL::TestX509Request < OpenSSL::TestCase
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_public_key
|
|
||||||
- req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
|
|
||||||
+ req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
|
|
||||||
assert_equal(@rsa1024.public_key.to_der, req.public_key.to_der)
|
|
||||||
req = OpenSSL::X509::Request.new(req.to_der)
|
|
||||||
assert_equal(@rsa1024.public_key.to_der, req.public_key.to_der)
|
|
||||||
|
|
||||||
- req = issue_csr(0, @dn, @dsa512, OpenSSL::Digest.new('SHA1'))
|
|
||||||
+ req = issue_csr(0, @dn, @dsa512, OpenSSL::Digest.new('SHA256'))
|
|
||||||
assert_equal(@dsa512.public_key.to_der, req.public_key.to_der)
|
|
||||||
req = OpenSSL::X509::Request.new(req.to_der)
|
|
||||||
assert_equal(@dsa512.public_key.to_der, req.public_key.to_der)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_version
|
|
||||||
- req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
|
|
||||||
+ req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
|
|
||||||
assert_equal(0, req.version)
|
|
||||||
req = OpenSSL::X509::Request.new(req.to_der)
|
|
||||||
assert_equal(0, req.version)
|
|
||||||
|
|
||||||
- req = issue_csr(1, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
|
|
||||||
+ req = issue_csr(1, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
|
|
||||||
assert_equal(1, req.version)
|
|
||||||
req = OpenSSL::X509::Request.new(req.to_der)
|
|
||||||
assert_equal(1, req.version)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_subject
|
|
||||||
- req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
|
|
||||||
+ req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
|
|
||||||
assert_equal(@dn.to_der, req.subject.to_der)
|
|
||||||
req = OpenSSL::X509::Request.new(req.to_der)
|
|
||||||
assert_equal(@dn.to_der, req.subject.to_der)
|
|
||||||
@@ -78,9 +78,9 @@ class OpenSSL::TestX509Request < OpenSSL::TestCase
|
|
||||||
OpenSSL::X509::Attribute.new("msExtReq", attrval),
|
|
||||||
]
|
|
||||||
|
|
||||||
- req0 = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
|
|
||||||
+ req0 = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
|
|
||||||
attrs.each{|attr| req0.add_attribute(attr) }
|
|
||||||
- req1 = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
|
|
||||||
+ req1 = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
|
|
||||||
req1.attributes = attrs
|
|
||||||
assert_equal(req0.to_der, req1.to_der)
|
|
||||||
|
|
||||||
@@ -101,7 +101,7 @@ class OpenSSL::TestX509Request < OpenSSL::TestCase
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_sign_and_verify_rsa_sha1
|
|
||||||
- req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
|
|
||||||
+ req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
|
|
||||||
assert_equal(true, req.verify(@rsa1024))
|
|
||||||
assert_equal(false, req.verify(@rsa2048))
|
|
||||||
assert_equal(false, request_error_returns_false { req.verify(@dsa256) })
|
|
||||||
@@ -122,7 +122,7 @@ class OpenSSL::TestX509Request < OpenSSL::TestCase
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_sign_and_verify_dsa
|
|
||||||
- req = issue_csr(0, @dn, @dsa512, OpenSSL::Digest.new('SHA1'))
|
|
||||||
+ req = issue_csr(0, @dn, @dsa512, OpenSSL::Digest.new('SHA256'))
|
|
||||||
assert_equal(false, request_error_returns_false { req.verify(@rsa1024) })
|
|
||||||
assert_equal(false, request_error_returns_false { req.verify(@rsa2048) })
|
|
||||||
assert_equal(false, req.verify(@dsa256))
|
|
||||||
@@ -137,13 +137,13 @@ class OpenSSL::TestX509Request < OpenSSL::TestCase
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_dup
|
|
||||||
- req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA1'))
|
|
||||||
+ req = issue_csr(0, @dn, @rsa1024, OpenSSL::Digest.new('SHA256'))
|
|
||||||
assert_equal(req.to_der, req.dup.to_der)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_eq
|
|
||||||
- req1 = issue_csr(0, @dn, @rsa1024, "sha1")
|
|
||||||
- req2 = issue_csr(0, @dn, @rsa1024, "sha1")
|
|
||||||
+ req1 = issue_csr(0, @dn, @rsa1024, "sha512")
|
|
||||||
+ req2 = issue_csr(0, @dn, @rsa1024, "sha512")
|
|
||||||
req3 = issue_csr(0, @dn, @rsa1024, "sha256")
|
|
||||||
|
|
||||||
assert_equal false, req1 == 12345
|
|
|
@ -1,70 +0,0 @@
|
||||||
From a1124dc162810f86cb0bff58cde24064cfc561bc Mon Sep 17 00:00:00 2001
|
|
||||||
From: nagachika <nagachika@ruby-lang.org>
|
|
||||||
Date: Fri, 9 Dec 2022 21:11:47 +0900
|
|
||||||
Subject: [PATCH] merge revision(s) 58cc3c9f387dcf8f820b43e043b540fa06248da3:
|
|
||||||
[Backport #19187]
|
|
||||||
|
|
||||||
[Bug #19187] Fix for tzdata-2022g
|
|
||||||
|
|
||||||
---
|
|
||||||
test/ruby/test_time_tz.rb | 21 +++++++++++++++------
|
|
||||||
1 file changed, 15 insertions(+), 6 deletions(-)
|
|
||||||
---
|
|
||||||
test/ruby/test_time_tz.rb | 21 +++++++++++++++------
|
|
||||||
1 files changed, 15 insertions(+), 6 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/test/ruby/test_time_tz.rb b/test/ruby/test_time_tz.rb
|
|
||||||
index b6785f336028d..939f218ed4d10 100644
|
|
||||||
--- a/test/ruby/test_time_tz.rb
|
|
||||||
+++ b/test/ruby/test_time_tz.rb
|
|
||||||
@@ -7,9 +7,9 @@ class TestTimeTZ < Test::Unit::TestCase
|
|
||||||
has_lisbon_tz = true
|
|
||||||
force_tz_test = ENV["RUBY_FORCE_TIME_TZ_TEST"] == "yes"
|
|
||||||
case RUBY_PLATFORM
|
|
||||||
- when /linux/
|
|
||||||
+ when /darwin|linux/
|
|
||||||
force_tz_test = true
|
|
||||||
- when /darwin|freebsd|openbsd/
|
|
||||||
+ when /freebsd|openbsd/
|
|
||||||
has_lisbon_tz = false
|
|
||||||
force_tz_test = true
|
|
||||||
end
|
|
||||||
@@ -95,6 +95,9 @@ def group_by(e, &block)
|
|
||||||
CORRECT_KIRITIMATI_SKIP_1994 = with_tz("Pacific/Kiritimati") {
|
|
||||||
Time.local(1994, 12, 31, 0, 0, 0).year == 1995
|
|
||||||
}
|
|
||||||
+ CORRECT_SINGAPORE_1982 = with_tz("Asia/Singapore") {
|
|
||||||
+ "2022g" if Time.local(1981, 12, 31, 23, 59, 59).utc_offset == 8*3600
|
|
||||||
+ }
|
|
||||||
|
|
||||||
def time_to_s(t)
|
|
||||||
t.to_s
|
|
||||||
@@ -140,9 +143,12 @@ def test_america_managua
|
|
||||||
|
|
||||||
def test_asia_singapore
|
|
||||||
with_tz(tz="Asia/Singapore") {
|
|
||||||
- assert_time_constructor(tz, "1981-12-31 23:59:59 +0730", :local, [1981,12,31,23,59,59])
|
|
||||||
- assert_time_constructor(tz, "1982-01-01 00:30:00 +0800", :local, [1982,1,1,0,0,0])
|
|
||||||
- assert_time_constructor(tz, "1982-01-01 00:59:59 +0800", :local, [1982,1,1,0,29,59])
|
|
||||||
+ assert_time_constructor(tz, "1981-12-31 23:29:59 +0730", :local, [1981,12,31,23,29,59])
|
|
||||||
+ if CORRECT_SINGAPORE_1982
|
|
||||||
+ assert_time_constructor(tz, "1982-01-01 00:00:00 +0800", :local, [1981,12,31,23,30,00])
|
|
||||||
+ assert_time_constructor(tz, "1982-01-01 00:00:00 +0800", :local, [1982,1,1,0,0,0])
|
|
||||||
+ assert_time_constructor(tz, "1982-01-01 00:29:59 +0800", :local, [1982,1,1,0,29,59])
|
|
||||||
+ end
|
|
||||||
assert_time_constructor(tz, "1982-01-01 00:30:00 +0800", :local, [1982,1,1,0,30,0])
|
|
||||||
}
|
|
||||||
end
|
|
||||||
@@ -450,8 +456,11 @@ def self.gen_zdump_test(data)
|
|
||||||
America/Managua Wed Jan 1 04:59:59 1997 UTC = Tue Dec 31 23:59:59 1996 EST isdst=0 gmtoff=-18000
|
|
||||||
America/Managua Wed Jan 1 05:00:00 1997 UTC = Tue Dec 31 23:00:00 1996 CST isdst=0 gmtoff=-21600
|
|
||||||
Asia/Singapore Sun Aug 8 16:30:00 1965 UTC = Mon Aug 9 00:00:00 1965 SGT isdst=0 gmtoff=27000
|
|
||||||
-Asia/Singapore Thu Dec 31 16:29:59 1981 UTC = Thu Dec 31 23:59:59 1981 SGT isdst=0 gmtoff=27000
|
|
||||||
+Asia/Singapore Thu Dec 31 15:59:59 1981 UTC = Thu Dec 31 23:29:59 1981 SGT isdst=0 gmtoff=27000
|
|
||||||
Asia/Singapore Thu Dec 31 16:30:00 1981 UTC = Fri Jan 1 00:30:00 1982 SGT isdst=0 gmtoff=28800
|
|
||||||
+End
|
|
||||||
+ gen_zdump_test <<'End' if CORRECT_SINGAPORE_1982
|
|
||||||
+Asia/Singapore Thu Dec 31 16:00:00 1981 UTC = Fri Jan 1 00:00:00 1982 SGT isdst=0 gmtoff=28800
|
|
||||||
End
|
|
||||||
gen_zdump_test CORRECT_TOKYO_DST_1951 ? <<'End' + (CORRECT_TOKYO_DST_1951 < "2018f" ? <<'2018e' : <<'2018f') : <<'End'
|
|
||||||
Asia/Tokyo Sat May 5 14:59:59 1951 UTC = Sat May 5 23:59:59 1951 JST isdst=0 gmtoff=32400
|
|
|
@ -1,338 +0,0 @@
|
||||||
From 111f8422427d78becc9183ae149b2105a16bf327 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Nobuyoshi Nakada <nobu@ruby-lang.org>
|
|
||||||
Date: Tue, 5 Apr 2022 23:24:00 +0900
|
|
||||||
Subject: [PATCH 1/5] Bundled gems are expanded under `.bundle/gems` now
|
|
||||||
|
|
||||||
---
|
|
||||||
ext/extmk.rb | 13 +++++++------
|
|
||||||
template/exts.mk.tmpl | 2 +-
|
|
||||||
2 files changed, 8 insertions(+), 7 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/ext/extmk.rb b/ext/extmk.rb
|
|
||||||
index 4a087f294ac9..1da9e2704521 100755
|
|
||||||
--- a/ext/extmk.rb
|
|
||||||
+++ b/ext/extmk.rb
|
|
||||||
@@ -146,7 +146,7 @@ def extmake(target, basedir = 'ext', maybestatic = true)
|
|
||||||
top_srcdir = $top_srcdir
|
|
||||||
topdir = $topdir
|
|
||||||
hdrdir = $hdrdir
|
|
||||||
- prefix = "../" * (target.count("/")+1)
|
|
||||||
+ prefix = "../" * (basedir.count("/")+target.count("/")+1)
|
|
||||||
$top_srcdir = relative_from(top_srcdir, prefix)
|
|
||||||
$hdrdir = relative_from(hdrdir, prefix)
|
|
||||||
$topdir = prefix + $topdir
|
|
||||||
@@ -460,10 +460,11 @@ def $mflags.defined?(var)
|
|
||||||
end unless $extstatic
|
|
||||||
|
|
||||||
@gemname = nil
|
|
||||||
-if ARGV[0]
|
|
||||||
- ext_prefix, exts = ARGV.shift.split('/', 2)
|
|
||||||
+if exts = ARGV.shift
|
|
||||||
+ ext_prefix = exts[%r[\A(?>\.bundle/)?[^/]+(?:/(?=(.+)?)|\z)]]
|
|
||||||
+ exts = $1
|
|
||||||
$extension = [exts] if exts
|
|
||||||
- if ext_prefix == 'gems'
|
|
||||||
+ if ext_prefix.start_with?('.')
|
|
||||||
@gemname = exts
|
|
||||||
elsif exts
|
|
||||||
$static_ext.delete_if {|t, *| !File.fnmatch(t, exts)}
|
|
||||||
@@ -515,7 +516,7 @@ def $mflags.defined?(var)
|
|
||||||
exts.delete_if {|d| File.fnmatch?("-*", d)}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
-ext_prefix = File.basename(ext_prefix)
|
|
||||||
+ext_prefix = ext_prefix[$top_srcdir.size+1..-2]
|
|
||||||
|
|
||||||
extend Module.new {
|
|
||||||
def timestamp_file(name, target_prefix = nil)
|
|
||||||
@@ -634,7 +635,7 @@ def initialize(src)
|
|
||||||
end
|
|
||||||
}
|
|
||||||
|
|
||||||
-Dir.chdir ".."
|
|
||||||
+Dir.chdir dir
|
|
||||||
unless $destdir.to_s.empty?
|
|
||||||
$mflags.defined?("DESTDIR") or $mflags << "DESTDIR=#{$destdir}"
|
|
||||||
end
|
|
||||||
diff --git a/template/exts.mk.tmpl b/template/exts.mk.tmpl
|
|
||||||
index 2f37f4480ac5..964939e365a1 100644
|
|
||||||
--- a/template/exts.mk.tmpl
|
|
||||||
+++ b/template/exts.mk.tmpl
|
|
||||||
@@ -25,7 +25,7 @@ macros["old_extensions"] = []
|
|
||||||
|
|
||||||
contpat = /(?>(?>[^\\\n]|\\.)*\\\n)*(?>[^\\\n]|\\.)*/
|
|
||||||
Dir.glob("{ext,.bundle/gems}/*/exts.mk") do |e|
|
|
||||||
- gem = /\Agems(?=\/)/ =~ e
|
|
||||||
+ gem = e.start_with?(".bundle/gems/")
|
|
||||||
s = File.read(e)
|
|
||||||
s.scan(/^(extensions|SUBMAKEOPTS|EXT[A-Z]+|MFLAGS|NOTE_[A-Z]+)[ \t]*=[ \t]*(#{contpat})$/o) do |n, v|
|
|
||||||
v.gsub!(/\\\n[ \t]*/, ' ')
|
|
||||||
|
|
||||||
From 6ea34cac22131d28a9cc50e7875e854aed9bdb88 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Nobuyoshi Nakada <nobu@ruby-lang.org>
|
|
||||||
Date: Wed, 6 Apr 2022 20:25:53 +0900
|
|
||||||
Subject: [PATCH 2/5] Retrieve configured gems info
|
|
||||||
|
|
||||||
---
|
|
||||||
template/configure-ext.mk.tmpl | 2 +-
|
|
||||||
template/exts.mk.tmpl | 4 ++--
|
|
||||||
2 files changed, 3 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/template/configure-ext.mk.tmpl b/template/configure-ext.mk.tmpl
|
|
||||||
index 6636a7759c54..8ba6b963e3ec 100644
|
|
||||||
--- a/template/configure-ext.mk.tmpl
|
|
||||||
+++ b/template/configure-ext.mk.tmpl
|
|
||||||
@@ -27,7 +27,7 @@ SCRIPT_ARGS = <%=script_args.gsub("#", "\\#")%>
|
|
||||||
EXTMK_ARGS = $(SCRIPT_ARGS) --gnumake=$(gnumake) --extflags="$(EXTLDFLAGS)" \
|
|
||||||
--make-flags="MINIRUBY='$(MINIRUBY)'"
|
|
||||||
|
|
||||||
-all: exts # gems
|
|
||||||
+all: exts gems
|
|
||||||
exts:
|
|
||||||
gems:
|
|
||||||
|
|
||||||
diff --git a/template/exts.mk.tmpl b/template/exts.mk.tmpl
|
|
||||||
index 964939e365a1..e544c4c88bd7 100644
|
|
||||||
--- a/template/exts.mk.tmpl
|
|
||||||
+++ b/template/exts.mk.tmpl
|
|
||||||
@@ -19,7 +19,7 @@ opt = OptionParser.new do |o|
|
|
||||||
o.on('--configure-exts=FILE') {|v| confexts = v}
|
|
||||||
o.order!(ARGV)
|
|
||||||
end
|
|
||||||
-confexts &&= File.read(confexts).scan(/^exts: (.*\.mk)/).flatten rescue nil
|
|
||||||
+confexts &&= File.read(confexts).scan(/^(?:ext|gem)s: (.*\.mk)/).flatten rescue nil
|
|
||||||
confexts ||= []
|
|
||||||
macros["old_extensions"] = []
|
|
||||||
|
|
||||||
@@ -30,7 +30,7 @@ Dir.glob("{ext,.bundle/gems}/*/exts.mk") do |e|
|
|
||||||
s.scan(/^(extensions|SUBMAKEOPTS|EXT[A-Z]+|MFLAGS|NOTE_[A-Z]+)[ \t]*=[ \t]*(#{contpat})$/o) do |n, v|
|
|
||||||
v.gsub!(/\\\n[ \t]*/, ' ')
|
|
||||||
next if v.empty?
|
|
||||||
- next if gem and n != "extensions"
|
|
||||||
+ next if n != "extensions"
|
|
||||||
n = "old_extensions" if n == "extensions" and !confexts.include?(e)
|
|
||||||
v = v.split
|
|
||||||
m = macros[n] ||= []
|
|
||||||
|
|
||||||
From be9d00ee7c72766551ba8c3530f1538034498a6a Mon Sep 17 00:00:00 2001
|
|
||||||
From: Nobuyoshi Nakada <nobu@ruby-lang.org>
|
|
||||||
Date: Wed, 6 Apr 2022 20:28:00 +0900
|
|
||||||
Subject: [PATCH 3/5] Move the target directory of bundled gems like as
|
|
||||||
rubygems
|
|
||||||
|
|
||||||
---
|
|
||||||
ext/extmk.rb | 6 +++++-
|
|
||||||
1 file changed, 5 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/ext/extmk.rb b/ext/extmk.rb
|
|
||||||
index 1da9e2704521..a440af27fc5d 100755
|
|
||||||
--- a/ext/extmk.rb
|
|
||||||
+++ b/ext/extmk.rb
|
|
||||||
@@ -2,6 +2,9 @@
|
|
||||||
# -*- mode: ruby; coding: us-ascii -*-
|
|
||||||
# frozen_string_literal: false
|
|
||||||
|
|
||||||
+module Gem; end # only needs Gem::Platform
|
|
||||||
+require 'rubygems/platform'
|
|
||||||
+
|
|
||||||
# :stopdoc:
|
|
||||||
$extension = nil
|
|
||||||
$extstatic = nil
|
|
||||||
@@ -535,11 +538,12 @@ def create_makefile(*args, &block)
|
|
||||||
super(*args) do |conf|
|
|
||||||
conf.find do |s|
|
|
||||||
s.sub!(/^(TARGET_SO_DIR *= *)\$\(RUBYARCHDIR\)/) {
|
|
||||||
- "TARGET_GEM_DIR = $(extout)/gems/$(arch)/#{@gemname}\n"\
|
|
||||||
+ "TARGET_GEM_DIR = $(topdir)/.bundle/extensions/$(gem_platform)/$(ruby_version)/#{@gemname}\n"\
|
|
||||||
"#{$1}$(TARGET_GEM_DIR)$(target_prefix)"
|
|
||||||
}
|
|
||||||
end
|
|
||||||
conf.any? {|s| /^TARGET *= *\S/ =~ s} and conf << %{
|
|
||||||
+gem_platform = #{Gem::Platform.local}
|
|
||||||
|
|
||||||
# default target
|
|
||||||
all:
|
|
||||||
|
|
||||||
From c4daf8e445925695c34bab8bf5135dcd1e8575a3 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Nobuyoshi Nakada <nobu@ruby-lang.org>
|
|
||||||
Date: Wed, 6 Apr 2022 22:57:01 +0900
|
|
||||||
Subject: [PATCH 4/5] Obey spec file locations to rubygems
|
|
||||||
|
|
||||||
---
|
|
||||||
common.mk | 3 ++-
|
|
||||||
defs/gmake.mk | 2 +-
|
|
||||||
tool/gem-unpack.rb | 5 +++--
|
|
||||||
3 files changed, 6 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/common.mk b/common.mk
|
|
||||||
index 7c552cba1e04..b4adb2729c0e 100644
|
|
||||||
--- a/common.mk
|
|
||||||
+++ b/common.mk
|
|
||||||
@@ -1359,10 +1359,11 @@ extract-gems$(gnumake:yes=-nongnumake): PHONY
|
|
||||||
$(Q) $(RUNRUBY) -C "$(srcdir)" \
|
|
||||||
-Itool -rgem-unpack -answ \
|
|
||||||
-e 'BEGIN {FileUtils.mkdir_p(d = ".bundle/gems")}' \
|
|
||||||
+ -e 'BEGIN {FileUtils.mkdir_p(s = ".bundle/specifications")}' \
|
|
||||||
-e 'gem, ver = *$$F' \
|
|
||||||
-e 'next if !ver or /^#/=~gem' \
|
|
||||||
-e 'g = "#{gem}-#{ver}"' \
|
|
||||||
- -e 'File.directory?("#{d}/#{g}") or Gem.unpack("gems/#{g}.gem", d)' \
|
|
||||||
+ -e 'File.directory?("#{d}/#{g}") or Gem.unpack("gems/#{g}.gem", d, s)' \
|
|
||||||
gems/bundled_gems
|
|
||||||
|
|
||||||
update-bundled_gems: PHONY
|
|
||||||
diff --git a/defs/gmake.mk b/defs/gmake.mk
|
|
||||||
index a625379a6804..27e3e21cc4d6 100644
|
|
||||||
--- a/defs/gmake.mk
|
|
||||||
+++ b/defs/gmake.mk
|
|
||||||
@@ -290,7 +290,7 @@ extract-gems: | $(patsubst %,.bundle/gems/%,$(bundled-gems))
|
|
||||||
$(ECHO) Extracting bundle gem $*...
|
|
||||||
$(Q) $(BASERUBY) -C "$(srcdir)" \
|
|
||||||
-Itool -rgem-unpack \
|
|
||||||
- -e 'Gem.unpack("gems/$(@F).gem", ".bundle/gems")'
|
|
||||||
+ -e 'Gem.unpack("gems/$(@F).gem", ".bundle/gems", ".bundle/specifications")'
|
|
||||||
|
|
||||||
$(srcdir)/.bundle/gems:
|
|
||||||
$(MAKEDIRS) $@
|
|
||||||
diff --git a/tool/gem-unpack.rb b/tool/gem-unpack.rb
|
|
||||||
index cb05719463f2..fe10b0e420fa 100644
|
|
||||||
--- a/tool/gem-unpack.rb
|
|
||||||
+++ b/tool/gem-unpack.rb
|
|
||||||
@@ -5,13 +5,14 @@
|
|
||||||
# This library is used by "make extract-gems" to
|
|
||||||
# unpack bundled gem files.
|
|
||||||
|
|
||||||
-def Gem.unpack(file, dir = nil)
|
|
||||||
+def Gem.unpack(file, dir = nil, spec_dir = nil)
|
|
||||||
pkg = Gem::Package.new(file)
|
|
||||||
spec = pkg.spec
|
|
||||||
target = spec.full_name
|
|
||||||
target = File.join(dir, target) if dir
|
|
||||||
pkg.extract_files target
|
|
||||||
- spec_file = File.join(target, "#{spec.name}-#{spec.version}.gemspec")
|
|
||||||
+ FileUtils.mkdir_p(spec_dir ||= target)
|
|
||||||
+ spec_file = File.join(spec_dir, "#{spec.name}-#{spec.version}.gemspec")
|
|
||||||
open(spec_file, 'wb') do |f|
|
|
||||||
f.print spec.to_ruby
|
|
||||||
end
|
|
||||||
|
|
||||||
From 3de652d8198be9cd2998c095903889a80e738275 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Nobuyoshi Nakada <nobu@ruby-lang.org>
|
|
||||||
Date: Thu, 7 Apr 2022 01:44:43 +0900
|
|
||||||
Subject: [PATCH 5/5] Install built gem extension binaries
|
|
||||||
|
|
||||||
---
|
|
||||||
tool/rbinstall.rb | 56 ++++++++++++++---------------------------------
|
|
||||||
1 file changed, 16 insertions(+), 40 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/tool/rbinstall.rb b/tool/rbinstall.rb
|
|
||||||
index 9d9b672be472..624961b4eee6 100755
|
|
||||||
--- a/tool/rbinstall.rb
|
|
||||||
+++ b/tool/rbinstall.rb
|
|
||||||
@@ -858,6 +858,9 @@ class UnpackedInstaller < GemInstaller
|
|
||||||
def write_cache_file
|
|
||||||
end
|
|
||||||
|
|
||||||
+ def build_extensions
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
def shebang(bin_file_name)
|
|
||||||
path = File.join(gem_dir, spec.bindir, bin_file_name)
|
|
||||||
first_line = File.open(path, "rb") {|file| file.gets}
|
|
||||||
@@ -940,13 +943,12 @@ def ensure_writable_dir(dir)
|
|
||||||
install_default_gem('ext', srcdir, bindir)
|
|
||||||
end
|
|
||||||
|
|
||||||
-def load_gemspec(file, expanded = false)
|
|
||||||
+def load_gemspec(file, base = nil)
|
|
||||||
file = File.realpath(file)
|
|
||||||
code = File.read(file, encoding: "utf-8:-")
|
|
||||||
code.gsub!(/(?:`git[^\`]*`|%x\[git[^\]]*\])\.split\([^\)]*\)/m) do
|
|
||||||
files = []
|
|
||||||
- if expanded
|
|
||||||
- base = File.dirname(file)
|
|
||||||
+ if base
|
|
||||||
Dir.glob("**/*", File::FNM_DOTMATCH, base: base) do |n|
|
|
||||||
case File.basename(n); when ".", ".."; next; end
|
|
||||||
next if File.directory?(File.join(base, n))
|
|
||||||
@@ -959,7 +961,7 @@ def load_gemspec(file, expanded = false)
|
|
||||||
unless Gem::Specification === spec
|
|
||||||
raise TypeError, "[#{file}] isn't a Gem::Specification (#{spec.class} instead)."
|
|
||||||
end
|
|
||||||
- spec.loaded_from = file
|
|
||||||
+ spec.loaded_from = base ? File.join(base, File.basename(file)) : file
|
|
||||||
spec.files.reject! {|n| n.end_with?(".gemspec") or n.start_with?(".git")}
|
|
||||||
|
|
||||||
spec
|
|
||||||
@@ -1014,20 +1016,6 @@ def install_default_gem(dir, srcdir, bindir)
|
|
||||||
end
|
|
||||||
|
|
||||||
install?(:ext, :comm, :gem, :'bundled-gems') do
|
|
||||||
- if CONFIG['CROSS_COMPILING'] == 'yes'
|
|
||||||
- # The following hacky steps set "$ruby = BASERUBY" in tool/fake.rb
|
|
||||||
- $hdrdir = ''
|
|
||||||
- $extmk = nil
|
|
||||||
- $ruby = nil # ...
|
|
||||||
- ruby_path = $ruby + " -I#{Dir.pwd}" # $baseruby + " -I#{Dir.pwd}"
|
|
||||||
- else
|
|
||||||
- # ruby_path = File.expand_path(with_destdir(File.join(bindir, ruby_install_name)))
|
|
||||||
- ENV['RUBYLIB'] = nil
|
|
||||||
- ENV['RUBYOPT'] = nil
|
|
||||||
- ruby_path = File.expand_path(with_destdir(File.join(bindir, ruby_install_name))) + " --disable=gems -I#{with_destdir(archlibdir)}"
|
|
||||||
- end
|
|
||||||
- Gem.instance_variable_set(:@ruby, ruby_path) if Gem.ruby != ruby_path
|
|
||||||
-
|
|
||||||
gem_dir = Gem.default_dir
|
|
||||||
install_dir = with_destdir(gem_dir)
|
|
||||||
prepare "bundled gems", gem_dir
|
|
||||||
@@ -1047,40 +1035,28 @@ def install_default_gem(dir, srcdir, bindir)
|
|
||||||
:wrappers => true,
|
|
||||||
:format_executable => true,
|
|
||||||
}
|
|
||||||
- gem_ext_dir = "#$extout/gems/#{CONFIG['arch']}"
|
|
||||||
- extensions_dir = with_destdir(Gem::StubSpecification.gemspec_stub("", gem_dir, gem_dir).extensions_dir)
|
|
||||||
+
|
|
||||||
+ extensions_dir = Gem::StubSpecification.gemspec_stub("", gem_dir, gem_dir).extensions_dir
|
|
||||||
+ specifications_dir = File.join(gem_dir, "specifications")
|
|
||||||
+ build_dir = Gem::StubSpecification.gemspec_stub("", ".bundle", ".bundle").extensions_dir
|
|
||||||
|
|
||||||
File.foreach("#{srcdir}/gems/bundled_gems") do |name|
|
|
||||||
next if /^\s*(?:#|$)/ =~ name
|
|
||||||
next unless /^(\S+)\s+(\S+).*/ =~ name
|
|
||||||
gem_name = "#$1-#$2"
|
|
||||||
- path = "#{srcdir}/.bundle/gems/#{gem_name}/#{gem_name}.gemspec"
|
|
||||||
- if File.exist?(path)
|
|
||||||
- spec = load_gemspec(path)
|
|
||||||
- else
|
|
||||||
- path = "#{srcdir}/.bundle/gems/#{gem_name}/#$1.gemspec"
|
|
||||||
- next unless File.exist?(path)
|
|
||||||
- spec = load_gemspec(path, true)
|
|
||||||
- end
|
|
||||||
+ path = "#{srcdir}/.bundle/specifications/#{gem_name}.gemspec"
|
|
||||||
+ next unless File.exist?(path)
|
|
||||||
+ spec = load_gemspec(path, "#{srcdir}/.bundle/gems/#{gem_name}")
|
|
||||||
next unless spec.platform == Gem::Platform::RUBY
|
|
||||||
next unless spec.full_name == gem_name
|
|
||||||
- if !spec.extensions.empty? && CONFIG["EXTSTATIC"] == "static"
|
|
||||||
- puts "skip installation of #{spec.name} #{spec.version}; bundled gem with an extension library is not supported on --with-static-linked-ext"
|
|
||||||
- next
|
|
||||||
- end
|
|
||||||
spec.extension_dir = "#{extensions_dir}/#{spec.full_name}"
|
|
||||||
- if File.directory?(ext = "#{gem_ext_dir}/#{spec.full_name}")
|
|
||||||
- spec.extensions[0] ||= "-"
|
|
||||||
- end
|
|
||||||
package = RbInstall::DirPackage.new spec
|
|
||||||
ins = RbInstall::UnpackedInstaller.new(package, options)
|
|
||||||
puts "#{INDENT}#{spec.name} #{spec.version}"
|
|
||||||
ins.install
|
|
||||||
- unless $dryrun
|
|
||||||
- File.chmod($data_mode, File.join(install_dir, "specifications", "#{spec.full_name}.gemspec"))
|
|
||||||
- end
|
|
||||||
- unless spec.extensions.empty?
|
|
||||||
- install_recursive(ext, spec.extension_dir)
|
|
||||||
+ install_recursive("#{build_dir}/#{gem_name}", "#{extensions_dir}/#{gem_name}") do |src, dest|
|
|
||||||
+ # puts "#{INDENT} #{dest[extensions_dir.size+gem_name.size+2..-1]}"
|
|
||||||
+ install src, dest, :mode => (File.executable?(src) ? $prog_mode : $data_mode)
|
|
||||||
end
|
|
||||||
installed_gems[spec.full_name] = true
|
|
||||||
end
|
|
|
@ -1,256 +0,0 @@
|
||||||
From 4d9cc9afa47981520d991d19fd78b322f1ba9f2a Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jarek Prokop <jprokop@redhat.com>
|
|
||||||
Date: Wed, 22 Jun 2022 01:03:49 +0200
|
|
||||||
Subject: [PATCH] Detect compaction support during runtime.
|
|
||||||
|
|
||||||
The patch is created by backporting 3 commits from
|
|
||||||
the upstream Ruby master branch in the chronological order below.
|
|
||||||
|
|
||||||
https://github.com/ruby/ruby/commit/52d42e702375446746164a0251e1a10bce813b78
|
|
||||||
https://github.com/ruby/ruby/commit/79eaaf2d0b641710613f16525e4b4c439dfe854e
|
|
||||||
https://github.com/ruby/ruby/commit/2c190863239bee3f54cfb74b16bb6ea4cae6ed20
|
|
||||||
|
|
||||||
== How to create this patch ==
|
|
||||||
|
|
||||||
Download Ruby source code.
|
|
||||||
```
|
|
||||||
$ git clone https://github.com/ruby/ruby.git
|
|
||||||
$ cd ruby
|
|
||||||
```
|
|
||||||
|
|
||||||
First create a commit squashed from the 3 commits above.
|
|
||||||
Checkout the second commmit above, and create a temporary branch.
|
|
||||||
```
|
|
||||||
$ git checkout 79eaaf2d0b641710613f16525e4b4c439dfe854e
|
|
||||||
$ git checkout -b wip/detect-compaction-runtime-tmp
|
|
||||||
```
|
|
||||||
|
|
||||||
Cherry pick the third commit on the second commit.
|
|
||||||
```
|
|
||||||
$ git cherry-pick 2c190863239bee3f54cfb74b16bb6ea4cae6ed20
|
|
||||||
```
|
|
||||||
|
|
||||||
Squash the last 3 commits on the branch.
|
|
||||||
```
|
|
||||||
$ git rebase -i 2223eb082afa6d05321b69df783d4133b9aacba6
|
|
||||||
```
|
|
||||||
|
|
||||||
Then checkout Ruby 3.1.2 branch.
|
|
||||||
Create a new branch.
|
|
||||||
Merge the Fedora Ruby's
|
|
||||||
ruby-3.2.0-define-unsupported-gc-compaction-methods-as-rb_f_notimplement.patch.
|
|
||||||
```
|
|
||||||
$ git checkout v3_1_2
|
|
||||||
$ git checkout -b wip/detect-compaction-runtime
|
|
||||||
$ patch -p1 <
|
|
||||||
~/fed/ruby/ruby-3.2.0-define-unsupported-gc-compaction-methods-as-rb_f_notimplement.patch
|
|
||||||
$ git add gc.c gc.rb test/ruby/test_gc_compact.rb
|
|
||||||
$ git commit
|
|
||||||
```
|
|
||||||
|
|
||||||
Merge the squashed one commit on the
|
|
||||||
`wip/detect-compaction-runtime-tmp` branch
|
|
||||||
into the `wip/detect-compaction-runtime` branch.
|
|
||||||
```
|
|
||||||
$ git cherry-pick <the squashed commit above>
|
|
||||||
```
|
|
||||||
|
|
||||||
Fix conflicts seeing the difference by `git show <the squashed commit
|
|
||||||
above>`
|
|
||||||
on another terminal.
|
|
||||||
```
|
|
||||||
$ vi gc.c
|
|
||||||
$ git add gc.c
|
|
||||||
$ git commit
|
|
||||||
```
|
|
||||||
|
|
||||||
== Original commit messages ==
|
|
||||||
|
|
||||||
This is a combination of 3 commits.
|
|
||||||
This is the 1st commit message:
|
|
||||||
~~~
|
|
||||||
Rename GC_COMPACTION_SUPPORTED
|
|
||||||
|
|
||||||
Naming this macro GC_COMPACTION_SUPPORTED is misleading because it
|
|
||||||
only checks whether compaction is supported at compile time.
|
|
||||||
|
|
||||||
[Bug #18829]
|
|
||||||
~~~
|
|
||||||
|
|
||||||
This is the commit message #2:
|
|
||||||
~~~
|
|
||||||
Include runtime checks for compaction support
|
|
||||||
|
|
||||||
Commit 0c36ba53192c5a0d245c9b626e4346a32d7d144e changed GC compaction
|
|
||||||
methods to not be implemented when not supported. However, that commit
|
|
||||||
only does compile time checks (which currently only checks for WASM),
|
|
||||||
but there are additional compaction support checks during run time.
|
|
||||||
|
|
||||||
This commit changes it so that GC compaction methods aren't defined
|
|
||||||
during run time if the platform does not support GC compaction.
|
|
||||||
|
|
||||||
[Bug #18829]
|
|
||||||
~~~
|
|
||||||
|
|
||||||
This is the commit message #3:
|
|
||||||
~~~
|
|
||||||
Suppress code unused unless GC_CAN_COMPILE_COMPACTION
|
|
||||||
~~~
|
|
||||||
---
|
|
||||||
gc.c | 63 +++++++++++++++++++++++++++++++++++++++++-------------------
|
|
||||||
1 file changed, 43 insertions(+), 20 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/gc.c b/gc.c
|
|
||||||
index 1c35856c44..bff0666a17 100644
|
|
||||||
--- a/gc.c
|
|
||||||
+++ b/gc.c
|
|
||||||
@@ -4980,6 +4980,23 @@ gc_unprotect_pages(rb_objspace_t *objspace, rb_heap_t *heap)
|
|
||||||
static void gc_update_references(rb_objspace_t * objspace);
|
|
||||||
static void invalidate_moved_page(rb_objspace_t *objspace, struct heap_page *page);
|
|
||||||
|
|
||||||
+#ifndef GC_CAN_COMPILE_COMPACTION
|
|
||||||
+#if defined(__wasi__) /* WebAssembly doesn't support signals */
|
|
||||||
+# define GC_CAN_COMPILE_COMPACTION 0
|
|
||||||
+#else
|
|
||||||
+# define GC_CAN_COMPILE_COMPACTION 1
|
|
||||||
+#endif
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+#if defined(__MINGW32__) || defined(_WIN32)
|
|
||||||
+# define GC_COMPACTION_SUPPORTED 1
|
|
||||||
+#else
|
|
||||||
+/* If not MinGW, Windows, or does not have mmap, we cannot use mprotect for
|
|
||||||
+ * the read barrier, so we must disable compaction. */
|
|
||||||
+# define GC_COMPACTION_SUPPORTED (GC_CAN_COMPILE_COMPACTION && USE_MMAP_ALIGNED_ALLOC)
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
+#if GC_CAN_COMPILE_COMPACTION
|
|
||||||
static void
|
|
||||||
read_barrier_handler(uintptr_t address)
|
|
||||||
{
|
|
||||||
@@ -5000,6 +5017,7 @@ read_barrier_handler(uintptr_t address)
|
|
||||||
}
|
|
||||||
RB_VM_LOCK_LEAVE();
|
|
||||||
}
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
#if defined(_WIN32)
|
|
||||||
static LPTOP_LEVEL_EXCEPTION_FILTER old_handler;
|
|
||||||
@@ -9250,13 +9268,7 @@ gc_start_internal(rb_execution_context_t *ec, VALUE self, VALUE full_mark, VALUE
|
|
||||||
|
|
||||||
/* For now, compact implies full mark / sweep, so ignore other flags */
|
|
||||||
if (RTEST(compact)) {
|
|
||||||
- /* If not MinGW, Windows, or does not have mmap, we cannot use mprotect for
|
|
||||||
- * the read barrier, so we must disable compaction. */
|
|
||||||
-#if !defined(__MINGW32__) && !defined(_WIN32)
|
|
||||||
- if (!USE_MMAP_ALIGNED_ALLOC) {
|
|
||||||
- rb_raise(rb_eNotImpError, "Compaction isn't available on this platform");
|
|
||||||
- }
|
|
||||||
-#endif
|
|
||||||
+ GC_ASSERT(GC_COMPACTION_SUPPORTED);
|
|
||||||
|
|
||||||
reason |= GPR_FLAG_COMPACT;
|
|
||||||
}
|
|
||||||
@@ -9421,7 +9433,7 @@ gc_move(rb_objspace_t *objspace, VALUE scan, VALUE free, size_t slot_size)
|
|
||||||
return (VALUE)src;
|
|
||||||
}
|
|
||||||
|
|
||||||
-#if GC_COMPACTION_SUPPORTED
|
|
||||||
+#if GC_CAN_COMPILE_COMPACTION
|
|
||||||
static int
|
|
||||||
compare_free_slots(const void *left, const void *right, void *dummy)
|
|
||||||
{
|
|
||||||
@@ -10149,7 +10161,7 @@ gc_update_references(rb_objspace_t *objspace)
|
|
||||||
gc_update_table_refs(objspace, finalizer_table);
|
|
||||||
}
|
|
||||||
|
|
||||||
-#if GC_COMPACTION_SUPPORTED
|
|
||||||
+#if GC_CAN_COMPILE_COMPACTION
|
|
||||||
/*
|
|
||||||
* call-seq:
|
|
||||||
* GC.latest_compact_info -> {:considered=>{:T_CLASS=>11}, :moved=>{:T_CLASS=>11}}
|
|
||||||
@@ -10190,7 +10202,7 @@ gc_compact_stats(VALUE self)
|
|
||||||
# define gc_compact_stats rb_f_notimplement
|
|
||||||
#endif
|
|
||||||
|
|
||||||
-#if GC_COMPACTION_SUPPORTED
|
|
||||||
+#if GC_CAN_COMPILE_COMPACTION
|
|
||||||
static void
|
|
||||||
root_obj_check_moved_i(const char *category, VALUE obj, void *data)
|
|
||||||
{
|
|
||||||
@@ -10269,7 +10281,7 @@ gc_compact(VALUE self)
|
|
||||||
# define gc_compact rb_f_notimplement
|
|
||||||
#endif
|
|
||||||
|
|
||||||
-#if GC_COMPACTION_SUPPORTED
|
|
||||||
+#if GC_CAN_COMPILE_COMPACTION
|
|
||||||
/*
|
|
||||||
* call-seq:
|
|
||||||
* GC.verify_compaction_references(toward: nil, double_heap: false) -> hash
|
|
||||||
@@ -10800,7 +10812,7 @@ gc_disable(rb_execution_context_t *ec, VALUE _)
|
|
||||||
return rb_gc_disable();
|
|
||||||
}
|
|
||||||
|
|
||||||
-#if GC_COMPACTION_SUPPORTED
|
|
||||||
+#if GC_CAN_COMPILE_COMPACTION
|
|
||||||
/*
|
|
||||||
* call-seq:
|
|
||||||
* GC.auto_compact = flag
|
|
||||||
@@ -10814,8 +10826,7 @@ gc_disable(rb_execution_context_t *ec, VALUE _)
|
|
||||||
static VALUE
|
|
||||||
gc_set_auto_compact(VALUE _, VALUE v)
|
|
||||||
{
|
|
||||||
- /* If not MinGW, Windows, or does not have mmap, we cannot use mprotect for
|
|
||||||
- * the read barrier, so we must disable automatic compaction. */
|
|
||||||
+ GC_ASSERT(GC_COMPACTION_SUPPORTED);
|
|
||||||
|
|
||||||
ruby_enable_autocompact = RTEST(v);
|
|
||||||
return v;
|
|
||||||
@@ -10824,7 +10835,8 @@ gc_set_auto_compact(VALUE _, VALUE v)
|
|
||||||
# define gc_set_auto_compact rb_f_notimplement
|
|
||||||
#endif
|
|
||||||
|
|
||||||
-#if GC_COMPACTION_SUPPORTED
|
|
||||||
+
|
|
||||||
+#if GC_CAN_COMPILE_COMPACTION
|
|
||||||
/*
|
|
||||||
* call-seq:
|
|
||||||
* GC.auto_compact -> true or false
|
|
||||||
@@ -13696,11 +13708,21 @@ Init_GC(void)
|
|
||||||
rb_define_singleton_method(rb_mGC, "malloc_allocated_size", gc_malloc_allocated_size, 0);
|
|
||||||
rb_define_singleton_method(rb_mGC, "malloc_allocations", gc_malloc_allocations, 0);
|
|
||||||
#endif
|
|
||||||
- rb_define_singleton_method(rb_mGC, "compact", gc_compact, 0);
|
|
||||||
- rb_define_singleton_method(rb_mGC, "auto_compact", gc_get_auto_compact, 0);
|
|
||||||
- rb_define_singleton_method(rb_mGC, "auto_compact=", gc_set_auto_compact, 1);
|
|
||||||
- rb_define_singleton_method(rb_mGC, "latest_compact_info", gc_compact_stats, 0);
|
|
||||||
- rb_define_singleton_method(rb_mGC, "verify_compaction_references", gc_verify_compaction_references, -1);
|
|
||||||
+ if (GC_COMPACTION_SUPPORTED) {
|
|
||||||
+ rb_define_singleton_method(rb_mGC, "compact", gc_compact, 0);
|
|
||||||
+ rb_define_singleton_method(rb_mGC, "auto_compact", gc_get_auto_compact, 0);
|
|
||||||
+ rb_define_singleton_method(rb_mGC, "auto_compact=", gc_set_auto_compact, 1);
|
|
||||||
+ rb_define_singleton_method(rb_mGC, "latest_compact_info", gc_compact_stats, 0);
|
|
||||||
+ rb_define_singleton_method(rb_mGC, "verify_compaction_references", gc_verify_compaction_references, -1);
|
|
||||||
+ }
|
|
||||||
+ else {
|
|
||||||
+ rb_define_singleton_method(rb_mGC, "compact", rb_f_notimplement, 0);
|
|
||||||
+ rb_define_singleton_method(rb_mGC, "auto_compact", rb_f_notimplement, 0);
|
|
||||||
+ rb_define_singleton_method(rb_mGC, "auto_compact=", rb_f_notimplement, 1);
|
|
||||||
+ rb_define_singleton_method(rb_mGC, "latest_compact_info", rb_f_notimplement, 0);
|
|
||||||
+ /* When !GC_COMPACTION_SUPPORTED, this method is not defined in gc.rb */
|
|
||||||
+ rb_define_singleton_method(rb_mGC, "verify_compaction_references", rb_f_notimplement, -1);
|
|
||||||
+ }
|
|
||||||
|
|
||||||
#if GC_DEBUG_STRESS_TO_CLASS
|
|
||||||
rb_define_singleton_method(rb_mGC, "add_stress_to_class", rb_gcdebug_add_stress_to_class, -1);
|
|
||||||
@@ -13724,6 +13746,7 @@ Init_GC(void)
|
|
||||||
OPT(MALLOC_ALLOCATED_SIZE);
|
|
||||||
OPT(MALLOC_ALLOCATED_SIZE_CHECK);
|
|
||||||
OPT(GC_PROFILE_DETAIL_MEMORY);
|
|
||||||
+ OPT(GC_COMPACTION_SUPPORTED);
|
|
||||||
#undef OPT
|
|
||||||
OBJ_FREEZE(opts);
|
|
||||||
}
|
|
||||||
--
|
|
||||||
2.36.1
|
|
||||||
|
|
|
@ -1,402 +0,0 @@
|
||||||
commit 6d1ca6737f31b2e24664a093f1827dd74a121a9f
|
|
||||||
Author: Jarek Prokop <jprokop@redhat.com>
|
|
||||||
Date: Thu May 26 11:28:13 2022 +0200
|
|
||||||
|
|
||||||
Gc ppc64le fix
|
|
||||||
|
|
||||||
diff --git a/gc.c b/gc.c
|
|
||||||
index ef9327df1f..1c35856c44 100644
|
|
||||||
--- a/gc.c
|
|
||||||
+++ b/gc.c
|
|
||||||
@@ -9421,6 +9421,7 @@ gc_move(rb_objspace_t *objspace, VALUE scan, VALUE free, size_t slot_size)
|
|
||||||
return (VALUE)src;
|
|
||||||
}
|
|
||||||
|
|
||||||
+#if GC_COMPACTION_SUPPORTED
|
|
||||||
static int
|
|
||||||
compare_free_slots(const void *left, const void *right, void *dummy)
|
|
||||||
{
|
|
||||||
@@ -9468,6 +9469,7 @@ gc_sort_heap_by_empty_slots(rb_objspace_t *objspace)
|
|
||||||
free(page_list);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
static void
|
|
||||||
gc_ref_update_array(rb_objspace_t * objspace, VALUE v)
|
|
||||||
@@ -10147,8 +10149,21 @@ gc_update_references(rb_objspace_t *objspace)
|
|
||||||
gc_update_table_refs(objspace, finalizer_table);
|
|
||||||
}
|
|
||||||
|
|
||||||
+#if GC_COMPACTION_SUPPORTED
|
|
||||||
+/*
|
|
||||||
+ * call-seq:
|
|
||||||
+ * GC.latest_compact_info -> {:considered=>{:T_CLASS=>11}, :moved=>{:T_CLASS=>11}}
|
|
||||||
+ *
|
|
||||||
+ * Returns information about object moved in the most recent GC compaction.
|
|
||||||
+ *
|
|
||||||
+ * The returned hash has two keys :considered and :moved. The hash for
|
|
||||||
+ * :considered lists the number of objects that were considered for movement
|
|
||||||
+ * by the compactor, and the :moved hash lists the number of objects that
|
|
||||||
+ * were actually moved. Some objects can't be moved (maybe they were pinned)
|
|
||||||
+ * so these numbers can be used to calculate compaction efficiency.
|
|
||||||
+ */
|
|
||||||
static VALUE
|
|
||||||
-gc_compact_stats(rb_execution_context_t *ec, VALUE self)
|
|
||||||
+gc_compact_stats(VALUE self)
|
|
||||||
{
|
|
||||||
size_t i;
|
|
||||||
rb_objspace_t *objspace = &rb_objspace;
|
|
||||||
@@ -10171,7 +10186,11 @@ gc_compact_stats(rb_execution_context_t *ec, VALUE self)
|
|
||||||
|
|
||||||
return h;
|
|
||||||
}
|
|
||||||
+#else
|
|
||||||
+# define gc_compact_stats rb_f_notimplement
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
+#if GC_COMPACTION_SUPPORTED
|
|
||||||
static void
|
|
||||||
root_obj_check_moved_i(const char *category, VALUE obj, void *data)
|
|
||||||
{
|
|
||||||
@@ -10221,22 +10240,78 @@ heap_check_moved_i(void *vstart, void *vend, size_t stride, void *data)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
+/*
|
|
||||||
+ * call-seq:
|
|
||||||
+ * GC.compact
|
|
||||||
+ *
|
|
||||||
+ * This function compacts objects together in Ruby's heap. It eliminates
|
|
||||||
+ * unused space (or fragmentation) in the heap by moving objects in to that
|
|
||||||
+ * unused space. This function returns a hash which contains statistics about
|
|
||||||
+ * which objects were moved. See `GC.latest_gc_info` for details about
|
|
||||||
+ * compaction statistics.
|
|
||||||
+ *
|
|
||||||
+ * This method is implementation specific and not expected to be implemented
|
|
||||||
+ * in any implementation besides MRI.
|
|
||||||
+ *
|
|
||||||
+ * To test whether GC compaction is supported, use the idiom:
|
|
||||||
+ *
|
|
||||||
+ * GC.respond_to?(:compact)
|
|
||||||
+ */
|
|
||||||
static VALUE
|
|
||||||
-gc_compact(rb_execution_context_t *ec, VALUE self)
|
|
||||||
+gc_compact(VALUE self)
|
|
||||||
{
|
|
||||||
/* Run GC with compaction enabled */
|
|
||||||
- gc_start_internal(ec, self, Qtrue, Qtrue, Qtrue, Qtrue);
|
|
||||||
+ gc_start_internal(NULL, self, Qtrue, Qtrue, Qtrue, Qtrue);
|
|
||||||
|
|
||||||
- return gc_compact_stats(ec, self);
|
|
||||||
+ return gc_compact_stats(self);
|
|
||||||
}
|
|
||||||
+#else
|
|
||||||
+# define gc_compact rb_f_notimplement
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
+#if GC_COMPACTION_SUPPORTED
|
|
||||||
+/*
|
|
||||||
+ * call-seq:
|
|
||||||
+ * GC.verify_compaction_references(toward: nil, double_heap: false) -> hash
|
|
||||||
+ *
|
|
||||||
+ * Verify compaction reference consistency.
|
|
||||||
+ *
|
|
||||||
+ * This method is implementation specific. During compaction, objects that
|
|
||||||
+ * were moved are replaced with T_MOVED objects. No object should have a
|
|
||||||
+ * reference to a T_MOVED object after compaction.
|
|
||||||
+ *
|
|
||||||
+ * This function doubles the heap to ensure room to move all objects,
|
|
||||||
+ * compacts the heap to make sure everything moves, updates all references,
|
|
||||||
+ * then performs a full GC. If any object contains a reference to a T_MOVED
|
|
||||||
+ * object, that object should be pushed on the mark stack, and will
|
|
||||||
+ * make a SEGV.
|
|
||||||
+ */
|
|
||||||
static VALUE
|
|
||||||
-gc_verify_compaction_references(rb_execution_context_t *ec, VALUE self, VALUE double_heap, VALUE toward_empty)
|
|
||||||
+gc_verify_compaction_references(int argc, VALUE *argv, VALUE self)
|
|
||||||
{
|
|
||||||
rb_objspace_t *objspace = &rb_objspace;
|
|
||||||
+ VALUE kwargs, double_heap = Qfalse, toward_empty = Qfalse;
|
|
||||||
+ static ID id_toward, id_double_heap, id_empty;
|
|
||||||
+
|
|
||||||
+ if (!id_toward) {
|
|
||||||
+ id_toward = rb_intern("toward");
|
|
||||||
+ id_double_heap = rb_intern("double_heap");
|
|
||||||
+ id_empty = rb_intern("empty");
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
+ rb_scan_args(argc, argv, ":", &kwargs);
|
|
||||||
+ if (!NIL_P(kwargs)) {
|
|
||||||
+ if (rb_hash_has_key(kwargs, ID2SYM(id_toward))) {
|
|
||||||
+ VALUE toward = rb_hash_aref(kwargs, ID2SYM(id_toward));
|
|
||||||
+ toward_empty = (toward == ID2SYM(id_empty)) ? Qtrue : Qfalse;
|
|
||||||
+ }
|
|
||||||
+ if (rb_hash_has_key(kwargs, ID2SYM(id_double_heap))) {
|
|
||||||
+ double_heap = rb_hash_aref(kwargs, ID2SYM(id_double_heap));
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
|
|
||||||
/* Clear the heap. */
|
|
||||||
- gc_start_internal(ec, self, Qtrue, Qtrue, Qtrue, Qfalse);
|
|
||||||
+ gc_start_internal(NULL, self, Qtrue, Qtrue, Qtrue, Qfalse);
|
|
||||||
|
|
||||||
RB_VM_LOCK_ENTER();
|
|
||||||
{
|
|
||||||
@@ -10256,13 +10331,16 @@ gc_verify_compaction_references(rb_execution_context_t *ec, VALUE self, VALUE do
|
|
||||||
}
|
|
||||||
RB_VM_LOCK_LEAVE();
|
|
||||||
|
|
||||||
- gc_start_internal(ec, self, Qtrue, Qtrue, Qtrue, Qtrue);
|
|
||||||
+ gc_start_internal(NULL, self, Qtrue, Qtrue, Qtrue, Qtrue);
|
|
||||||
|
|
||||||
objspace_reachable_objects_from_root(objspace, root_obj_check_moved_i, NULL);
|
|
||||||
objspace_each_objects(objspace, heap_check_moved_i, NULL, TRUE);
|
|
||||||
|
|
||||||
- return gc_compact_stats(ec, self);
|
|
||||||
+ return gc_compact_stats(self);
|
|
||||||
}
|
|
||||||
+#else
|
|
||||||
+# define gc_verify_compaction_references rb_f_notimplement
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
VALUE
|
|
||||||
rb_gc_start(void)
|
|
||||||
@@ -10722,26 +10800,45 @@ gc_disable(rb_execution_context_t *ec, VALUE _)
|
|
||||||
return rb_gc_disable();
|
|
||||||
}
|
|
||||||
|
|
||||||
+#if GC_COMPACTION_SUPPORTED
|
|
||||||
+/*
|
|
||||||
+ * call-seq:
|
|
||||||
+ * GC.auto_compact = flag
|
|
||||||
+ *
|
|
||||||
+ * Updates automatic compaction mode.
|
|
||||||
+ *
|
|
||||||
+ * When enabled, the compactor will execute on every major collection.
|
|
||||||
+ *
|
|
||||||
+ * Enabling compaction will degrade performance on major collections.
|
|
||||||
+ */
|
|
||||||
static VALUE
|
|
||||||
-gc_set_auto_compact(rb_execution_context_t *ec, VALUE _, VALUE v)
|
|
||||||
+gc_set_auto_compact(VALUE _, VALUE v)
|
|
||||||
{
|
|
||||||
/* If not MinGW, Windows, or does not have mmap, we cannot use mprotect for
|
|
||||||
* the read barrier, so we must disable automatic compaction. */
|
|
||||||
-#if !defined(__MINGW32__) && !defined(_WIN32)
|
|
||||||
- if (!USE_MMAP_ALIGNED_ALLOC) {
|
|
||||||
- rb_raise(rb_eNotImpError, "Automatic compaction isn't available on this platform");
|
|
||||||
- }
|
|
||||||
-#endif
|
|
||||||
|
|
||||||
ruby_enable_autocompact = RTEST(v);
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
+#else
|
|
||||||
+# define gc_set_auto_compact rb_f_notimplement
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
+#if GC_COMPACTION_SUPPORTED
|
|
||||||
+/*
|
|
||||||
+ * call-seq:
|
|
||||||
+ * GC.auto_compact -> true or false
|
|
||||||
+ *
|
|
||||||
+ * Returns whether or not automatic compaction has been enabled.
|
|
||||||
+ */
|
|
||||||
static VALUE
|
|
||||||
-gc_get_auto_compact(rb_execution_context_t *ec, VALUE _)
|
|
||||||
+gc_get_auto_compact(VALUE _)
|
|
||||||
{
|
|
||||||
return RBOOL(ruby_enable_autocompact);
|
|
||||||
}
|
|
||||||
+#else
|
|
||||||
+# define gc_get_auto_compact rb_f_notimplement
|
|
||||||
+#endif
|
|
||||||
|
|
||||||
static int
|
|
||||||
get_envparam_size(const char *name, size_t *default_value, size_t lower_bound)
|
|
||||||
@@ -13599,6 +13696,11 @@ Init_GC(void)
|
|
||||||
rb_define_singleton_method(rb_mGC, "malloc_allocated_size", gc_malloc_allocated_size, 0);
|
|
||||||
rb_define_singleton_method(rb_mGC, "malloc_allocations", gc_malloc_allocations, 0);
|
|
||||||
#endif
|
|
||||||
+ rb_define_singleton_method(rb_mGC, "compact", gc_compact, 0);
|
|
||||||
+ rb_define_singleton_method(rb_mGC, "auto_compact", gc_get_auto_compact, 0);
|
|
||||||
+ rb_define_singleton_method(rb_mGC, "auto_compact=", gc_set_auto_compact, 1);
|
|
||||||
+ rb_define_singleton_method(rb_mGC, "latest_compact_info", gc_compact_stats, 0);
|
|
||||||
+ rb_define_singleton_method(rb_mGC, "verify_compaction_references", gc_verify_compaction_references, -1);
|
|
||||||
|
|
||||||
#if GC_DEBUG_STRESS_TO_CLASS
|
|
||||||
rb_define_singleton_method(rb_mGC, "add_stress_to_class", rb_gcdebug_add_stress_to_class, -1);
|
|
||||||
diff --git a/test/ruby/test_gc_compact.rb b/test/ruby/test_gc_compact.rb
|
|
||||||
index 42ad028530..411d5eab69 100644
|
|
||||||
--- a/test/ruby/test_gc_compact.rb
|
|
||||||
+++ b/test/ruby/test_gc_compact.rb
|
|
||||||
@@ -9,14 +9,7 @@
|
|
||||||
end
|
|
||||||
|
|
||||||
class TestGCCompact < Test::Unit::TestCase
|
|
||||||
- module SupportsCompact
|
|
||||||
- def setup
|
|
||||||
- skip "autocompact not supported on this platform" unless supports_auto_compact?
|
|
||||||
- super
|
|
||||||
- end
|
|
||||||
-
|
|
||||||
- private
|
|
||||||
-
|
|
||||||
+ module CompactionSupportInspector
|
|
||||||
def supports_auto_compact?
|
|
||||||
return true unless defined?(Etc::SC_PAGE_SIZE)
|
|
||||||
|
|
||||||
@@ -30,10 +23,19 @@ def supports_auto_compact?
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
- include SupportsCompact
|
|
||||||
+ module OmitUnlessCompactSupported
|
|
||||||
+ include CompactionSupportInspector
|
|
||||||
+
|
|
||||||
+ def setup
|
|
||||||
+ omit "autocompact not supported on this platform" unless supports_auto_compact?
|
|
||||||
+ super
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ include OmitUnlessCompactSupported
|
|
||||||
|
|
||||||
class AutoCompact < Test::Unit::TestCase
|
|
||||||
- include SupportsCompact
|
|
||||||
+ include OmitUnlessCompactSupported
|
|
||||||
|
|
||||||
def test_enable_autocompact
|
|
||||||
before = GC.auto_compact
|
|
||||||
@@ -87,13 +89,39 @@ def test_implicit_compaction_does_something
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
- def os_page_size
|
|
||||||
- return true unless defined?(Etc::SC_PAGE_SIZE)
|
|
||||||
+ class CompactMethodsNotImplemented < Test::Unit::TestCase
|
|
||||||
+ include CompactionSupportInspector
|
|
||||||
+
|
|
||||||
+ def assert_not_implemented(method, *args)
|
|
||||||
+ omit "autocompact is supported on this platform" if supports_auto_compact?
|
|
||||||
+
|
|
||||||
+ assert_raise(NotImplementedError) { GC.send(method, *args) }
|
|
||||||
+ refute(GC.respond_to?(method), "GC.#{method} should be defined as rb_f_notimplement")
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ def test_gc_compact_not_implemented
|
|
||||||
+ assert_not_implemented(:compact)
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ def test_gc_auto_compact_get_not_implemented
|
|
||||||
+ assert_not_implemented(:auto_compact)
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ def test_gc_auto_compact_set_not_implemented
|
|
||||||
+ assert_not_implemented(:auto_compact=, true)
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ def test_gc_latest_compact_info_not_implemented
|
|
||||||
+ assert_not_implemented(:latest_compact_info)
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ def test_gc_verify_compaction_references_not_implemented
|
|
||||||
+ assert_not_implemented(:verify_compaction_references)
|
|
||||||
+ end
|
|
||||||
end
|
|
||||||
|
|
||||||
- def setup
|
|
||||||
- skip "autocompact not supported on this platform" unless supports_auto_compact?
|
|
||||||
- super
|
|
||||||
+ def os_page_size
|
|
||||||
+ return true unless defined?(Etc::SC_PAGE_SIZE)
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_gc_compact_stats
|
|
||||||
diff --git a/gc.rb b/gc.rb
|
|
||||||
index 72637f3796..9265dd7b57 100644
|
|
||||||
--- a/gc.rb
|
|
||||||
+++ b/gc.rb
|
|
||||||
@@ -38,27 +38,6 @@ def garbage_collect full_mark: true, immediate_mark: true, immediate_sweep: true
|
|
||||||
Primitive.gc_start_internal full_mark, immediate_mark, immediate_sweep, false
|
|
||||||
end
|
|
||||||
|
|
||||||
- # call-seq:
|
|
||||||
- # GC.auto_compact -> true or false
|
|
||||||
- #
|
|
||||||
- # Returns whether or not automatic compaction has been enabled.
|
|
||||||
- #
|
|
||||||
- def self.auto_compact
|
|
||||||
- Primitive.gc_get_auto_compact
|
|
||||||
- end
|
|
||||||
-
|
|
||||||
- # call-seq:
|
|
||||||
- # GC.auto_compact = flag
|
|
||||||
- #
|
|
||||||
- # Updates automatic compaction mode.
|
|
||||||
- #
|
|
||||||
- # When enabled, the compactor will execute on every major collection.
|
|
||||||
- #
|
|
||||||
- # Enabling compaction will degrade performance on major collections.
|
|
||||||
- def self.auto_compact=(flag)
|
|
||||||
- Primitive.gc_set_auto_compact(flag)
|
|
||||||
- end
|
|
||||||
-
|
|
||||||
# call-seq:
|
|
||||||
# GC.enable -> true or false
|
|
||||||
#
|
|
||||||
@@ -210,53 +189,6 @@ def self.latest_gc_info hash_or_key = nil
|
|
||||||
Primitive.gc_latest_gc_info hash_or_key
|
|
||||||
end
|
|
||||||
|
|
||||||
- # call-seq:
|
|
||||||
- # GC.latest_compact_info -> {:considered=>{:T_CLASS=>11}, :moved=>{:T_CLASS=>11}}
|
|
||||||
- #
|
|
||||||
- # Returns information about object moved in the most recent GC compaction.
|
|
||||||
- #
|
|
||||||
- # The returned hash has two keys :considered and :moved. The hash for
|
|
||||||
- # :considered lists the number of objects that were considered for movement
|
|
||||||
- # by the compactor, and the :moved hash lists the number of objects that
|
|
||||||
- # were actually moved. Some objects can't be moved (maybe they were pinned)
|
|
||||||
- # so these numbers can be used to calculate compaction efficiency.
|
|
||||||
- def self.latest_compact_info
|
|
||||||
- Primitive.gc_compact_stats
|
|
||||||
- end
|
|
||||||
-
|
|
||||||
- # call-seq:
|
|
||||||
- # GC.compact
|
|
||||||
- #
|
|
||||||
- # This function compacts objects together in Ruby's heap. It eliminates
|
|
||||||
- # unused space (or fragmentation) in the heap by moving objects in to that
|
|
||||||
- # unused space. This function returns a hash which contains statistics about
|
|
||||||
- # which objects were moved. See `GC.latest_gc_info` for details about
|
|
||||||
- # compaction statistics.
|
|
||||||
- #
|
|
||||||
- # This method is implementation specific and not expected to be implemented
|
|
||||||
- # in any implementation besides MRI.
|
|
||||||
- def self.compact
|
|
||||||
- Primitive.gc_compact
|
|
||||||
- end
|
|
||||||
-
|
|
||||||
- # call-seq:
|
|
||||||
- # GC.verify_compaction_references(toward: nil, double_heap: false) -> hash
|
|
||||||
- #
|
|
||||||
- # Verify compaction reference consistency.
|
|
||||||
- #
|
|
||||||
- # This method is implementation specific. During compaction, objects that
|
|
||||||
- # were moved are replaced with T_MOVED objects. No object should have a
|
|
||||||
- # reference to a T_MOVED object after compaction.
|
|
||||||
- #
|
|
||||||
- # This function doubles the heap to ensure room to move all objects,
|
|
||||||
- # compacts the heap to make sure everything moves, updates all references,
|
|
||||||
- # then performs a full GC. If any object contains a reference to a T_MOVED
|
|
||||||
- # object, that object should be pushed on the mark stack, and will
|
|
||||||
- # make a SEGV.
|
|
||||||
- def self.verify_compaction_references(toward: nil, double_heap: false)
|
|
||||||
- Primitive.gc_verify_compaction_references(double_heap, toward == :empty)
|
|
||||||
- end
|
|
||||||
-
|
|
||||||
# call-seq:
|
|
||||||
# GC.using_rvargc? -> true or false
|
|
||||||
#
|
|
|
@ -1,502 +0,0 @@
|
||||||
--- ruby-3.1.2/gc.rbinc 2022-04-12 13:11:17.000000000 +0200
|
|
||||||
+++ ruby/gc.rbinc 2022-06-08 12:49:16.288024971 +0200
|
|
||||||
@@ -9,27 +9,27 @@
|
|
||||||
#include "builtin.h" /* for RB_BUILTIN_FUNCTION */
|
|
||||||
struct rb_execution_context_struct; /* in vm_core.h */
|
|
||||||
|
|
||||||
-static VALUE builtin_inline_class_277(struct rb_execution_context_struct *ec, const VALUE self)
|
|
||||||
+static VALUE builtin_inline_class_209(struct rb_execution_context_struct *ec, const VALUE self)
|
|
||||||
{
|
|
||||||
MAYBE_UNUSED(const VALUE) flag = rb_vm_lvar(ec, -3);
|
|
||||||
-#line 277 "gc.rb"
|
|
||||||
+#line 209 "gc.rb"
|
|
||||||
|
|
||||||
rb_objspace.flags.measure_gc = RTEST(flag) ? TRUE : FALSE;
|
|
||||||
return flag;
|
|
||||||
#line 20 "gc.rbinc"
|
|
||||||
}
|
|
||||||
|
|
||||||
-static VALUE builtin_inline_class_289(struct rb_execution_context_struct *ec, const VALUE self)
|
|
||||||
+static VALUE builtin_inline_class_221(struct rb_execution_context_struct *ec, const VALUE self)
|
|
||||||
{
|
|
||||||
-#line 289 "gc.rb"
|
|
||||||
+#line 221 "gc.rb"
|
|
||||||
return
|
|
||||||
RBOOL(rb_objspace.flags.measure_gc);
|
|
||||||
#line 28 "gc.rbinc"
|
|
||||||
}
|
|
||||||
|
|
||||||
-static VALUE builtin_inline_class_299(struct rb_execution_context_struct *ec, const VALUE self)
|
|
||||||
+static VALUE builtin_inline_class_231(struct rb_execution_context_struct *ec, const VALUE self)
|
|
||||||
{
|
|
||||||
-#line 299 "gc.rb"
|
|
||||||
+#line 231 "gc.rb"
|
|
||||||
return
|
|
||||||
ULL2NUM(rb_objspace.profile.total_time_ns);
|
|
||||||
#line 36 "gc.rbinc"
|
|
||||||
@@ -52,31 +52,6 @@
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
-mjit_compile_invokebuiltin_for_gc_get_auto_compact(FILE *f, long index, unsigned stack_size, bool inlinable_p)
|
|
||||||
-{
|
|
||||||
- fprintf(f, " VALUE self = GET_SELF();\n");
|
|
||||||
- fprintf(f, " typedef VALUE (*func)(rb_execution_context_t *, VALUE);\n");
|
|
||||||
- fprintf(f, " func f = (func)%"PRIuVALUE"; /* == gc_get_auto_compact */\n", (VALUE)gc_get_auto_compact);
|
|
||||||
- fprintf(f, " val = f(ec, self);\n");
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-static void
|
|
||||||
-mjit_compile_invokebuiltin_for_gc_set_auto_compact(FILE *f, long index, unsigned stack_size, bool inlinable_p)
|
|
||||||
-{
|
|
||||||
- fprintf(f, " VALUE self = GET_SELF();\n");
|
|
||||||
- fprintf(f, " typedef VALUE (*func)(rb_execution_context_t *, VALUE, VALUE);\n");
|
|
||||||
- if (index == -1) {
|
|
||||||
- fprintf(f, " const VALUE *argv = &stack[%d];\n", stack_size - 1);
|
|
||||||
- }
|
|
||||||
- else {
|
|
||||||
- fprintf(f, " const unsigned int lnum = GET_ISEQ()->body->local_table_size;\n");
|
|
||||||
- fprintf(f, " const VALUE *argv = GET_EP() - lnum - VM_ENV_DATA_SIZE + 1 + %ld;\n", index);
|
|
||||||
- }
|
|
||||||
- fprintf(f, " func f = (func)%"PRIuVALUE"; /* == gc_set_auto_compact */\n", (VALUE)gc_set_auto_compact);
|
|
||||||
- fprintf(f, " val = f(ec, self, argv[0]);\n");
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-static void
|
|
||||||
mjit_compile_invokebuiltin_for_gc_enable(FILE *f, long index, unsigned stack_size, bool inlinable_p)
|
|
||||||
{
|
|
||||||
fprintf(f, " VALUE self = GET_SELF();\n");
|
|
||||||
@@ -161,40 +136,6 @@
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
-mjit_compile_invokebuiltin_for_gc_compact_stats(FILE *f, long index, unsigned stack_size, bool inlinable_p)
|
|
||||||
-{
|
|
||||||
- fprintf(f, " VALUE self = GET_SELF();\n");
|
|
||||||
- fprintf(f, " typedef VALUE (*func)(rb_execution_context_t *, VALUE);\n");
|
|
||||||
- fprintf(f, " func f = (func)%"PRIuVALUE"; /* == gc_compact_stats */\n", (VALUE)gc_compact_stats);
|
|
||||||
- fprintf(f, " val = f(ec, self);\n");
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-static void
|
|
||||||
-mjit_compile_invokebuiltin_for_gc_compact(FILE *f, long index, unsigned stack_size, bool inlinable_p)
|
|
||||||
-{
|
|
||||||
- fprintf(f, " VALUE self = GET_SELF();\n");
|
|
||||||
- fprintf(f, " typedef VALUE (*func)(rb_execution_context_t *, VALUE);\n");
|
|
||||||
- fprintf(f, " func f = (func)%"PRIuVALUE"; /* == gc_compact */\n", (VALUE)gc_compact);
|
|
||||||
- fprintf(f, " val = f(ec, self);\n");
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-static void
|
|
||||||
-mjit_compile_invokebuiltin_for_gc_verify_compaction_references(FILE *f, long index, unsigned stack_size, bool inlinable_p)
|
|
||||||
-{
|
|
||||||
- fprintf(f, " VALUE self = GET_SELF();\n");
|
|
||||||
- fprintf(f, " typedef VALUE (*func)(rb_execution_context_t *, VALUE, VALUE, VALUE);\n");
|
|
||||||
- if (index == -1) {
|
|
||||||
- fprintf(f, " const VALUE *argv = &stack[%d];\n", stack_size - 2);
|
|
||||||
- }
|
|
||||||
- else {
|
|
||||||
- fprintf(f, " const unsigned int lnum = GET_ISEQ()->body->local_table_size;\n");
|
|
||||||
- fprintf(f, " const VALUE *argv = GET_EP() - lnum - VM_ENV_DATA_SIZE + 1 + %ld;\n", index);
|
|
||||||
- }
|
|
||||||
- fprintf(f, " func f = (func)%"PRIuVALUE"; /* == gc_verify_compaction_references */\n", (VALUE)gc_verify_compaction_references);
|
|
||||||
- fprintf(f, " val = f(ec, self, argv[0], argv[1]);\n");
|
|
||||||
-}
|
|
||||||
-
|
|
||||||
-static void
|
|
||||||
mjit_compile_invokebuiltin_for__bi0(FILE *f, long index, unsigned stack_size, bool inlinable_p)
|
|
||||||
{
|
|
||||||
fprintf(f, " VALUE self = GET_SELF();\n");
|
|
||||||
@@ -202,7 +143,7 @@
|
|
||||||
if (inlinable_p) {
|
|
||||||
fprintf(f, "%s", " {\n");
|
|
||||||
fprintf(f, "%s", " MAYBE_UNUSED(const VALUE) flag = rb_vm_lvar(ec, -3);\n");
|
|
||||||
- fprintf(f, "%s", "#line 277 \"gc.rb\"\n");
|
|
||||||
+ fprintf(f, "%s", "#line 209 \"gc.rb\"\n");
|
|
||||||
fprintf(f, "%s", " \n");
|
|
||||||
fprintf(f, "%s", " rb_objspace.flags.measure_gc = RTEST(flag) ? TRUE : FALSE;\n");
|
|
||||||
fprintf(f, "%s", " return flag;\n");
|
|
||||||
@@ -211,7 +152,7 @@
|
|
||||||
fprintf(f, "%s", " \n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
- fprintf(f, " func f = (func)%"PRIuVALUE"; /* == builtin_inline_class_277 */\n", (VALUE)builtin_inline_class_277);
|
|
||||||
+ fprintf(f, " func f = (func)%"PRIuVALUE"; /* == builtin_inline_class_209 */\n", (VALUE)builtin_inline_class_209);
|
|
||||||
fprintf(f, " val = f(ec, self);\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -222,7 +163,7 @@
|
|
||||||
fprintf(f, " typedef VALUE (*func)(rb_execution_context_t *, VALUE);\n");
|
|
||||||
if (inlinable_p) {
|
|
||||||
fprintf(f, "%s", " {\n");
|
|
||||||
- fprintf(f, "%s", "#line 289 \"gc.rb\"\n");
|
|
||||||
+ fprintf(f, "%s", "#line 221 \"gc.rb\"\n");
|
|
||||||
fprintf(f, "%s", " return \n");
|
|
||||||
fprintf(f, "%s", " RBOOL(rb_objspace.flags.measure_gc);\n");
|
|
||||||
fprintf(f, "%s", "#line 52 \"gc.rbinc\"\n");
|
|
||||||
@@ -230,7 +171,7 @@
|
|
||||||
fprintf(f, "%s", " \n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
- fprintf(f, " func f = (func)%"PRIuVALUE"; /* == builtin_inline_class_289 */\n", (VALUE)builtin_inline_class_289);
|
|
||||||
+ fprintf(f, " func f = (func)%"PRIuVALUE"; /* == builtin_inline_class_221 */\n", (VALUE)builtin_inline_class_221);
|
|
||||||
fprintf(f, " val = f(ec, self);\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -241,7 +182,7 @@
|
|
||||||
fprintf(f, " typedef VALUE (*func)(rb_execution_context_t *, VALUE);\n");
|
|
||||||
if (inlinable_p) {
|
|
||||||
fprintf(f, "%s", " {\n");
|
|
||||||
- fprintf(f, "%s", "#line 299 \"gc.rb\"\n");
|
|
||||||
+ fprintf(f, "%s", "#line 231 \"gc.rb\"\n");
|
|
||||||
fprintf(f, "%s", " return \n");
|
|
||||||
fprintf(f, "%s", " ULL2NUM(rb_objspace.profile.total_time_ns);\n");
|
|
||||||
fprintf(f, "%s", "#line 59 \"gc.rbinc\"\n");
|
|
||||||
@@ -249,7 +190,7 @@
|
|
||||||
fprintf(f, "%s", " \n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
- fprintf(f, " func f = (func)%"PRIuVALUE"; /* == builtin_inline_class_299 */\n", (VALUE)builtin_inline_class_299);
|
|
||||||
+ fprintf(f, " func f = (func)%"PRIuVALUE"; /* == builtin_inline_class_231 */\n", (VALUE)builtin_inline_class_231);
|
|
||||||
fprintf(f, " val = f(ec, self);\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -258,21 +199,16 @@
|
|
||||||
// table definition
|
|
||||||
static const struct rb_builtin_function gc_table[] = {
|
|
||||||
RB_BUILTIN_FUNCTION(0, gc_start_internal, gc_start_internal, 4, mjit_compile_invokebuiltin_for_gc_start_internal),
|
|
||||||
- RB_BUILTIN_FUNCTION(1, gc_get_auto_compact, gc_get_auto_compact, 0, mjit_compile_invokebuiltin_for_gc_get_auto_compact),
|
|
||||||
- RB_BUILTIN_FUNCTION(2, gc_set_auto_compact, gc_set_auto_compact, 1, mjit_compile_invokebuiltin_for_gc_set_auto_compact),
|
|
||||||
- RB_BUILTIN_FUNCTION(3, gc_enable, gc_enable, 0, mjit_compile_invokebuiltin_for_gc_enable),
|
|
||||||
- RB_BUILTIN_FUNCTION(4, gc_disable, gc_disable, 0, mjit_compile_invokebuiltin_for_gc_disable),
|
|
||||||
- RB_BUILTIN_FUNCTION(5, gc_stress_get, gc_stress_get, 0, mjit_compile_invokebuiltin_for_gc_stress_get),
|
|
||||||
- RB_BUILTIN_FUNCTION(6, gc_stress_set_m, gc_stress_set_m, 1, mjit_compile_invokebuiltin_for_gc_stress_set_m),
|
|
||||||
- RB_BUILTIN_FUNCTION(7, gc_count, gc_count, 0, mjit_compile_invokebuiltin_for_gc_count),
|
|
||||||
- RB_BUILTIN_FUNCTION(8, gc_stat, gc_stat, 1, mjit_compile_invokebuiltin_for_gc_stat),
|
|
||||||
- RB_BUILTIN_FUNCTION(9, gc_latest_gc_info, gc_latest_gc_info, 1, mjit_compile_invokebuiltin_for_gc_latest_gc_info),
|
|
||||||
- RB_BUILTIN_FUNCTION(10, gc_compact_stats, gc_compact_stats, 0, mjit_compile_invokebuiltin_for_gc_compact_stats),
|
|
||||||
- RB_BUILTIN_FUNCTION(11, gc_compact, gc_compact, 0, mjit_compile_invokebuiltin_for_gc_compact),
|
|
||||||
- RB_BUILTIN_FUNCTION(12, gc_verify_compaction_references, gc_verify_compaction_references, 2, mjit_compile_invokebuiltin_for_gc_verify_compaction_references),
|
|
||||||
- RB_BUILTIN_FUNCTION(13, _bi0, builtin_inline_class_277, 0, mjit_compile_invokebuiltin_for__bi0),
|
|
||||||
- RB_BUILTIN_FUNCTION(14, _bi1, builtin_inline_class_289, 0, mjit_compile_invokebuiltin_for__bi1),
|
|
||||||
- RB_BUILTIN_FUNCTION(15, _bi2, builtin_inline_class_299, 0, mjit_compile_invokebuiltin_for__bi2),
|
|
||||||
+ RB_BUILTIN_FUNCTION(1, gc_enable, gc_enable, 0, mjit_compile_invokebuiltin_for_gc_enable),
|
|
||||||
+ RB_BUILTIN_FUNCTION(2, gc_disable, gc_disable, 0, mjit_compile_invokebuiltin_for_gc_disable),
|
|
||||||
+ RB_BUILTIN_FUNCTION(3, gc_stress_get, gc_stress_get, 0, mjit_compile_invokebuiltin_for_gc_stress_get),
|
|
||||||
+ RB_BUILTIN_FUNCTION(4, gc_stress_set_m, gc_stress_set_m, 1, mjit_compile_invokebuiltin_for_gc_stress_set_m),
|
|
||||||
+ RB_BUILTIN_FUNCTION(5, gc_count, gc_count, 0, mjit_compile_invokebuiltin_for_gc_count),
|
|
||||||
+ RB_BUILTIN_FUNCTION(6, gc_stat, gc_stat, 1, mjit_compile_invokebuiltin_for_gc_stat),
|
|
||||||
+ RB_BUILTIN_FUNCTION(7, gc_latest_gc_info, gc_latest_gc_info, 1, mjit_compile_invokebuiltin_for_gc_latest_gc_info),
|
|
||||||
+ RB_BUILTIN_FUNCTION(8, _bi0, builtin_inline_class_209, 0, mjit_compile_invokebuiltin_for__bi0),
|
|
||||||
+ RB_BUILTIN_FUNCTION(9, _bi1, builtin_inline_class_221, 0, mjit_compile_invokebuiltin_for__bi1),
|
|
||||||
+ RB_BUILTIN_FUNCTION(10, _bi2, builtin_inline_class_231, 0, mjit_compile_invokebuiltin_for__bi2),
|
|
||||||
RB_BUILTIN_FUNCTION(-1, NULL, NULL, 0, 0),
|
|
||||||
};
|
|
||||||
|
|
||||||
@@ -282,8 +218,6 @@
|
|
||||||
COMPILER_WARNING_ERROR(-Wincompatible-pointer-types)
|
|
||||||
#endif
|
|
||||||
if (0) rb_builtin_function_check_arity4(gc_start_internal);
|
|
||||||
- if (0) rb_builtin_function_check_arity0(gc_get_auto_compact);
|
|
||||||
- if (0) rb_builtin_function_check_arity1(gc_set_auto_compact);
|
|
||||||
if (0) rb_builtin_function_check_arity0(gc_enable);
|
|
||||||
if (0) rb_builtin_function_check_arity0(gc_disable);
|
|
||||||
if (0) rb_builtin_function_check_arity0(gc_stress_get);
|
|
||||||
@@ -291,12 +225,9 @@
|
|
||||||
if (0) rb_builtin_function_check_arity0(gc_count);
|
|
||||||
if (0) rb_builtin_function_check_arity1(gc_stat);
|
|
||||||
if (0) rb_builtin_function_check_arity1(gc_latest_gc_info);
|
|
||||||
- if (0) rb_builtin_function_check_arity0(gc_compact_stats);
|
|
||||||
- if (0) rb_builtin_function_check_arity0(gc_compact);
|
|
||||||
- if (0) rb_builtin_function_check_arity2(gc_verify_compaction_references);
|
|
||||||
- if (0) rb_builtin_function_check_arity0(builtin_inline_class_277);
|
|
||||||
- if (0) rb_builtin_function_check_arity0(builtin_inline_class_289);
|
|
||||||
- if (0) rb_builtin_function_check_arity0(builtin_inline_class_299);
|
|
||||||
+ if (0) rb_builtin_function_check_arity0(builtin_inline_class_209);
|
|
||||||
+ if (0) rb_builtin_function_check_arity0(builtin_inline_class_221);
|
|
||||||
+ if (0) rb_builtin_function_check_arity0(builtin_inline_class_231);
|
|
||||||
COMPILER_WARNING_POP
|
|
||||||
|
|
||||||
// load
|
|
||||||
--- ruby-3.1.2/miniprelude.c 2022-04-12 13:11:17.000000000 +0200
|
|
||||||
+++ ruby/miniprelude.c 2022-06-08 12:49:16.377024871 +0200
|
|
||||||
@@ -545,11 +545,10 @@
|
|
||||||
|
|
||||||
static const char prelude_name2[] = "<internal:gc>";
|
|
||||||
static const struct {
|
|
||||||
- char L0[479]; /* 1..58 */
|
|
||||||
- char L58[508]; /* 59..204 */
|
|
||||||
- char L204[504]; /* 205..275 */
|
|
||||||
- char L275[490]; /* 276..306 */
|
|
||||||
- char L306[128]; /* 307..312 */
|
|
||||||
+ char L0[492]; /* 1..70 */
|
|
||||||
+ char L70[468]; /* 71..197 */
|
|
||||||
+ char L197[470]; /* 198..237 */
|
|
||||||
+ char L237[211]; /* 238..244 */
|
|
||||||
} prelude_code2 = {
|
|
||||||
#line 1 "gc.rb"
|
|
||||||
""/* for gc.c */
|
|
||||||
@@ -593,29 +592,6 @@
|
|
||||||
" end\n"
|
|
||||||
"\n"
|
|
||||||
"\n"/* call-seq: */
|
|
||||||
-"\n"/* GC.auto_compact -> true or false */
|
|
||||||
-"\n"/* */
|
|
||||||
-"\n"/* Returns whether or not automatic compaction has been enabled. */
|
|
||||||
-"\n"/* */
|
|
||||||
-" def self.auto_compact\n"
|
|
||||||
-" Primitive.gc_get_auto_compact\n"
|
|
||||||
-" end\n"
|
|
||||||
-"\n"
|
|
||||||
-"\n"/* call-seq: */
|
|
||||||
-"\n"/* GC.auto_compact = flag */
|
|
||||||
-"\n"/* */
|
|
||||||
-"\n"/* Updates automatic compaction mode. */
|
|
||||||
-"\n"/* */
|
|
||||||
-"\n"/* When enabled, the compactor will execute on every major collection. */
|
|
||||||
-"\n"/* */
|
|
||||||
-"\n"/* Enabling compaction will degrade performance on major collections. */
|
|
||||||
-" def self.auto_compact=(flag)\n"
|
|
||||||
-,
|
|
||||||
-#line 59 "gc.rb"
|
|
||||||
-" Primitive.gc_set_auto_compact(flag)\n"
|
|
||||||
-" end\n"
|
|
||||||
-"\n"
|
|
||||||
-"\n"/* call-seq: */
|
|
||||||
"\n"/* GC.enable -> true or false */
|
|
||||||
"\n"/* */
|
|
||||||
"\n"/* Enables garbage collection, returning +true+ if garbage */
|
|
||||||
@@ -645,6 +621,8 @@
|
|
||||||
"\n"/* GC.stress -> integer, true or false */
|
|
||||||
"\n"/* */
|
|
||||||
"\n"/* Returns current status of GC stress mode. */
|
|
||||||
+,
|
|
||||||
+#line 71 "gc.rb"
|
|
||||||
" def self.stress\n"
|
|
||||||
" Primitive.gc_stress_get\n"
|
|
||||||
" end\n"
|
|
||||||
@@ -758,8 +736,6 @@
|
|
||||||
"\n"/* GC.latest_gc_info(:major_by) -> :malloc */
|
|
||||||
"\n"/* */
|
|
||||||
"\n"/* Returns information about the most recent garbage collection. */
|
|
||||||
-,
|
|
||||||
-#line 205 "gc.rb"
|
|
||||||
"\n"/* */
|
|
||||||
"\n"/* If the optional argument, hash, is given, */
|
|
||||||
"\n"/* it is overwritten and returned. */
|
|
||||||
@@ -768,59 +744,14 @@
|
|
||||||
" Primitive.gc_latest_gc_info hash_or_key\n"
|
|
||||||
" end\n"
|
|
||||||
"\n"
|
|
||||||
-"\n"/* call-seq: */
|
|
||||||
-"\n"/* GC.latest_compact_info -> {:considered=>{:T_CLASS=>11}, :moved=>{:T_CLASS=>11}} */
|
|
||||||
-"\n"/* */
|
|
||||||
-"\n"/* Returns information about object moved in the most recent GC compaction. */
|
|
||||||
-"\n"/* */
|
|
||||||
-"\n"/* The returned hash has two keys :considered and :moved. The hash for */
|
|
||||||
-"\n"/* :considered lists the number of objects that were considered for movement */
|
|
||||||
-"\n"/* by the compactor, and the :moved hash lists the number of objects that */
|
|
||||||
-"\n"/* were actually moved. Some objects can't be moved (maybe they were pinned) */
|
|
||||||
-"\n"/* so these numbers can be used to calculate compaction efficiency. */
|
|
||||||
-" def self.latest_compact_info\n"
|
|
||||||
-" Primitive.gc_compact_stats\n"
|
|
||||||
-" end\n"
|
|
||||||
-"\n"
|
|
||||||
-"\n"/* call-seq: */
|
|
||||||
-"\n"/* GC.compact */
|
|
||||||
-"\n"/* */
|
|
||||||
-"\n"/* This function compacts objects together in Ruby's heap. It eliminates */
|
|
||||||
-"\n"/* unused space (or fragmentation) in the heap by moving objects in to that */
|
|
||||||
-"\n"/* unused space. This function returns a hash which contains statistics about */
|
|
||||||
-"\n"/* which objects were moved. See `GC.latest_gc_info` for details about */
|
|
||||||
-"\n"/* compaction statistics. */
|
|
||||||
-"\n"/* */
|
|
||||||
-"\n"/* This method is implementation specific and not expected to be implemented */
|
|
||||||
-"\n"/* in any implementation besides MRI. */
|
|
||||||
-" def self.compact\n"
|
|
||||||
-" Primitive.gc_compact\n"
|
|
||||||
-" end\n"
|
|
||||||
-"\n"
|
|
||||||
-"\n"/* call-seq: */
|
|
||||||
-"\n"/* GC.verify_compaction_references(toward: nil, double_heap: false) -> hash */
|
|
||||||
-"\n"/* */
|
|
||||||
-"\n"/* Verify compaction reference consistency. */
|
|
||||||
-"\n"/* */
|
|
||||||
-"\n"/* This method is implementation specific. During compaction, objects that */
|
|
||||||
-"\n"/* were moved are replaced with T_MOVED objects. No object should have a */
|
|
||||||
-"\n"/* reference to a T_MOVED object after compaction. */
|
|
||||||
-"\n"/* */
|
|
||||||
-"\n"/* This function doubles the heap to ensure room to move all objects, */
|
|
||||||
-"\n"/* compacts the heap to make sure everything moves, updates all references, */
|
|
||||||
-"\n"/* then performs a full GC. If any object contains a reference to a T_MOVED */
|
|
||||||
-"\n"/* object, that object should be pushed on the mark stack, and will */
|
|
||||||
-"\n"/* make a SEGV. */
|
|
||||||
-" def self.verify_compaction_references(toward: nil, double_heap: false)\n"
|
|
||||||
-" Primitive.gc_verify_compaction_references(double_heap, toward == :empty)\n"
|
|
||||||
-" end\n"
|
|
||||||
-"\n"
|
|
||||||
"\n"/* call-seq: */
|
|
||||||
"\n"/* GC.using_rvargc? -> true or false */
|
|
||||||
"\n"/* */
|
|
||||||
"\n"/* Returns true if using experimental feature Variable Width Allocation, false */
|
|
||||||
"\n"/* otherwise. */
|
|
||||||
" def self.using_rvargc?\n"/* :nodoc: */
|
|
||||||
+,
|
|
||||||
+#line 198 "gc.rb"
|
|
||||||
" GC::INTERNAL_CONSTANTS[:SIZE_POOL_COUNT] > 1\n"
|
|
||||||
" end\n"
|
|
||||||
"\n"
|
|
||||||
@@ -831,8 +762,6 @@
|
|
||||||
"\n"/* Enable to measure GC time. */
|
|
||||||
"\n"/* You can get the result with <tt>GC.stat(:time)</tt>. */
|
|
||||||
"\n"/* Note that GC time measurement can cause some performance overhead. */
|
|
||||||
-,
|
|
||||||
-#line 276 "gc.rb"
|
|
||||||
" def self.measure_total_time=(flag)\n"
|
|
||||||
" Primitive.cstmt! %{\n"
|
|
||||||
" rb_objspace.flags.measure_gc = RTEST(flag) ? TRUE : FALSE;\n"
|
|
||||||
@@ -863,15 +792,15 @@
|
|
||||||
"end\n"
|
|
||||||
"\n"
|
|
||||||
"module ObjectSpace\n"
|
|
||||||
-" def garbage_collect full_mark: true, immediate_mark: true, immediate_sweep: true\n"
|
|
||||||
,
|
|
||||||
-#line 307 "gc.rb"
|
|
||||||
+#line 238 "gc.rb"
|
|
||||||
+" def garbage_collect full_mark: true, immediate_mark: true, immediate_sweep: true\n"
|
|
||||||
" Primitive.gc_start_internal full_mark, immediate_mark, immediate_sweep, false\n"
|
|
||||||
" end\n"
|
|
||||||
"\n"
|
|
||||||
" module_function :garbage_collect\n"
|
|
||||||
"end\n"
|
|
||||||
-#line 875 "miniprelude.c"
|
|
||||||
+#line 804 "miniprelude.c"
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char prelude_name3[] = "<internal:numeric>";
|
|
||||||
@@ -1223,7 +1152,7 @@
|
|
||||||
" end\n"
|
|
||||||
"\n"
|
|
||||||
"end\n"
|
|
||||||
-#line 1227 "miniprelude.c"
|
|
||||||
+#line 1156 "miniprelude.c"
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char prelude_name4[] = "<internal:io>";
|
|
||||||
@@ -1354,7 +1283,7 @@
|
|
||||||
" Primitive.io_write_nonblock(buf, exception)\n"
|
|
||||||
" end\n"
|
|
||||||
"end\n"
|
|
||||||
-#line 1358 "miniprelude.c"
|
|
||||||
+#line 1287 "miniprelude.c"
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char prelude_name5[] = "<internal:marshal>";
|
|
||||||
@@ -1402,7 +1331,7 @@
|
|
||||||
" alias restore load\n"
|
|
||||||
" end\n"
|
|
||||||
"end\n"
|
|
||||||
-#line 1406 "miniprelude.c"
|
|
||||||
+#line 1335 "miniprelude.c"
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char prelude_name6[] = "<internal:pack>";
|
|
||||||
@@ -1724,7 +1653,7 @@
|
|
||||||
" Primitive.pack_unpack1(fmt, offset)\n"
|
|
||||||
" end\n"
|
|
||||||
"end\n"
|
|
||||||
-#line 1728 "miniprelude.c"
|
|
||||||
+#line 1657 "miniprelude.c"
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char prelude_name7[] = "<internal:trace_point>";
|
|
||||||
@@ -2111,7 +2040,7 @@
|
|
||||||
" Primitive.tracepoint_attr_instruction_sequence\n"
|
|
||||||
" end\n"
|
|
||||||
"end\n"
|
|
||||||
-#line 2115 "miniprelude.c"
|
|
||||||
+#line 2044 "miniprelude.c"
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char prelude_name8[] = "<internal:warning>";
|
|
||||||
@@ -2172,7 +2101,7 @@
|
|
||||||
" Primitive.rb_warn_m(msgs, uplevel, category)\n"
|
|
||||||
" end\n"
|
|
||||||
"end\n"
|
|
||||||
-#line 2176 "miniprelude.c"
|
|
||||||
+#line 2105 "miniprelude.c"
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char prelude_name9[] = "<internal:array>";
|
|
||||||
@@ -2249,7 +2178,7 @@
|
|
||||||
" end\n"
|
|
||||||
" end\n"
|
|
||||||
"end\n"
|
|
||||||
-#line 2253 "miniprelude.c"
|
|
||||||
+#line 2182 "miniprelude.c"
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char prelude_name10[] = "<internal:kernel>";
|
|
||||||
@@ -2438,7 +2367,7 @@
|
|
||||||
" end\n"
|
|
||||||
" end\n"
|
|
||||||
"end\n"
|
|
||||||
-#line 2442 "miniprelude.c"
|
|
||||||
+#line 2371 "miniprelude.c"
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char prelude_name11[] = "<internal:ractor>";
|
|
||||||
@@ -3305,7 +3234,7 @@
|
|
||||||
" }\n"
|
|
||||||
" end\n"
|
|
||||||
"end\n"
|
|
||||||
-#line 3309 "miniprelude.c"
|
|
||||||
+#line 3238 "miniprelude.c"
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char prelude_name12[] = "<internal:timev>";
|
|
||||||
@@ -3628,7 +3557,7 @@
|
|
||||||
" Primitive.time_init_args(year, mon, mday, hour, min, sec, zone)\n"
|
|
||||||
" end\n"
|
|
||||||
"end\n"
|
|
||||||
-#line 3632 "miniprelude.c"
|
|
||||||
+#line 3561 "miniprelude.c"
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char prelude_name13[] = "<internal:nilclass>";
|
|
||||||
@@ -3661,7 +3590,7 @@
|
|
||||||
" return 0.0\n"
|
|
||||||
" end\n"
|
|
||||||
"end\n"
|
|
||||||
-#line 3665 "miniprelude.c"
|
|
||||||
+#line 3594 "miniprelude.c"
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char prelude_name14[] = "<internal:prelude>";
|
|
||||||
@@ -3691,7 +3620,7 @@
|
|
||||||
"\n"
|
|
||||||
" private :pp\n"
|
|
||||||
"end\n"
|
|
||||||
-#line 3695 "miniprelude.c"
|
|
||||||
+#line 3624 "miniprelude.c"
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char prelude_name15[] = "<internal:gem_prelude>";
|
|
||||||
@@ -3718,7 +3647,7 @@
|
|
||||||
"rescue LoadError\n"
|
|
||||||
" warn \"`did_you_mean' was not loaded.\"\n"
|
|
||||||
"end if defined?(DidYouMean)\n"
|
|
||||||
-#line 3722 "miniprelude.c"
|
|
||||||
+#line 3651 "miniprelude.c"
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char prelude_name16[] = "<internal:yjit>";
|
|
||||||
@@ -4059,7 +3988,7 @@
|
|
||||||
" end\n"
|
|
||||||
" end\n"
|
|
||||||
"end\n"
|
|
||||||
-#line 4063 "miniprelude.c"
|
|
||||||
+#line 3992 "miniprelude.c"
|
|
||||||
};
|
|
||||||
|
|
||||||
COMPILER_WARNING_POP
|
|
|
@ -1,27 +0,0 @@
|
||||||
From dae843f6b7502f921a7e66f39e3714a39d860181 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Hiroshi SHIBATA <hsbt@ruby-lang.org>
|
|
||||||
Date: Wed, 19 Oct 2022 19:40:00 +0900
|
|
||||||
Subject: [PATCH] Bypass git submodule add/update with git config
|
|
||||||
protocol.file.allow=always option.
|
|
||||||
|
|
||||||
Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org>
|
|
||||||
---
|
|
||||||
test/rubygems/test_gem_source_git.rb | 5 +++++
|
|
||||||
1 file changed, 5 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/test/rubygems/test_gem_source_git.rb b/test/rubygems/test_gem_source_git.rb
|
|
||||||
index 5702da05974b6..c3b324771fa4d 100644
|
|
||||||
--- a/test/rubygems/test_gem_source_git.rb
|
|
||||||
+++ b/test/rubygems/test_gem_source_git.rb
|
|
||||||
@@ -63,6 +63,11 @@ def test_checkout_local_cached
|
|
||||||
end
|
|
||||||
|
|
||||||
def test_checkout_submodules
|
|
||||||
+ # We need to allow to checkout submodules with file:// protocol
|
|
||||||
+ # CVE-2022-39253
|
|
||||||
+ # https://lore.kernel.org/lkml/xmqq4jw1uku5.fsf@gitster.g/
|
|
||||||
+ system(@git, *%W"config --global protocol.file.allow always")
|
|
||||||
+
|
|
||||||
source = Gem::Source::Git.new @name, @repository, 'master', true
|
|
||||||
|
|
||||||
git_gem 'b'
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
From 6365d1b79e10330fced83d00d4cb950380a3b0fe Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||||
|
Date: Thu, 7 Sep 2023 13:13:02 +0200
|
||||||
|
Subject: [PATCH] Disable syntax-suggest test case.
|
||||||
|
|
||||||
|
This requires internet connection.
|
||||||
|
---
|
||||||
|
common.mk | 2 --
|
||||||
|
1 file changed, 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/common.mk b/common.mk
|
||||||
|
index d55d1788aa..73755f6ccd 100644
|
||||||
|
--- a/common.mk
|
||||||
|
+++ b/common.mk
|
||||||
|
@@ -1601,8 +1601,6 @@ yes-test-syntax-suggest: $(PREPARE_SYNTAX_SUGGEST)
|
||||||
|
$(ACTIONS_ENDGROUP)
|
||||||
|
no-test-syntax-suggest:
|
||||||
|
|
||||||
|
-check: $(DOT_WAIT) $(PREPARE_SYNTAX_SUGGEST) test-syntax-suggest
|
||||||
|
-
|
||||||
|
test-bundler-precheck: $(TEST_RUNNABLE)-test-bundler-precheck
|
||||||
|
no-test-bundler-precheck:
|
||||||
|
yes-test-bundler-precheck: main $(arch)-fake.rb
|
|
@ -0,0 +1,92 @@
|
||||||
|
From 8944a064d0fd7947b8c2b6c761be3e3a0c9073af Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||||
|
Date: Fri, 22 Dec 2023 14:16:48 +0100
|
||||||
|
Subject: [PATCH 1/2] Revert "compare_by_identity: remove alloc for non-empty
|
||||||
|
Hash"
|
||||||
|
|
||||||
|
This reverts commit 11fa76b1b521072c200c78ea023960221ff426d6.
|
||||||
|
---
|
||||||
|
hash.c | 13 ++++---------
|
||||||
|
1 file changed, 4 insertions(+), 9 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/hash.c b/hash.c
|
||||||
|
index 78e9d9a2d6..f6525ba4a5 100644
|
||||||
|
--- a/hash.c
|
||||||
|
+++ b/hash.c
|
||||||
|
@@ -4377,16 +4377,13 @@ rb_hash_compare_by_id(VALUE hash)
|
||||||
|
if (hash_iterating_p(hash)) {
|
||||||
|
rb_raise(rb_eRuntimeError, "compare_by_identity during iteration");
|
||||||
|
}
|
||||||
|
+ ar_force_convert_table(hash, __FILE__, __LINE__);
|
||||||
|
+ HASH_ASSERT(RHASH_ST_TABLE_P(hash));
|
||||||
|
|
||||||
|
if (RHASH_TABLE_EMPTY_P(hash)) {
|
||||||
|
// Fast path: There's nothing to rehash, so we don't need a `tmp` table.
|
||||||
|
- // We're most likely an AR table, so this will need an allocation.
|
||||||
|
- ar_force_convert_table(hash, __FILE__, __LINE__);
|
||||||
|
- HASH_ASSERT(RHASH_ST_TABLE_P(hash));
|
||||||
|
-
|
||||||
|
RHASH_ST_TABLE(hash)->type = &identhash;
|
||||||
|
- }
|
||||||
|
- else {
|
||||||
|
+ } else {
|
||||||
|
// Slow path: Need to rehash the members of `self` into a new
|
||||||
|
// `tmp` table using the new `identhash` compare/hash functions.
|
||||||
|
tmp = hash_alloc(0);
|
||||||
|
@@ -4394,10 +4391,8 @@ rb_hash_compare_by_id(VALUE hash)
|
||||||
|
identtable = RHASH_ST_TABLE(tmp);
|
||||||
|
|
||||||
|
rb_hash_foreach(hash, rb_hash_rehash_i, (VALUE)tmp);
|
||||||
|
- rb_hash_free(hash);
|
||||||
|
|
||||||
|
- // We know for sure `identtable` is an st table,
|
||||||
|
- // so we can skip `ar_force_convert_table` here.
|
||||||
|
+ rb_hash_free(hash);
|
||||||
|
RHASH_ST_TABLE_SET(hash, identtable);
|
||||||
|
RHASH_ST_CLEAR(tmp);
|
||||||
|
}
|
||||||
|
|
||||||
|
From f5c415300ffe63e41e46c6b88b8634a3bad0c7c2 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||||
|
Date: Fri, 22 Dec 2023 14:17:14 +0100
|
||||||
|
Subject: [PATCH 2/2] Revert "compare_by_identity: remove alloc for empty Hash"
|
||||||
|
|
||||||
|
This reverts commit b5c6c0122f5b010cb5f43e7a236c4ba2b1d56a2a.
|
||||||
|
---
|
||||||
|
hash.c | 21 +++++++--------------
|
||||||
|
1 file changed, 7 insertions(+), 14 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/hash.c b/hash.c
|
||||||
|
index f6525ba4a5..cf83675c70 100644
|
||||||
|
--- a/hash.c
|
||||||
|
+++ b/hash.c
|
||||||
|
@@ -4380,22 +4380,15 @@ rb_hash_compare_by_id(VALUE hash)
|
||||||
|
ar_force_convert_table(hash, __FILE__, __LINE__);
|
||||||
|
HASH_ASSERT(RHASH_ST_TABLE_P(hash));
|
||||||
|
|
||||||
|
- if (RHASH_TABLE_EMPTY_P(hash)) {
|
||||||
|
- // Fast path: There's nothing to rehash, so we don't need a `tmp` table.
|
||||||
|
- RHASH_ST_TABLE(hash)->type = &identhash;
|
||||||
|
- } else {
|
||||||
|
- // Slow path: Need to rehash the members of `self` into a new
|
||||||
|
- // `tmp` table using the new `identhash` compare/hash functions.
|
||||||
|
- tmp = hash_alloc(0);
|
||||||
|
- hash_st_table_init(tmp, &identhash, RHASH_SIZE(hash));
|
||||||
|
- identtable = RHASH_ST_TABLE(tmp);
|
||||||
|
+ tmp = hash_alloc(0);
|
||||||
|
+ hash_st_table_init(tmp, &identhash, RHASH_SIZE(hash));
|
||||||
|
+ identtable = RHASH_ST_TABLE(tmp);
|
||||||
|
|
||||||
|
- rb_hash_foreach(hash, rb_hash_rehash_i, (VALUE)tmp);
|
||||||
|
+ rb_hash_foreach(hash, rb_hash_rehash_i, (VALUE)tmp);
|
||||||
|
|
||||||
|
- rb_hash_free(hash);
|
||||||
|
- RHASH_ST_TABLE_SET(hash, identtable);
|
||||||
|
- RHASH_ST_CLEAR(tmp);
|
||||||
|
- }
|
||||||
|
+ rb_hash_free(hash);
|
||||||
|
+ RHASH_ST_TABLE_SET(hash, identtable);
|
||||||
|
+ RHASH_ST_CLEAR(tmp);
|
||||||
|
|
||||||
|
return hash;
|
||||||
|
}
|
|
@ -1,32 +0,0 @@
|
||||||
From f0b254f1f6610294821bbfc06b414d2af452db5b Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jun Aruga <jaruga@redhat.com>
|
|
||||||
Date: Thu, 13 Apr 2023 17:28:27 +0200
|
|
||||||
Subject: [PATCH] [ruby/openssl] Drop a common logic disabling the FIPS mode in
|
|
||||||
the tests.
|
|
||||||
|
|
||||||
We want to run the unit tests in the FIPS mode too.
|
|
||||||
|
|
||||||
https://github.com/ruby/openssl/commit/ab92baff34
|
|
||||||
---
|
|
||||||
test/openssl/utils.rb | 5 -----
|
|
||||||
1 file changed, 5 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/test/openssl/utils.rb b/test/openssl/utils.rb
|
|
||||||
index 4ebcb9837b..8a0be0d154 100644
|
|
||||||
--- a/test/openssl/utils.rb
|
|
||||||
+++ b/test/openssl/utils.rb
|
|
||||||
@@ -1,11 +1,6 @@
|
|
||||||
# frozen_string_literal: true
|
|
||||||
begin
|
|
||||||
require "openssl"
|
|
||||||
-
|
|
||||||
- # Disable FIPS mode for tests for installations
|
|
||||||
- # where FIPS mode would be enabled by default.
|
|
||||||
- # Has no effect on all other installations.
|
|
||||||
- OpenSSL.fips_mode=false
|
|
||||||
rescue LoadError
|
|
||||||
end
|
|
||||||
|
|
||||||
--
|
|
||||||
2.41.0
|
|
||||||
|
|
|
@ -1,73 +0,0 @@
|
||||||
From b6d7cdc2bad0eadbca73f3486917f0ec7a475814 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Kazuki Yamaguchi <k@rhe.jp>
|
|
||||||
Date: Tue, 29 Aug 2023 19:46:02 +0900
|
|
||||||
Subject: [PATCH] [ruby/openssl] ssl: use ffdhe2048 from RFC 7919 as the
|
|
||||||
default DH group parameters
|
|
||||||
|
|
||||||
In TLS 1.2 or before, if DH group parameters for DHE are not supplied
|
|
||||||
with SSLContext#tmp_dh= or #tmp_dh_callback=, we currently use the
|
|
||||||
self-generated parameters added in commit https://github.com/ruby/openssl/commit/bb3399a61c03 ("support 2048
|
|
||||||
bit length DH-key", 2016-01-15) as the fallback.
|
|
||||||
|
|
||||||
While there is no known weakness in the current parameters, it would be
|
|
||||||
a good idea to switch to pre-defined, more well audited parameters.
|
|
||||||
|
|
||||||
This also allows the fallback to work in the FIPS mode.
|
|
||||||
|
|
||||||
The PEM encoding was derived with:
|
|
||||||
|
|
||||||
# RFC 7919 Appendix A.1. ffdhe2048
|
|
||||||
print OpenSSL::PKey.read(OpenSSL::ASN1::Sequence([OpenSSL::ASN1::Integer((<<-END).split.join.to_i(16)), OpenSSL::ASN1::Integer(2)]).to_der).to_pem
|
|
||||||
FFFFFFFF FFFFFFFF ADF85458 A2BB4A9A AFDC5620 273D3CF1
|
|
||||||
D8B9C583 CE2D3695 A9E13641 146433FB CC939DCE 249B3EF9
|
|
||||||
7D2FE363 630C75D8 F681B202 AEC4617A D3DF1ED5 D5FD6561
|
|
||||||
2433F51F 5F066ED0 85636555 3DED1AF3 B557135E 7F57C935
|
|
||||||
984F0C70 E0E68B77 E2A689DA F3EFE872 1DF158A1 36ADE735
|
|
||||||
30ACCA4F 483A797A BC0AB182 B324FB61 D108A94B B2C8E3FB
|
|
||||||
B96ADAB7 60D7F468 1D4F42A3 DE394DF4 AE56EDE7 6372BB19
|
|
||||||
0B07A7C8 EE0A6D70 9E02FCE1 CDF7E2EC C03404CD 28342F61
|
|
||||||
9172FE9C E98583FF 8E4F1232 EEF28183 C3FE3B1B 4C6FAD73
|
|
||||||
3BB5FCBC 2EC22005 C58EF183 7D1683B2 C6F34A26 C1B2EFFA
|
|
||||||
886B4238 61285C97 FFFFFFFF FFFFFFFF
|
|
||||||
END
|
|
||||||
|
|
||||||
https://github.com/ruby/openssl/commit/a5527cb4f4
|
|
||||||
---
|
|
||||||
ext/openssl/lib/openssl/ssl.rb | 18 +++++++++---------
|
|
||||||
1 file changed, 9 insertions(+), 9 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/ext/openssl/lib/openssl/ssl.rb b/ext/openssl/lib/openssl/ssl.rb
|
|
||||||
index ea8bb2a18e533..94be6ba80b894 100644
|
|
||||||
--- a/ext/openssl/lib/openssl/ssl.rb
|
|
||||||
+++ b/ext/openssl/lib/openssl/ssl.rb
|
|
||||||
@@ -31,21 +31,21 @@ class SSLContext
|
|
||||||
}
|
|
||||||
|
|
||||||
if defined?(OpenSSL::PKey::DH)
|
|
||||||
- DEFAULT_2048 = OpenSSL::PKey::DH.new <<-_end_of_pem_
|
|
||||||
+ DH_ffdhe2048 = OpenSSL::PKey::DH.new <<-_end_of_pem_
|
|
||||||
-----BEGIN DH PARAMETERS-----
|
|
||||||
-MIIBCAKCAQEA7E6kBrYiyvmKAMzQ7i8WvwVk9Y/+f8S7sCTN712KkK3cqd1jhJDY
|
|
||||||
-JbrYeNV3kUIKhPxWHhObHKpD1R84UpL+s2b55+iMd6GmL7OYmNIT/FccKhTcveab
|
|
||||||
-VBmZT86BZKYyf45hUF9FOuUM9xPzuK3Vd8oJQvfYMCd7LPC0taAEljQLR4Edf8E6
|
|
||||||
-YoaOffgTf5qxiwkjnlVZQc3whgnEt9FpVMvQ9eknyeGB5KHfayAc3+hUAvI3/Cr3
|
|
||||||
-1bNveX5wInh5GDx1FGhKBZ+s1H+aedudCm7sCgRwv8lKWYGiHzObSma8A86KG+MD
|
|
||||||
-7Lo5JquQ3DlBodj3IDyPrxIv96lvRPFtAwIBAg==
|
|
||||||
+MIIBCAKCAQEA//////////+t+FRYortKmq/cViAnPTzx2LnFg84tNpWp4TZBFGQz
|
|
||||||
++8yTnc4kmz75fS/jY2MMddj2gbICrsRhetPfHtXV/WVhJDP1H18GbtCFY2VVPe0a
|
|
||||||
+87VXE15/V8k1mE8McODmi3fipona8+/och3xWKE2rec1MKzKT0g6eXq8CrGCsyT7
|
|
||||||
+YdEIqUuyyOP7uWrat2DX9GgdT0Kj3jlN9K5W7edjcrsZCwenyO4KbXCeAvzhzffi
|
|
||||||
+7MA0BM0oNC9hkXL+nOmFg/+OTxIy7vKBg8P+OxtMb61zO7X8vC7CIAXFjvGDfRaD
|
|
||||||
+ssbzSibBsu/6iGtCOGEoXJf//////////wIBAg==
|
|
||||||
-----END DH PARAMETERS-----
|
|
||||||
_end_of_pem_
|
|
||||||
- private_constant :DEFAULT_2048
|
|
||||||
+ private_constant :DH_ffdhe2048
|
|
||||||
|
|
||||||
DEFAULT_TMP_DH_CALLBACK = lambda { |ctx, is_export, keylen| # :nodoc:
|
|
||||||
warn "using default DH parameters." if $VERBOSE
|
|
||||||
- DEFAULT_2048
|
|
||||||
+ DH_ffdhe2048
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
|
@ -1,177 +0,0 @@
|
||||||
From 40451afa279c52ce7a508f8a9ec553cfe7a76a10 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jun Aruga <jaruga@redhat.com>
|
|
||||||
Date: Wed, 12 Apr 2023 17:15:21 +0200
|
|
||||||
Subject: [PATCH] Fix OpenSSL::PKey.read in OpenSSL 3 FIPS module.
|
|
||||||
|
|
||||||
This is a combination of the following 2 commits. Because the combined patch is
|
|
||||||
easy to merge.
|
|
||||||
|
|
||||||
This is the 1st commit message:
|
|
||||||
|
|
||||||
[ruby/openssl] Workaround: Fix OpenSSL::PKey.read that cannot parse PKey in the FIPS mode.
|
|
||||||
|
|
||||||
This commit is a workaround to avoid the error below that the
|
|
||||||
`OpenSSL::PKey.read` fails with the OpenSSL 3.0 FIPS mode.
|
|
||||||
|
|
||||||
```
|
|
||||||
$ openssl genrsa -out key.pem 4096
|
|
||||||
|
|
||||||
$ ruby -e "require 'openssl'; OpenSSL::PKey.read(File.read('key.pem'))"
|
|
||||||
-e:1:in `read': Could not parse PKey (OpenSSL::PKey::PKeyError)
|
|
||||||
from -e:1:in `<main>'
|
|
||||||
```
|
|
||||||
|
|
||||||
The root cause is on the OpenSSL side. The `OSSL_DECODER_CTX_set_selection`
|
|
||||||
doesn't apply the selection value properly if there are multiple providers, and
|
|
||||||
a provider (e.g. "base" provider) handles the decoder implementation, and
|
|
||||||
another provider (e.g. "fips" provider) handles the keys.
|
|
||||||
|
|
||||||
The workaround is to create `OSSL_DECODER_CTX` variable each time without using
|
|
||||||
the `OSSL_DECODER_CTX_set_selection`.
|
|
||||||
|
|
||||||
https://github.com/ruby/openssl/commit/5ff4a31621
|
|
||||||
|
|
||||||
This is the commit message #2:
|
|
||||||
|
|
||||||
[ruby/openssl] ossl_pkey.c: Workaround: Decode with non-zero selections.
|
|
||||||
|
|
||||||
This is a workaround for the decoding issue in ossl_pkey_read_generic().
|
|
||||||
The issue happens in the case that a key management provider is different from
|
|
||||||
a decoding provider.
|
|
||||||
|
|
||||||
Try all the non-zero selections in order, instead of selection 0 for OpenSSL 3
|
|
||||||
to avoid the issue.
|
|
||||||
|
|
||||||
https://github.com/ruby/openssl/commit/db688fa739
|
|
||||||
---
|
|
||||||
ext/openssl/ossl_pkey.c | 96 +++++++++++++++++++++++++++++++++--------
|
|
||||||
1 file changed, 79 insertions(+), 17 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/ext/openssl/ossl_pkey.c b/ext/openssl/ossl_pkey.c
|
|
||||||
index 24d0da4683..15854aeca1 100644
|
|
||||||
--- a/ext/openssl/ossl_pkey.c
|
|
||||||
+++ b/ext/openssl/ossl_pkey.c
|
|
||||||
@@ -82,41 +82,103 @@ ossl_pkey_new(EVP_PKEY *pkey)
|
|
||||||
#if OSSL_OPENSSL_PREREQ(3, 0, 0)
|
|
||||||
# include <openssl/decoder.h>
|
|
||||||
|
|
||||||
-EVP_PKEY *
|
|
||||||
-ossl_pkey_read_generic(BIO *bio, VALUE pass)
|
|
||||||
+static EVP_PKEY *
|
|
||||||
+ossl_pkey_read(BIO *bio, const char *input_type, int selection, VALUE pass)
|
|
||||||
{
|
|
||||||
void *ppass = (void *)pass;
|
|
||||||
OSSL_DECODER_CTX *dctx;
|
|
||||||
EVP_PKEY *pkey = NULL;
|
|
||||||
int pos = 0, pos2;
|
|
||||||
|
|
||||||
- dctx = OSSL_DECODER_CTX_new_for_pkey(&pkey, "DER", NULL, NULL, 0, NULL, NULL);
|
|
||||||
+ dctx = OSSL_DECODER_CTX_new_for_pkey(&pkey, input_type, NULL, NULL,
|
|
||||||
+ selection, NULL, NULL);
|
|
||||||
if (!dctx)
|
|
||||||
goto out;
|
|
||||||
- if (OSSL_DECODER_CTX_set_pem_password_cb(dctx, ossl_pem_passwd_cb, ppass) != 1)
|
|
||||||
+ if (OSSL_DECODER_CTX_set_pem_password_cb(dctx, ossl_pem_passwd_cb,
|
|
||||||
+ ppass) != 1)
|
|
||||||
goto out;
|
|
||||||
-
|
|
||||||
- /* First check DER */
|
|
||||||
- if (OSSL_DECODER_from_bio(dctx, bio) == 1)
|
|
||||||
- goto out;
|
|
||||||
-
|
|
||||||
- /* Then check PEM; multiple OSSL_DECODER_from_bio() calls may be needed */
|
|
||||||
- OSSL_BIO_reset(bio);
|
|
||||||
- if (OSSL_DECODER_CTX_set_input_type(dctx, "PEM") != 1)
|
|
||||||
- goto out;
|
|
||||||
- while (OSSL_DECODER_from_bio(dctx, bio) != 1) {
|
|
||||||
- if (BIO_eof(bio))
|
|
||||||
+ while (1) {
|
|
||||||
+ if (OSSL_DECODER_from_bio(dctx, bio) == 1)
|
|
||||||
goto out;
|
|
||||||
+ if (BIO_eof(bio))
|
|
||||||
+ break;
|
|
||||||
pos2 = BIO_tell(bio);
|
|
||||||
if (pos2 < 0 || pos2 <= pos)
|
|
||||||
- goto out;
|
|
||||||
+ break;
|
|
||||||
+ ossl_clear_error();
|
|
||||||
pos = pos2;
|
|
||||||
}
|
|
||||||
-
|
|
||||||
out:
|
|
||||||
+ OSSL_BIO_reset(bio);
|
|
||||||
OSSL_DECODER_CTX_free(dctx);
|
|
||||||
return pkey;
|
|
||||||
}
|
|
||||||
+
|
|
||||||
+EVP_PKEY *
|
|
||||||
+ossl_pkey_read_generic(BIO *bio, VALUE pass)
|
|
||||||
+{
|
|
||||||
+ EVP_PKEY *pkey = NULL;
|
|
||||||
+ /* First check DER, then check PEM. */
|
|
||||||
+ const char *input_types[] = {"DER", "PEM"};
|
|
||||||
+ int input_type_num = (int)(sizeof(input_types) / sizeof(char *));
|
|
||||||
+ /*
|
|
||||||
+ * Non-zero selections to try to decode.
|
|
||||||
+ *
|
|
||||||
+ * See EVP_PKEY_fromdata(3) - Selections to see all the selections.
|
|
||||||
+ *
|
|
||||||
+ * This is a workaround for the decoder failing to decode or returning
|
|
||||||
+ * bogus keys with selection 0, if a key management provider is different
|
|
||||||
+ * from a decoder provider. The workaround is to avoid using selection 0.
|
|
||||||
+ *
|
|
||||||
+ * Affected OpenSSL versions: >= 3.1.0, <= 3.1.2, or >= 3.0.0, <= 3.0.10
|
|
||||||
+ * Fixed OpenSSL versions: 3.2, next release of the 3.1.z and 3.0.z
|
|
||||||
+ *
|
|
||||||
+ * See https://github.com/openssl/openssl/pull/21519 for details.
|
|
||||||
+ *
|
|
||||||
+ * First check for private key formats (EVP_PKEY_KEYPAIR). This is to keep
|
|
||||||
+ * compatibility with ruby/openssl < 3.0 which decoded the following as a
|
|
||||||
+ * private key.
|
|
||||||
+ *
|
|
||||||
+ * $ openssl ecparam -name prime256v1 -genkey -outform PEM
|
|
||||||
+ * -----BEGIN EC PARAMETERS-----
|
|
||||||
+ * BggqhkjOPQMBBw==
|
|
||||||
+ * -----END EC PARAMETERS-----
|
|
||||||
+ * -----BEGIN EC PRIVATE KEY-----
|
|
||||||
+ * MHcCAQEEIAG8ugBbA5MHkqnZ9ujQF93OyUfL9tk8sxqM5Wv5tKg5oAoGCCqGSM49
|
|
||||||
+ * AwEHoUQDQgAEVcjhJfkwqh5C7kGuhAf8XaAjVuG5ADwb5ayg/cJijCgs+GcXeedj
|
|
||||||
+ * 86avKpGH84DXUlB23C/kPt+6fXYlitUmXQ==
|
|
||||||
+ * -----END EC PRIVATE KEY-----
|
|
||||||
+ *
|
|
||||||
+ * While the first PEM block is a proper encoding of ECParameters, thus
|
|
||||||
+ * OSSL_DECODER_from_bio() would pick it up, ruby/openssl used to return
|
|
||||||
+ * the latter instead. Existing applications expect this behavior.
|
|
||||||
+ *
|
|
||||||
+ * Note that normally, the input is supposed to contain a single decodable
|
|
||||||
+ * PEM block only, so this special handling should not create a new problem.
|
|
||||||
+ *
|
|
||||||
+ * Note that we need to create the OSSL_DECODER_CTX variable each time when
|
|
||||||
+ * we use the different selection as a workaround.
|
|
||||||
+ * See https://github.com/openssl/openssl/issues/20657 for details.
|
|
||||||
+ */
|
|
||||||
+ int selections[] = {
|
|
||||||
+ EVP_PKEY_KEYPAIR,
|
|
||||||
+ EVP_PKEY_KEY_PARAMETERS,
|
|
||||||
+ EVP_PKEY_PUBLIC_KEY
|
|
||||||
+ };
|
|
||||||
+ int selection_num = (int)(sizeof(selections) / sizeof(int));
|
|
||||||
+ int i, j;
|
|
||||||
+
|
|
||||||
+ for (i = 0; i < input_type_num; i++) {
|
|
||||||
+ for (j = 0; j < selection_num; j++) {
|
|
||||||
+ pkey = ossl_pkey_read(bio, input_types[i], selections[j], pass);
|
|
||||||
+ if (pkey) {
|
|
||||||
+ goto out;
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ out:
|
|
||||||
+ return pkey;
|
|
||||||
+}
|
|
||||||
#else
|
|
||||||
EVP_PKEY *
|
|
||||||
ossl_pkey_read_generic(BIO *bio, VALUE pass)
|
|
||||||
--
|
|
||||||
2.41.0
|
|
||||||
|
|
|
@ -1,142 +0,0 @@
|
||||||
From 29920ec109751459a65c6478525f2e59c644891f Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jun Aruga <jaruga@redhat.com>
|
|
||||||
Date: Thu, 16 Mar 2023 21:36:43 +0100
|
|
||||||
Subject: [PATCH] [ruby/openssl] Implement FIPS functions on OpenSSL 3.
|
|
||||||
|
|
||||||
This commit is to implement the `OpenSSL::OPENSSL_FIPS`, `ossl_fips_mode_get`
|
|
||||||
and `ossl_fips_mode_set` to pass the test `test/openssl/test_fips.rb`.
|
|
||||||
|
|
||||||
It seems that the `OPENSSL_FIPS` macro is not used on the FIPS mode case any
|
|
||||||
more, and some FIPS related APIs also were removed in OpenSSL 3.
|
|
||||||
|
|
||||||
See the document <https://github.com/openssl/openssl/blob/master/doc/man7/migration_guide.pod#removed-fips_mode-and-fips_mode_set>
|
|
||||||
the section OPENSSL 3.0 > Main Changes from OpenSSL 1.1.1 >
|
|
||||||
Other notable deprecations and changes - Removed FIPS_mode() and FIPS_mode_set() .
|
|
||||||
|
|
||||||
The `OpenSSL::OPENSSL_FIPS` returns always true in OpenSSL 3 because the used
|
|
||||||
functions `EVP_default_properties_enable_fips` and `EVP_default_properties_is_fips_enabled`
|
|
||||||
works with the OpenSSL installed without FIPS option.
|
|
||||||
|
|
||||||
The `TEST_RUBY_OPENSSL_FIPS_ENABLED` is set on the FIPS mode case on the CI.
|
|
||||||
Because I want to test that the `OpenSSL.fips_mode` returns the `true` or
|
|
||||||
'false' surely in the CI. You can test the FIPS mode case by setting
|
|
||||||
`TEST_RUBY_OPENSSL_FIPS_ENABLED` on local too. Right now I don't find a better
|
|
||||||
way to get the status of the FIPS mode enabled or disabled for this purpose. I
|
|
||||||
am afraid of the possibility that the FIPS test case is unintentionally skipped.
|
|
||||||
|
|
||||||
I also replaced the ambiguous "returns" with "should return" in the tests.
|
|
||||||
|
|
||||||
https://github.com/ruby/openssl/commit/c5b2bc1268
|
|
||||||
---
|
|
||||||
ext/openssl/ossl.c | 25 +++++++++++++++++++++----
|
|
||||||
test/openssl/test_fips.rb | 32 ++++++++++++++++++++++++++++----
|
|
||||||
2 files changed, 49 insertions(+), 8 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/ext/openssl/ossl.c b/ext/openssl/ossl.c
|
|
||||||
index 6c532aca94..fcf3744c65 100644
|
|
||||||
--- a/ext/openssl/ossl.c
|
|
||||||
+++ b/ext/openssl/ossl.c
|
|
||||||
@@ -418,7 +418,11 @@ static VALUE
|
|
||||||
ossl_fips_mode_get(VALUE self)
|
|
||||||
{
|
|
||||||
|
|
||||||
-#ifdef OPENSSL_FIPS
|
|
||||||
+#if OSSL_OPENSSL_PREREQ(3, 0, 0)
|
|
||||||
+ VALUE enabled;
|
|
||||||
+ enabled = EVP_default_properties_is_fips_enabled(NULL) ? Qtrue : Qfalse;
|
|
||||||
+ return enabled;
|
|
||||||
+#elif OPENSSL_FIPS
|
|
||||||
VALUE enabled;
|
|
||||||
enabled = FIPS_mode() ? Qtrue : Qfalse;
|
|
||||||
return enabled;
|
|
||||||
@@ -442,8 +446,18 @@ ossl_fips_mode_get(VALUE self)
|
|
||||||
static VALUE
|
|
||||||
ossl_fips_mode_set(VALUE self, VALUE enabled)
|
|
||||||
{
|
|
||||||
-
|
|
||||||
-#ifdef OPENSSL_FIPS
|
|
||||||
+#if OSSL_OPENSSL_PREREQ(3, 0, 0)
|
|
||||||
+ if (RTEST(enabled)) {
|
|
||||||
+ if (!EVP_default_properties_enable_fips(NULL, 1)) {
|
|
||||||
+ ossl_raise(eOSSLError, "Turning on FIPS mode failed");
|
|
||||||
+ }
|
|
||||||
+ } else {
|
|
||||||
+ if (!EVP_default_properties_enable_fips(NULL, 0)) {
|
|
||||||
+ ossl_raise(eOSSLError, "Turning off FIPS mode failed");
|
|
||||||
+ }
|
|
||||||
+ }
|
|
||||||
+ return enabled;
|
|
||||||
+#elif OPENSSL_FIPS
|
|
||||||
if (RTEST(enabled)) {
|
|
||||||
int mode = FIPS_mode();
|
|
||||||
if(!mode && !FIPS_mode_set(1)) /* turning on twice leads to an error */
|
|
||||||
@@ -1198,7 +1212,10 @@ Init_openssl(void)
|
|
||||||
* Boolean indicating whether OpenSSL is FIPS-capable or not
|
|
||||||
*/
|
|
||||||
rb_define_const(mOSSL, "OPENSSL_FIPS",
|
|
||||||
-#ifdef OPENSSL_FIPS
|
|
||||||
+/* OpenSSL 3 is FIPS-capable even when it is installed without fips option */
|
|
||||||
+#if OSSL_OPENSSL_PREREQ(3, 0, 0)
|
|
||||||
+ Qtrue
|
|
||||||
+#elif OPENSSL_FIPS
|
|
||||||
Qtrue
|
|
||||||
#else
|
|
||||||
Qfalse
|
|
||||||
diff --git a/test/openssl/test_fips.rb b/test/openssl/test_fips.rb
|
|
||||||
index 8cd474f9a3..56a12a94ce 100644
|
|
||||||
--- a/test/openssl/test_fips.rb
|
|
||||||
+++ b/test/openssl/test_fips.rb
|
|
||||||
@@ -4,22 +4,46 @@
|
|
||||||
if defined?(OpenSSL)
|
|
||||||
|
|
||||||
class OpenSSL::TestFIPS < OpenSSL::TestCase
|
|
||||||
+ def test_fips_mode_get_is_true_on_fips_mode_enabled
|
|
||||||
+ unless ENV["TEST_RUBY_OPENSSL_FIPS_ENABLED"]
|
|
||||||
+ omit "Only for FIPS mode environment"
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ assert_separately([{ "OSSL_MDEBUG" => nil }, "-ropenssl"], <<~"end;")
|
|
||||||
+ assert OpenSSL.fips_mode == true, ".fips_mode should return true on FIPS mode enabled"
|
|
||||||
+ end;
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ def test_fips_mode_get_is_false_on_fips_mode_disabled
|
|
||||||
+ if ENV["TEST_RUBY_OPENSSL_FIPS_ENABLED"]
|
|
||||||
+ omit "Only for non-FIPS mode environment"
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ assert_separately([{ "OSSL_MDEBUG" => nil }, "-ropenssl"], <<~"end;")
|
|
||||||
+ message = ".fips_mode should return false on FIPS mode disabled. " \
|
|
||||||
+ "If you run the test on FIPS mode, please set " \
|
|
||||||
+ "TEST_RUBY_OPENSSL_FIPS_ENABLED=true"
|
|
||||||
+ assert OpenSSL.fips_mode == false, message
|
|
||||||
+ end;
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
def test_fips_mode_is_reentrant
|
|
||||||
OpenSSL.fips_mode = false
|
|
||||||
OpenSSL.fips_mode = false
|
|
||||||
end
|
|
||||||
|
|
||||||
- def test_fips_mode_get
|
|
||||||
- return unless OpenSSL::OPENSSL_FIPS
|
|
||||||
+ def test_fips_mode_get_with_fips_mode_set
|
|
||||||
+ omit('OpenSSL is not FIPS-capable') unless OpenSSL::OPENSSL_FIPS
|
|
||||||
+
|
|
||||||
assert_separately([{ "OSSL_MDEBUG" => nil }, "-ropenssl"], <<~"end;")
|
|
||||||
require #{__FILE__.dump}
|
|
||||||
|
|
||||||
begin
|
|
||||||
OpenSSL.fips_mode = true
|
|
||||||
- assert OpenSSL.fips_mode == true, ".fips_mode returns true when .fips_mode=true"
|
|
||||||
+ assert OpenSSL.fips_mode == true, ".fips_mode should return true when .fips_mode=true"
|
|
||||||
|
|
||||||
OpenSSL.fips_mode = false
|
|
||||||
- assert OpenSSL.fips_mode == false, ".fips_mode returns false when .fips_mode=false"
|
|
||||||
+ assert OpenSSL.fips_mode == false, ".fips_mode should return false when .fips_mode=false"
|
|
||||||
rescue OpenSSL::OpenSSLError
|
|
||||||
pend "Could not set FIPS mode (OpenSSL::OpenSSLError: \#$!); skipping"
|
|
||||||
end
|
|
||||||
--
|
|
||||||
2.41.0
|
|
||||||
|
|
|
@ -0,0 +1,241 @@
|
||||||
|
From c3655b89e7c06555a2e0bf13affb8a63a49f4296 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jarek Prokop <jprokop@redhat.com>
|
||||||
|
Date: Fri, 26 Jan 2024 11:19:48 +0100
|
||||||
|
Subject: [PATCH] Revert "Set AI_ADDRCONFIG when making getaddrinfo(3) calls
|
||||||
|
for outgoing conns (#7295)"
|
||||||
|
|
||||||
|
This reverts commit d2ba8ea54a4089959afdeecdd963e3c4ff391748.
|
||||||
|
|
||||||
|
The purpose of the commit is to workaround a GLIBC bug [0] still present
|
||||||
|
in older Ubuntu [1]. C8S/RHEL 8 has the fix for some time [2] and the
|
||||||
|
Ruby workaround is causing problems for us [3]. Therefore we can
|
||||||
|
revert it for EL8, EL9, and Fedora distros.
|
||||||
|
|
||||||
|
[0] https://sourceware.org/bugzilla/show_bug.cgi?id=26600
|
||||||
|
[1] https://bugs.launchpad.net/ubuntu/+source/glibc/+bug/1961697
|
||||||
|
[2] https://bugzilla.redhat.com/show_bug.cgi?id=1868106
|
||||||
|
[3] https://bugs.ruby-lang.org/issues/20208
|
||||||
|
---
|
||||||
|
ext/socket/extconf.rb | 2 -
|
||||||
|
ext/socket/ipsocket.c | 11 +--
|
||||||
|
test/socket/test_tcp.rb | 164 ----------------------------------------
|
||||||
|
3 files changed, 2 insertions(+), 175 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/ext/socket/extconf.rb b/ext/socket/extconf.rb
|
||||||
|
index 544bed5298..1ca52da366 100644
|
||||||
|
--- a/ext/socket/extconf.rb
|
||||||
|
+++ b/ext/socket/extconf.rb
|
||||||
|
@@ -607,8 +607,6 @@ def %(s) s || self end
|
||||||
|
EOS
|
||||||
|
end
|
||||||
|
|
||||||
|
- have_const('AI_ADDRCONFIG', headers)
|
||||||
|
-
|
||||||
|
case with_config("lookup-order-hack", "UNSPEC")
|
||||||
|
when "INET"
|
||||||
|
$defs << "-DLOOKUP_ORDER_HACK_INET"
|
||||||
|
diff --git a/ext/socket/ipsocket.c b/ext/socket/ipsocket.c
|
||||||
|
index 0a693655b4..0c13620258 100644
|
||||||
|
--- a/ext/socket/ipsocket.c
|
||||||
|
+++ b/ext/socket/ipsocket.c
|
||||||
|
@@ -54,22 +54,15 @@ init_inetsock_internal(VALUE v)
|
||||||
|
VALUE connect_timeout = arg->connect_timeout;
|
||||||
|
struct timeval tv_storage;
|
||||||
|
struct timeval *tv = NULL;
|
||||||
|
- int remote_addrinfo_hints = 0;
|
||||||
|
|
||||||
|
if (!NIL_P(connect_timeout)) {
|
||||||
|
tv_storage = rb_time_interval(connect_timeout);
|
||||||
|
tv = &tv_storage;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (type == INET_SERVER) {
|
||||||
|
- remote_addrinfo_hints |= AI_PASSIVE;
|
||||||
|
- }
|
||||||
|
-#ifdef HAVE_CONST_AI_ADDRCONFIG
|
||||||
|
- remote_addrinfo_hints |= AI_ADDRCONFIG;
|
||||||
|
-#endif
|
||||||
|
-
|
||||||
|
arg->remote.res = rsock_addrinfo(arg->remote.host, arg->remote.serv,
|
||||||
|
- family, SOCK_STREAM, remote_addrinfo_hints);
|
||||||
|
+ family, SOCK_STREAM,
|
||||||
|
+ (type == INET_SERVER) ? AI_PASSIVE : 0);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
diff --git a/test/socket/test_tcp.rb b/test/socket/test_tcp.rb
|
||||||
|
index 35d361f060..7f9dc53cae 100644
|
||||||
|
--- a/test/socket/test_tcp.rb
|
||||||
|
+++ b/test/socket/test_tcp.rb
|
||||||
|
@@ -140,168 +140,4 @@ def test_accept_multithread
|
||||||
|
server_threads.each(&:join)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
-
|
||||||
|
- def test_ai_addrconfig
|
||||||
|
- # This test verifies that we pass AI_ADDRCONFIG to the DNS resolver when making
|
||||||
|
- # an outgoing connection.
|
||||||
|
- # The verification of this is unfortunately incredibly convoluted. We perform the
|
||||||
|
- # test by setting up a fake DNS server to receive queries. Then, we construct
|
||||||
|
- # an environment which has only IPv4 addresses and uses that fake DNS server. We
|
||||||
|
- # then attempt to make an outgoing TCP connection. Finally, we verify that we
|
||||||
|
- # only received A and not AAAA queries on our fake resolver.
|
||||||
|
- # This test can only possibly work on Linux, and only when run as root. If either
|
||||||
|
- # of these conditions aren't met, the test will be skipped.
|
||||||
|
-
|
||||||
|
- # The construction of our IPv6-free environment must happen in a child process,
|
||||||
|
- # which we can put in its own network & mount namespaces.
|
||||||
|
-
|
||||||
|
- omit "This test is disabled. It is retained to show the original intent of [ruby-core:110870]"
|
||||||
|
-
|
||||||
|
- IO.popen("-") do |test_io|
|
||||||
|
- if test_io.nil?
|
||||||
|
- begin
|
||||||
|
- # Child program
|
||||||
|
- require 'fiddle'
|
||||||
|
- require 'resolv'
|
||||||
|
- require 'open3'
|
||||||
|
-
|
||||||
|
- libc = Fiddle.dlopen(nil)
|
||||||
|
- begin
|
||||||
|
- unshare = Fiddle::Function.new(libc['unshare'], [Fiddle::TYPE_INT], Fiddle::TYPE_INT)
|
||||||
|
- rescue Fiddle::DLError
|
||||||
|
- # Test can't run because we don't have unshare(2) in libc
|
||||||
|
- # This will be the case on not-linux, and also on very old glibc versions (or
|
||||||
|
- # possibly other libc's that don't expose this syscall wrapper)
|
||||||
|
- $stdout.write(Marshal.dump({result: :skip, reason: "unshare(2) or mount(2) not in libc"}))
|
||||||
|
- exit
|
||||||
|
- end
|
||||||
|
-
|
||||||
|
- # Move our test process into a new network & mount namespace.
|
||||||
|
- # This environment will be configured to be IPv6 free and point DNS resolution
|
||||||
|
- # at a fake DNS server.
|
||||||
|
- # (n.b. these flags are CLONE_NEWNS | CLONE_NEWNET)
|
||||||
|
- ret = unshare.call(0x00020000 | 0x40000000)
|
||||||
|
- errno = Fiddle.last_error
|
||||||
|
- if ret == -1 && errno == Errno::EPERM::Errno
|
||||||
|
- # Test can't run because we're not root.
|
||||||
|
- $stdout.write(Marshal.dump({result: :skip, reason: "insufficient permissions to unshare namespaces"}))
|
||||||
|
- exit
|
||||||
|
- elsif ret == -1 && (errno == Errno::ENOSYS::Errno || errno == Errno::EINVAL::Errno)
|
||||||
|
- # No unshare(2) in the kernel (or kernel too old to know about this namespace type)
|
||||||
|
- $stdout.write(Marshal.dump({result: :skip, reason: "errno #{errno} calling unshare(2)"}))
|
||||||
|
- exit
|
||||||
|
- elsif ret == -1
|
||||||
|
- # Unexpected failure
|
||||||
|
- raise "errno #{errno} calling unshare(2)"
|
||||||
|
- end
|
||||||
|
-
|
||||||
|
- # Set up our fake DNS environment. Clean out /etc/hosts...
|
||||||
|
- fake_hosts_file = Tempfile.new('ruby_test_hosts')
|
||||||
|
- fake_hosts_file.write <<~HOSTS
|
||||||
|
- 127.0.0.1 localhost
|
||||||
|
- ::1 localhost
|
||||||
|
- HOSTS
|
||||||
|
- fake_hosts_file.flush
|
||||||
|
-
|
||||||
|
- # Have /etc/resolv.conf point to 127.0.0.1...
|
||||||
|
- fake_resolv_conf = Tempfile.new('ruby_test_resolv')
|
||||||
|
- fake_resolv_conf.write <<~RESOLV
|
||||||
|
- nameserver 127.0.0.1
|
||||||
|
- RESOLV
|
||||||
|
- fake_resolv_conf.flush
|
||||||
|
-
|
||||||
|
- # Also stub out /etc/nsswitch.conf; glibc can have other resolver modules
|
||||||
|
- # (like systemd-resolved) configured in there other than just using dns,
|
||||||
|
- # so rewrite it to remove any `hosts:` lines and add one which just uses
|
||||||
|
- # dns.
|
||||||
|
- real_nsswitch_conf = File.read('/etc/nsswitch.conf') rescue ""
|
||||||
|
- fake_nsswitch_conf = Tempfile.new('ruby_test_nsswitch')
|
||||||
|
- real_nsswitch_conf.lines.reject { _1 =~ /^\s*hosts:/ }.each do |ln|
|
||||||
|
- fake_nsswitch_conf.puts ln
|
||||||
|
- end
|
||||||
|
- fake_nsswitch_conf.puts "hosts: files myhostname dns"
|
||||||
|
- fake_nsswitch_conf.flush
|
||||||
|
-
|
||||||
|
- # This is needed to make sure our bind-mounds aren't visible outside this process.
|
||||||
|
- system 'mount', '--make-rprivate', '/', exception: true
|
||||||
|
- # Bind-mount the fake files over the top of the real files.
|
||||||
|
- system 'mount', '--bind', '--make-private', fake_hosts_file.path, '/etc/hosts', exception: true
|
||||||
|
- system 'mount', '--bind', '--make-private', fake_resolv_conf.path, '/etc/resolv.conf', exception: true
|
||||||
|
- system 'mount', '--bind', '--make-private', fake_nsswitch_conf.path, '/etc/nsswitch.conf', exception: true
|
||||||
|
-
|
||||||
|
- # Create a dummy interface with only an IPv4 address
|
||||||
|
- system 'ip', 'link', 'add', 'dummy0', 'type', 'dummy', exception: true
|
||||||
|
- system 'ip', 'addr', 'add', '192.168.1.2/24', 'dev', 'dummy0', exception: true
|
||||||
|
- system 'ip', 'link', 'set', 'dummy0', 'up', exception: true
|
||||||
|
- system 'ip', 'link', 'set', 'lo', 'up', exception: true
|
||||||
|
-
|
||||||
|
- # Disable IPv6 on this interface (this is needed to disable the link-local
|
||||||
|
- # IPv6 address)
|
||||||
|
- File.open('/proc/sys/net/ipv6/conf/dummy0/disable_ipv6', 'w') do |f|
|
||||||
|
- f.puts "1"
|
||||||
|
- end
|
||||||
|
-
|
||||||
|
- # Create a fake DNS server which will receive the DNS queries triggered by TCPSocket.new
|
||||||
|
- fake_dns_server_socket = UDPSocket.new
|
||||||
|
- fake_dns_server_socket.bind('127.0.0.1', 53)
|
||||||
|
- received_dns_queries = []
|
||||||
|
- fake_dns_server_thread = Thread.new do
|
||||||
|
- Socket.udp_server_loop_on([fake_dns_server_socket]) do |msg, msg_src|
|
||||||
|
- request = Resolv::DNS::Message.decode(msg)
|
||||||
|
- received_dns_queries << request
|
||||||
|
- response = request.dup.tap do |r|
|
||||||
|
- r.qr = 0
|
||||||
|
- r.rcode = 3 # NXDOMAIN
|
||||||
|
- end
|
||||||
|
- msg_src.reply response.encode
|
||||||
|
- end
|
||||||
|
- end
|
||||||
|
-
|
||||||
|
- # Make a request which will hit our fake DNS swerver - this needs to be in _another_
|
||||||
|
- # process because glibc will cache resolver info across the fork otherwise.
|
||||||
|
- load_path_args = $LOAD_PATH.flat_map { ['-I', _1] }
|
||||||
|
- Open3.capture3('/proc/self/exe', *load_path_args, '-rsocket', '-e', <<~RUBY)
|
||||||
|
- TCPSocket.open('www.example.com', 4444)
|
||||||
|
- RUBY
|
||||||
|
-
|
||||||
|
- fake_dns_server_thread.kill
|
||||||
|
- fake_dns_server_thread.join
|
||||||
|
-
|
||||||
|
- have_aaaa_qs = received_dns_queries.any? do |query|
|
||||||
|
- query.question.any? do |question|
|
||||||
|
- question[1] == Resolv::DNS::Resource::IN::AAAA
|
||||||
|
- end
|
||||||
|
- end
|
||||||
|
-
|
||||||
|
- have_a_q = received_dns_queries.any? do |query|
|
||||||
|
- query.question.any? do |question|
|
||||||
|
- question[0].to_s == "www.example.com"
|
||||||
|
- end
|
||||||
|
- end
|
||||||
|
-
|
||||||
|
- if have_aaaa_qs
|
||||||
|
- $stdout.write(Marshal.dump({result: :fail, reason: "got AAAA queries, expected none"}))
|
||||||
|
- elsif !have_a_q
|
||||||
|
- $stdout.write(Marshal.dump({result: :fail, reason: "got no A query for example.com"}))
|
||||||
|
- else
|
||||||
|
- $stdout.write(Marshal.dump({result: :success}))
|
||||||
|
- end
|
||||||
|
- rescue => ex
|
||||||
|
- $stdout.write(Marshal.dump({result: :fail, reason: ex.full_message}))
|
||||||
|
- ensure
|
||||||
|
- # Make sure the child process does not transfer control back into the test runner.
|
||||||
|
- exit!
|
||||||
|
- end
|
||||||
|
- else
|
||||||
|
- test_result = Marshal.load(test_io.read)
|
||||||
|
-
|
||||||
|
- case test_result[:result]
|
||||||
|
- when :skip
|
||||||
|
- omit test_result[:reason]
|
||||||
|
- when :fail
|
||||||
|
- fail test_result[:reason]
|
||||||
|
- end
|
||||||
|
- end
|
||||||
|
- end
|
||||||
|
- end
|
||||||
|
end if defined?(TCPSocket)
|
||||||
|
--
|
||||||
|
2.43.0
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
From 8af8f327457738620d2c85bd65db8cc5594585db Mon Sep 17 00:00:00 2001
|
||||||
|
From: Yuta Saito <kateinoigakukun@gmail.com>
|
||||||
|
Date: Wed, 27 Dec 2023 06:22:45 +0000
|
||||||
|
Subject: [PATCH 1/2] [Bug #20085] Use consistent default options for
|
||||||
|
`-mbranch-protection`
|
||||||
|
|
||||||
|
We need to use the same options for both C compiler and assembler
|
||||||
|
when `-mbranch-protection` is guessed by configure. Otherwise,
|
||||||
|
`coroutine/arm64/Context.{h,S}` will use incompatible PAC strategies.
|
||||||
|
---
|
||||||
|
configure.ac | 3 +++
|
||||||
|
1 file changed, 3 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/configure.ac b/configure.ac
|
||||||
|
index 9286946fc1..18b4247991 100644
|
||||||
|
--- a/configure.ac
|
||||||
|
+++ b/configure.ac
|
||||||
|
@@ -830,7 +830,10 @@ AS_IF([test "$GCC" = yes], [
|
||||||
|
AS_FOR(option, opt, [-mbranch-protection=pac-ret -msign-return-address=all], [
|
||||||
|
RUBY_TRY_CFLAGS(option, [branch_protection=yes], [branch_protection=no])
|
||||||
|
AS_IF([test "x$branch_protection" = xyes], [
|
||||||
|
+ # C compiler and assembler must be consistent for -mbranch-protection
|
||||||
|
+ # since they both check `__ARM_FEATURE_PAC_DEFAULT` definition.
|
||||||
|
RUBY_APPEND_OPTION(XCFLAGS, option)
|
||||||
|
+ RUBY_APPEND_OPTION(ASFLAGS, option)
|
||||||
|
break
|
||||||
|
])
|
||||||
|
])
|
||||||
|
--
|
||||||
|
2.43.0
|
||||||
|
|
||||||
|
|
||||||
|
From 80281e14e411e8e5fe4955effbb2c650a2f52667 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Jarek Prokop <jprokop@redhat.com>
|
||||||
|
Date: Fri, 12 Jan 2024 18:33:34 +0100
|
||||||
|
Subject: [PATCH 2/2] aarch64: Prepend -mbranch-protection=standard option when
|
||||||
|
checking branch protection.
|
||||||
|
|
||||||
|
Related Upstream issue: https://bugs.ruby-lang.org/issues/20154
|
||||||
|
---
|
||||||
|
configure.ac | 2 +-
|
||||||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/configure.ac b/configure.ac
|
||||||
|
index 18b4247991..5ea8ada8f7 100644
|
||||||
|
--- a/configure.ac
|
||||||
|
+++ b/configure.ac
|
||||||
|
@@ -827,7 +827,7 @@ AS_IF([test "$GCC" = yes], [
|
||||||
|
|
||||||
|
# aarch64 branch protection
|
||||||
|
AS_CASE(["$target_cpu"], [aarch64], [
|
||||||
|
- AS_FOR(option, opt, [-mbranch-protection=pac-ret -msign-return-address=all], [
|
||||||
|
+ AS_FOR(option, opt, [-mbranch-protection=standard -mbranch-protection=pac-ret -msign-return-address=all], [
|
||||||
|
RUBY_TRY_CFLAGS(option, [branch_protection=yes], [branch_protection=no])
|
||||||
|
AS_IF([test "x$branch_protection" = xyes], [
|
||||||
|
# C compiler and assembler must be consistent for -mbranch-protection
|
||||||
|
--
|
||||||
|
2.43.0
|
||||||
|
|
|
@ -0,0 +1,256 @@
|
||||||
|
From d3933fc753187a055a4904af82f5f3794c88c416 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Sorah Fukumori <her@sorah.jp>
|
||||||
|
Date: Mon, 1 Jan 2024 20:45:54 +0900
|
||||||
|
Subject: [PATCH] [ruby/net-http] Renew test certificates
|
||||||
|
|
||||||
|
The private key is replaced with a public known test key published at
|
||||||
|
[RFC 9500].
|
||||||
|
|
||||||
|
Also lifetime has been extended to 10 years from 4 years.
|
||||||
|
|
||||||
|
[RFC 9500]: https://www.rfc-editor.org/rfc/rfc9500.html
|
||||||
|
|
||||||
|
https://github.com/ruby/net-http/commit/4ab6c4a500
|
||||||
|
---
|
||||||
|
test/net/fixtures/Makefile | 6 +--
|
||||||
|
test/net/fixtures/cacert.pem | 44 ++++++++--------
|
||||||
|
test/net/fixtures/server.crt | 99 +++++++-----------------------------
|
||||||
|
test/net/fixtures/server.key | 55 ++++++++++----------
|
||||||
|
4 files changed, 71 insertions(+), 133 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/test/net/fixtures/Makefile b/test/net/fixtures/Makefile
|
||||||
|
index b2bc9c7368ee2..88c232e3b6c16 100644
|
||||||
|
--- a/test/net/fixtures/Makefile
|
||||||
|
+++ b/test/net/fixtures/Makefile
|
||||||
|
@@ -5,11 +5,11 @@ regen_certs:
|
||||||
|
make server.crt
|
||||||
|
|
||||||
|
cacert.pem: server.key
|
||||||
|
- openssl req -new -x509 -days 1825 -key server.key -out cacert.pem -text -subj "/C=JP/ST=Shimane/L=Matz-e city/O=Ruby Core Team/CN=Ruby Test CA/emailAddress=security@ruby-lang.org"
|
||||||
|
+ openssl req -new -x509 -days 3650 -key server.key -out cacert.pem -subj "/C=JP/ST=Shimane/L=Matz-e city/O=Ruby Core Team/CN=Ruby Test CA/emailAddress=security@ruby-lang.org"
|
||||||
|
|
||||||
|
server.csr:
|
||||||
|
- openssl req -new -key server.key -out server.csr -text -subj "/C=JP/ST=Shimane/O=Ruby Core Team/OU=Ruby Test/CN=localhost"
|
||||||
|
+ openssl req -new -key server.key -out server.csr -subj "/C=JP/ST=Shimane/O=Ruby Core Team/OU=Ruby Test/CN=localhost"
|
||||||
|
|
||||||
|
server.crt: server.csr cacert.pem
|
||||||
|
- openssl x509 -days 1825 -CA cacert.pem -CAkey server.key -set_serial 00 -in server.csr -req -text -out server.crt
|
||||||
|
+ openssl x509 -days 3650 -CA cacert.pem -CAkey server.key -set_serial 00 -in server.csr -req -out server.crt
|
||||||
|
rm server.csr
|
||||||
|
diff --git a/test/net/fixtures/cacert.pem b/test/net/fixtures/cacert.pem
|
||||||
|
index f623bd62ed375..24c83f1c65225 100644
|
||||||
|
--- a/test/net/fixtures/cacert.pem
|
||||||
|
+++ b/test/net/fixtures/cacert.pem
|
||||||
|
@@ -1,24 +1,24 @@
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
-MIID7TCCAtWgAwIBAgIJAIltvxrFAuSnMA0GCSqGSIb3DQEBCwUAMIGMMQswCQYD
|
||||||
|
-VQQGEwJKUDEQMA4GA1UECAwHU2hpbWFuZTEUMBIGA1UEBwwLTWF0ei1lIGNpdHkx
|
||||||
|
-FzAVBgNVBAoMDlJ1YnkgQ29yZSBUZWFtMRUwEwYDVQQDDAxSdWJ5IFRlc3QgQ0Ex
|
||||||
|
-JTAjBgkqhkiG9w0BCQEWFnNlY3VyaXR5QHJ1YnktbGFuZy5vcmcwHhcNMTkwMTAy
|
||||||
|
-MDI1ODI4WhcNMjQwMTAxMDI1ODI4WjCBjDELMAkGA1UEBhMCSlAxEDAOBgNVBAgM
|
||||||
|
-B1NoaW1hbmUxFDASBgNVBAcMC01hdHotZSBjaXR5MRcwFQYDVQQKDA5SdWJ5IENv
|
||||||
|
-cmUgVGVhbTEVMBMGA1UEAwwMUnVieSBUZXN0IENBMSUwIwYJKoZIhvcNAQkBFhZz
|
||||||
|
-ZWN1cml0eUBydWJ5LWxhbmcub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
|
||||||
|
-CgKCAQEAznlbjRVhz1NlutHVrhcGnK8W0qug2ujKXv1njSC4U6nJF6py7I9EeehV
|
||||||
|
-SaKePyv+I9z3K1LnfUHOtUbdwdKC77yN66A6q2aqzu5q09/NSykcZGOIF0GuItYI
|
||||||
|
-3nvW3IqBddff2ffsyR+9pBjfb5AIPP08WowF9q4s1eGULwZc4w2B8PFhtxYANd7d
|
||||||
|
-BvGLXFlcufv9tDtzyRi4t7eqxCRJkZQIZNZ6DHHIJrNxejOILfHLarI12yk8VK6L
|
||||||
|
-2LG4WgGqyeePiRyd1o1MbuiAFYqAwpXNUbRKg5NaZGwBHZk8UZ+uFKt1QMBURO5R
|
||||||
|
-WFy1c349jbWszTqFyL4Lnbg9HhAowQIDAQABo1AwTjAdBgNVHQ4EFgQU9tEiKdU9
|
||||||
|
-I9derQyc5nWPnc34nVMwHwYDVR0jBBgwFoAU9tEiKdU9I9derQyc5nWPnc34nVMw
|
||||||
|
-DAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQsFAAOCAQEAxj7F/u3C3fgq24N7hGRA
|
||||||
|
-of7ClFQxGmo/IGT0AISzW3HiVYiFaikKhbO1NwD9aBpD8Zwe62sCqMh8jGV/b0+q
|
||||||
|
-aOORnWYNy2R6r9FkASAglmdF6xn3bhgGD5ls4pCvcG9FynGnGc24g6MrjFNrBYUS
|
||||||
|
-2iIZsg36i0IJswo/Dy6HLphCms2BMCD3DeWtfjePUiTmQHJo6HsQIKP/u4N4Fvee
|
||||||
|
-uMBInei2M4VU74fLXbmKl1F9AEX7JDP3BKSZG19Ch5pnUo4uXM1uNTGsi07P4Y0s
|
||||||
|
-K44+SKBC0bYEFbDK0eQWMrX3kIhkPxyIWhxdq9/NqPYjShuSEAhA6CSpmRg0pqc+
|
||||||
|
-mA==
|
||||||
|
+MIID+zCCAuOgAwIBAgIUGMvHl3EhtKPKcgc3NQSAYfFuC+8wDQYJKoZIhvcNAQEL
|
||||||
|
+BQAwgYwxCzAJBgNVBAYTAkpQMRAwDgYDVQQIDAdTaGltYW5lMRQwEgYDVQQHDAtN
|
||||||
|
+YXR6LWUgY2l0eTEXMBUGA1UECgwOUnVieSBDb3JlIFRlYW0xFTATBgNVBAMMDFJ1
|
||||||
|
+YnkgVGVzdCBDQTElMCMGCSqGSIb3DQEJARYWc2VjdXJpdHlAcnVieS1sYW5nLm9y
|
||||||
|
+ZzAeFw0yNDAxMDExMTQ3MjNaFw0zMzEyMjkxMTQ3MjNaMIGMMQswCQYDVQQGEwJK
|
||||||
|
+UDEQMA4GA1UECAwHU2hpbWFuZTEUMBIGA1UEBwwLTWF0ei1lIGNpdHkxFzAVBgNV
|
||||||
|
+BAoMDlJ1YnkgQ29yZSBUZWFtMRUwEwYDVQQDDAxSdWJ5IFRlc3QgQ0ExJTAjBgkq
|
||||||
|
+hkiG9w0BCQEWFnNlY3VyaXR5QHJ1YnktbGFuZy5vcmcwggEiMA0GCSqGSIb3DQEB
|
||||||
|
+AQUAA4IBDwAwggEKAoIBAQCw+egZQ6eumJKq3hfKfED4dE/tL4FI5sjqont9ABVI
|
||||||
|
++1GSqyi1bFBgsRjM0THllIdMbKmJtWwnKW8J+5OgNN8y6Xxv8JmM/Y5vQt2lis0f
|
||||||
|
+qXmG8UTz0VTWdlAXXmhUs6lSADvAaIe4RVrCsZ97L3ZQTryY7JRVcbB4khUN3Gp0
|
||||||
|
+yg+801SXzoFTTa+UGIRLE66jH51aa5VXu99hnv1OiH8tQrjdi8mH6uG/icq4XuIe
|
||||||
|
+NWMF32wHqIOOPvQcWV3M5D2vxJEj702Ku6k9OQXkAo17qRSEonWW4HtLbtmS8He1
|
||||||
|
+JNPc/n3dVUm+fM6NoDXPoLP7j55G9zKyqGtGAWXAj1MTAgMBAAGjUzBRMB0GA1Ud
|
||||||
|
+DgQWBBSJGVleDvFp9cu9R+E0/OKYzGkwkTAfBgNVHSMEGDAWgBSJGVleDvFp9cu9
|
||||||
|
+R+E0/OKYzGkwkTAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQBl
|
||||||
|
+8GLB8skAWlkSw/FwbUmEV3zyqu+p7PNP5YIYoZs0D74e7yVulGQ6PKMZH5hrZmHo
|
||||||
|
+orFSQU+VUUirG8nDGj7Rzce8WeWBxsaDGC8CE2dq6nC6LuUwtbdMnBrH0LRWAz48
|
||||||
|
+jGFF3jHtVz8VsGfoZTZCjukWqNXvU6hETT9GsfU+PZqbqcTVRPH52+XgYayKdIbD
|
||||||
|
+r97RM4X3+aXBHcUW0b76eyyi65RR/Xtvn8ioZt2AdX7T2tZzJyXJN3Hupp77s6Ui
|
||||||
|
+AZR35SToHCZeTZD12YBvLBdaTPLZN7O/Q/aAO9ZiJaZ7SbFOjz813B2hxXab4Fob
|
||||||
|
+2uJX6eMWTVxYK5D4M9lm
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
diff --git a/test/net/fixtures/server.crt b/test/net/fixtures/server.crt
|
||||||
|
index 5ca78a6d146a0..5d2923795dabc 100644
|
||||||
|
--- a/test/net/fixtures/server.crt
|
||||||
|
+++ b/test/net/fixtures/server.crt
|
||||||
|
@@ -1,82 +1,21 @@
|
||||||
|
-Certificate:
|
||||||
|
- Data:
|
||||||
|
- Version: 3 (0x2)
|
||||||
|
- Serial Number: 2 (0x2)
|
||||||
|
- Signature Algorithm: sha256WithRSAEncryption
|
||||||
|
- Issuer: C=JP, ST=Shimane, L=Matz-e city, O=Ruby Core Team, CN=Ruby Test CA/emailAddress=security@ruby-lang.org
|
||||||
|
- Validity
|
||||||
|
- Not Before: Jan 2 03:27:13 2019 GMT
|
||||||
|
- Not After : Jan 1 03:27:13 2024 GMT
|
||||||
|
- Subject: C=JP, ST=Shimane, O=Ruby Core Team, OU=Ruby Test, CN=localhost
|
||||||
|
- Subject Public Key Info:
|
||||||
|
- Public Key Algorithm: rsaEncryption
|
||||||
|
- Public-Key: (2048 bit)
|
||||||
|
- Modulus:
|
||||||
|
- 00:e8:da:9c:01:2e:2b:10:ec:49:cd:5e:07:13:07:
|
||||||
|
- 9c:70:9e:c6:74:bc:13:c2:e1:6f:c6:82:fd:e3:48:
|
||||||
|
- e0:2c:a5:68:c7:9e:42:de:60:54:65:e6:6a:14:57:
|
||||||
|
- 7a:30:d0:cc:b5:b6:d9:c3:d2:df:c9:25:97:54:67:
|
||||||
|
- cf:f6:be:5e:cb:8b:ee:03:c5:e1:e2:f9:e7:f7:d1:
|
||||||
|
- 0c:47:f0:b8:da:33:5a:ad:41:ad:e7:b5:a2:7b:b7:
|
||||||
|
- bf:30:da:60:f8:e3:54:a2:bc:3a:fd:1b:74:d9:dc:
|
||||||
|
- 74:42:e9:29:be:df:ac:b4:4f:eb:32:f4:06:f1:e1:
|
||||||
|
- 8c:4b:a8:8b:fb:29:e7:b1:bf:1d:01:ee:73:0f:f9:
|
||||||
|
- 40:dc:d5:15:79:d9:c6:73:d0:c0:dd:cb:e4:da:19:
|
||||||
|
- 47:80:c6:14:04:72:fd:9a:7c:8f:11:82:76:49:04:
|
||||||
|
- 79:cc:f2:5c:31:22:95:13:3e:5d:40:a6:4d:e0:a3:
|
||||||
|
- 02:26:7d:52:3b:bb:ed:65:a1:0f:ed:6b:b0:3c:d4:
|
||||||
|
- de:61:15:5e:d3:dd:68:09:9f:4a:57:a5:c2:a9:6d:
|
||||||
|
- 86:92:c5:f4:a4:d4:b7:13:3b:52:63:24:05:e2:cc:
|
||||||
|
- e3:8a:3c:d4:35:34:2b:10:bb:58:72:e7:e1:8d:1d:
|
||||||
|
- 74:8c:61:16:20:3d:d0:1c:4e:8f:6e:fd:fe:64:10:
|
||||||
|
- 4f:41
|
||||||
|
- Exponent: 65537 (0x10001)
|
||||||
|
- X509v3 extensions:
|
||||||
|
- X509v3 Basic Constraints:
|
||||||
|
- CA:FALSE
|
||||||
|
- Netscape Comment:
|
||||||
|
- OpenSSL Generated Certificate
|
||||||
|
- X509v3 Subject Key Identifier:
|
||||||
|
- ED:28:C2:7E:AB:4B:C8:E8:FE:55:6D:66:95:31:1C:2D:60:F9:02:36
|
||||||
|
- X509v3 Authority Key Identifier:
|
||||||
|
- keyid:F6:D1:22:29:D5:3D:23:D7:5E:AD:0C:9C:E6:75:8F:9D:CD:F8:9D:53
|
||||||
|
-
|
||||||
|
- Signature Algorithm: sha256WithRSAEncryption
|
||||||
|
- 1d:b8:c5:8b:72:41:20:65:ad:27:6f:15:63:06:26:12:8d:9c:
|
||||||
|
- ad:ca:f4:db:97:b4:90:cb:ff:35:94:bb:2a:a7:a1:ab:1e:35:
|
||||||
|
- 2d:a5:3f:c9:24:b0:1a:58:89:75:3e:81:0a:2c:4f:98:f9:51:
|
||||||
|
- fb:c0:a3:09:d0:0a:9b:e7:a2:b7:c3:60:40:c8:f4:6d:b2:6a:
|
||||||
|
- 56:12:17:4c:00:24:31:df:9c:60:ae:b1:68:54:a9:e6:b5:4a:
|
||||||
|
- 04:e6:92:05:86:d9:5a:dc:96:30:a5:58:de:14:99:0f:e5:15:
|
||||||
|
- 89:3e:9b:eb:80:e3:bd:83:c3:ea:33:35:4b:3e:2f:d3:0d:64:
|
||||||
|
- 93:67:7f:8d:f5:3f:0c:27:bc:37:5a:cc:d6:47:16:af:5a:62:
|
||||||
|
- d2:da:51:f8:74:06:6b:24:ad:28:68:08:98:37:7d:ed:0e:ab:
|
||||||
|
- 1e:82:61:05:d0:ba:75:a0:ab:21:b0:9a:fd:2b:54:86:1d:0d:
|
||||||
|
- 1f:c2:d4:77:1f:72:26:5e:ad:8a:9f:09:36:6d:44:be:74:c2:
|
||||||
|
- 5a:3e:ff:5c:9d:75:d6:38:7b:c5:39:f9:44:6e:a1:d1:8e:ff:
|
||||||
|
- 63:db:c4:bb:c6:91:92:ca:5c:60:9b:1d:eb:0a:de:08:ee:bf:
|
||||||
|
- da:76:03:65:62:29:8b:f8:7f:c7:86:73:1e:f6:1f:2d:89:69:
|
||||||
|
- fd:be:bd:6e
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
-MIID4zCCAsugAwIBAgIBAjANBgkqhkiG9w0BAQsFADCBjDELMAkGA1UEBhMCSlAx
|
||||||
|
-EDAOBgNVBAgMB1NoaW1hbmUxFDASBgNVBAcMC01hdHotZSBjaXR5MRcwFQYDVQQK
|
||||||
|
-DA5SdWJ5IENvcmUgVGVhbTEVMBMGA1UEAwwMUnVieSBUZXN0IENBMSUwIwYJKoZI
|
||||||
|
-hvcNAQkBFhZzZWN1cml0eUBydWJ5LWxhbmcub3JnMB4XDTE5MDEwMjAzMjcxM1oX
|
||||||
|
-DTI0MDEwMTAzMjcxM1owYDELMAkGA1UEBhMCSlAxEDAOBgNVBAgMB1NoaW1hbmUx
|
||||||
|
-FzAVBgNVBAoMDlJ1YnkgQ29yZSBUZWFtMRIwEAYDVQQLDAlSdWJ5IFRlc3QxEjAQ
|
||||||
|
-BgNVBAMMCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
|
||||||
|
-AOjanAEuKxDsSc1eBxMHnHCexnS8E8Lhb8aC/eNI4CylaMeeQt5gVGXmahRXejDQ
|
||||||
|
-zLW22cPS38kll1Rnz/a+XsuL7gPF4eL55/fRDEfwuNozWq1Bree1onu3vzDaYPjj
|
||||||
|
-VKK8Ov0bdNncdELpKb7frLRP6zL0BvHhjEuoi/sp57G/HQHucw/5QNzVFXnZxnPQ
|
||||||
|
-wN3L5NoZR4DGFARy/Zp8jxGCdkkEeczyXDEilRM+XUCmTeCjAiZ9Uju77WWhD+1r
|
||||||
|
-sDzU3mEVXtPdaAmfSlelwqlthpLF9KTUtxM7UmMkBeLM44o81DU0KxC7WHLn4Y0d
|
||||||
|
-dIxhFiA90BxOj279/mQQT0ECAwEAAaN7MHkwCQYDVR0TBAIwADAsBglghkgBhvhC
|
||||||
|
-AQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYDVR0OBBYEFO0o
|
||||||
|
-wn6rS8jo/lVtZpUxHC1g+QI2MB8GA1UdIwQYMBaAFPbRIinVPSPXXq0MnOZ1j53N
|
||||||
|
-+J1TMA0GCSqGSIb3DQEBCwUAA4IBAQAduMWLckEgZa0nbxVjBiYSjZytyvTbl7SQ
|
||||||
|
-y/81lLsqp6GrHjUtpT/JJLAaWIl1PoEKLE+Y+VH7wKMJ0Aqb56K3w2BAyPRtsmpW
|
||||||
|
-EhdMACQx35xgrrFoVKnmtUoE5pIFhtla3JYwpVjeFJkP5RWJPpvrgOO9g8PqMzVL
|
||||||
|
-Pi/TDWSTZ3+N9T8MJ7w3WszWRxavWmLS2lH4dAZrJK0oaAiYN33tDqsegmEF0Lp1
|
||||||
|
-oKshsJr9K1SGHQ0fwtR3H3ImXq2Knwk2bUS+dMJaPv9cnXXWOHvFOflEbqHRjv9j
|
||||||
|
-28S7xpGSylxgmx3rCt4I7r/adgNlYimL+H/HhnMe9h8tiWn9vr1u
|
||||||
|
+MIIDYTCCAkkCAQAwDQYJKoZIhvcNAQELBQAwgYwxCzAJBgNVBAYTAkpQMRAwDgYD
|
||||||
|
+VQQIDAdTaGltYW5lMRQwEgYDVQQHDAtNYXR6LWUgY2l0eTEXMBUGA1UECgwOUnVi
|
||||||
|
+eSBDb3JlIFRlYW0xFTATBgNVBAMMDFJ1YnkgVGVzdCBDQTElMCMGCSqGSIb3DQEJ
|
||||||
|
+ARYWc2VjdXJpdHlAcnVieS1sYW5nLm9yZzAeFw0yNDAxMDExMTQ3MjNaFw0zMzEy
|
||||||
|
+MjkxMTQ3MjNaMGAxCzAJBgNVBAYTAkpQMRAwDgYDVQQIDAdTaGltYW5lMRcwFQYD
|
||||||
|
+VQQKDA5SdWJ5IENvcmUgVGVhbTESMBAGA1UECwwJUnVieSBUZXN0MRIwEAYDVQQD
|
||||||
|
+DAlsb2NhbGhvc3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCw+egZ
|
||||||
|
+Q6eumJKq3hfKfED4dE/tL4FI5sjqont9ABVI+1GSqyi1bFBgsRjM0THllIdMbKmJ
|
||||||
|
+tWwnKW8J+5OgNN8y6Xxv8JmM/Y5vQt2lis0fqXmG8UTz0VTWdlAXXmhUs6lSADvA
|
||||||
|
+aIe4RVrCsZ97L3ZQTryY7JRVcbB4khUN3Gp0yg+801SXzoFTTa+UGIRLE66jH51a
|
||||||
|
+a5VXu99hnv1OiH8tQrjdi8mH6uG/icq4XuIeNWMF32wHqIOOPvQcWV3M5D2vxJEj
|
||||||
|
+702Ku6k9OQXkAo17qRSEonWW4HtLbtmS8He1JNPc/n3dVUm+fM6NoDXPoLP7j55G
|
||||||
|
+9zKyqGtGAWXAj1MTAgMBAAEwDQYJKoZIhvcNAQELBQADggEBACtGNdj5TEtnJBYp
|
||||||
|
+M+LhBeU3oNteldfycEm993gJp6ghWZFg23oX8fVmyEeJr/3Ca9bAgDqg0t9a0npN
|
||||||
|
+oWKEY6wVKqcHgu3gSvThF5c9KhGbeDDmlTSVVNQmXWX0K2d4lS2cwZHH8mCm2mrY
|
||||||
|
+PDqlEkSc7k4qSiqigdS8i80Yk+lDXWsm8CjsiC93qaRM7DnS0WPQR0c16S95oM6G
|
||||||
|
+VklFKUSDAuFjw9aVWA/nahOucjn0w5fVW6lyIlkBslC1ChlaDgJmvhz+Ol3iMsE0
|
||||||
|
+kAmFNu2KKPVrpMWaBID49QwQTDyhetNLaVVFM88iUdA9JDoVMEuP1mm39JqyzHTu
|
||||||
|
+uBrdP4Q=
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
diff --git a/test/net/fixtures/server.key b/test/net/fixtures/server.key
|
||||||
|
index 7f2380e71e637..6a83d5bcf4a52 100644
|
||||||
|
--- a/test/net/fixtures/server.key
|
||||||
|
+++ b/test/net/fixtures/server.key
|
||||||
|
@@ -1,28 +1,27 @@
|
||||||
|
------BEGIN PRIVATE KEY-----
|
||||||
|
-MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDo2pwBLisQ7EnN
|
||||||
|
-XgcTB5xwnsZ0vBPC4W/Ggv3jSOAspWjHnkLeYFRl5moUV3ow0My1ttnD0t/JJZdU
|
||||||
|
-Z8/2vl7Li+4DxeHi+ef30QxH8LjaM1qtQa3ntaJ7t78w2mD441SivDr9G3TZ3HRC
|
||||||
|
-6Sm+36y0T+sy9Abx4YxLqIv7Keexvx0B7nMP+UDc1RV52cZz0MDdy+TaGUeAxhQE
|
||||||
|
-cv2afI8RgnZJBHnM8lwxIpUTPl1Apk3gowImfVI7u+1loQ/ta7A81N5hFV7T3WgJ
|
||||||
|
-n0pXpcKpbYaSxfSk1LcTO1JjJAXizOOKPNQ1NCsQu1hy5+GNHXSMYRYgPdAcTo9u
|
||||||
|
-/f5kEE9BAgMBAAECggEBAOHkwhc7DLh8IhTDNSW26oMu5OP2WU1jmiYAigDmf+OQ
|
||||||
|
-DBgrZj+JQBci8qINQxL8XLukSZn5hvQCLc7Kbyu1/wyEEUFDxSGGwwzclodr9kho
|
||||||
|
-LX2LDASPZrOSzD2+fPi2wTKmXKuS6Uc44OjQfZkYMNkz9r4Vkm8xGgOD3VipjIYX
|
||||||
|
-QXlhhdqkXZcNABsihCV52GKkDFSVm8jv95YJc5xhoYCy/3a4/qPdF0aT2R7oYUej
|
||||||
|
-hKrxVDskyooe8Zg/JTydZNV5GQEDmW01/K3r6XGT26oPi1AqMU1gtv/jkW56CRQQ
|
||||||
|
-1got8smnqM+AV7Slf9R6DauIPdQJ2S8wsr/o8ISBsOECgYEA9YrqEP2gAYSGFXRt
|
||||||
|
-liw0WI2Ant8BqXS6yvq1jLo/qWhLw/ph4Di73OQ2mpycVTpgfGr2wFPQR1XJ+0Fd
|
||||||
|
-U+Ir/C3Q7FK4VIGHK7B0zNvZr5tEjlFfeRezo2JMVw5YWeSagIFcSwK+KqCTH9qc
|
||||||
|
-pw/Eb8nB/4XNcpTZu7Fg0Wc+ooUCgYEA8sVaicn1Wxkpb45a4qfrA6wOr5xdJ4cC
|
||||||
|
-A5qs7vjX2OdPIQOmoQhdI7bCWFXZzF33wA4YCws6j5wRaySLIJqdms8Gl9QnODy1
|
||||||
|
-ZlA5gwKToBC/jqPmWAXSKb8EH7cHilaxU9OKnQ7CfwlGLHqjMtjrhR7KHlt3CVRs
|
||||||
|
-oRmvsjZVXI0CgYAmPedslAO6mMhFSSfULrhMXmV82OCqYrrA6EEkVNGbcdnzAOkD
|
||||||
|
-gfKIWabDd8bFY10po4Mguy0CHzNhBXIioWQWV5BlbhC1YKMLw+S9DzSdLAKGY9gJ
|
||||||
|
-xQ4+UQ3wtRQ/k+IYR413RUsW2oFvgZ3KSyNeAb9MK6uuv84VdG/OzVSs/QKBgQDn
|
||||||
|
-kap//l2EbObiWyaERunckdVcW0lcN+KK75J/TGwPoOwQsLvTpPe65kxRGGrtDsEQ
|
||||||
|
-uCDk/+v3KkZPLgdrrTAih9FhJ+PVN8tMcb+6IM4SA4fFFr/UPJEwct0LJ3oQ0grJ
|
||||||
|
-y+HPWFHb/Uurh7t99/4H98uR02sjQh1wOeEmm78mzQKBgQDm+LzGH0se6CXQ6cdZ
|
||||||
|
-g1JRZeXkDEsrW3hfAsW62xJQmXcWxBoblP9OamMY+A06rM5og3JbDk5Zm6JsOaA8
|
||||||
|
-wS2gw4ilp46jors4eQey8ux7kB9LzdBoDBBElnsbjLO8oBNZlVcYXg+6BOl/CUi7
|
||||||
|
-2whRF0FEjKA8ehrNhAq+VFfFNw==
|
||||||
|
------END PRIVATE KEY-----
|
||||||
|
+-----BEGIN RSA PRIVATE KEY-----
|
||||||
|
+MIIEowIBAAKCAQEAsPnoGUOnrpiSqt4XynxA+HRP7S+BSObI6qJ7fQAVSPtRkqso
|
||||||
|
+tWxQYLEYzNEx5ZSHTGypibVsJylvCfuToDTfMul8b/CZjP2Ob0LdpYrNH6l5hvFE
|
||||||
|
+89FU1nZQF15oVLOpUgA7wGiHuEVawrGfey92UE68mOyUVXGweJIVDdxqdMoPvNNU
|
||||||
|
+l86BU02vlBiESxOuox+dWmuVV7vfYZ79Toh/LUK43YvJh+rhv4nKuF7iHjVjBd9s
|
||||||
|
+B6iDjj70HFldzOQ9r8SRI+9NirupPTkF5AKNe6kUhKJ1luB7S27ZkvB3tSTT3P59
|
||||||
|
+3VVJvnzOjaA1z6Cz+4+eRvcysqhrRgFlwI9TEwIDAQABAoIBAEEYiyDP29vCzx/+
|
||||||
|
+dS3LqnI5BjUuJhXUnc6AWX/PCgVAO+8A+gZRgvct7PtZb0sM6P9ZcLrweomlGezI
|
||||||
|
+FrL0/6xQaa8bBr/ve/a8155OgcjFo6fZEw3Dz7ra5fbSiPmu4/b/kvrg+Br1l77J
|
||||||
|
+aun6uUAs1f5B9wW+vbR7tzbT/mxaUeDiBzKpe15GwcvbJtdIVMa2YErtRjc1/5B2
|
||||||
|
+BGVXyvlJv0SIlcIEMsHgnAFOp1ZgQ08aDzvilLq8XVMOahAhP1O2A3X8hKdXPyrx
|
||||||
|
+IVWE9bS9ptTo+eF6eNl+d7htpKGEZHUxinoQpWEBTv+iOoHsVunkEJ3vjLP3lyI/
|
||||||
|
+fY0NQ1ECgYEA3RBXAjgvIys2gfU3keImF8e/TprLge1I2vbWmV2j6rZCg5r/AS0u
|
||||||
|
+pii5CvJ5/T5vfJPNgPBy8B/yRDs+6PJO1GmnlhOkG9JAIPkv0RBZvR0PMBtbp6nT
|
||||||
|
+Y3yo1lwamBVBfY6rc0sLTzosZh2aGoLzrHNMQFMGaauORzBFpY5lU50CgYEAzPHl
|
||||||
|
+u5DI6Xgep1vr8QvCUuEesCOgJg8Yh1UqVoY/SmQh6MYAv1I9bLGwrb3WW/7kqIoD
|
||||||
|
+fj0aQV5buVZI2loMomtU9KY5SFIsPV+JuUpy7/+VE01ZQM5FdY8wiYCQiVZYju9X
|
||||||
|
+Wz5LxMNoz+gT7pwlLCsC4N+R8aoBk404aF1gum8CgYAJ7VTq7Zj4TFV7Soa/T1eE
|
||||||
|
+k9y8a+kdoYk3BASpCHJ29M5R2KEA7YV9wrBklHTz8VzSTFTbKHEQ5W5csAhoL5Fo
|
||||||
|
+qoHzFFi3Qx7MHESQb9qHyolHEMNx6QdsHUn7rlEnaTTyrXh3ifQtD6C0yTmFXUIS
|
||||||
|
+CW9wKApOrnyKJ9nI0HcuZQKBgQCMtoV6e9VGX4AEfpuHvAAnMYQFgeBiYTkBKltQ
|
||||||
|
+XwozhH63uMMomUmtSG87Sz1TmrXadjAhy8gsG6I0pWaN7QgBuFnzQ/HOkwTm+qKw
|
||||||
|
+AsrZt4zeXNwsH7QXHEJCFnCmqw9QzEoZTrNtHJHpNboBuVnYcoueZEJrP8OnUG3r
|
||||||
|
+UjmopwKBgAqB2KYYMUqAOvYcBnEfLDmyZv9BTVNHbR2lKkMYqv5LlvDaBxVfilE0
|
||||||
|
+2riO4p6BaAdvzXjKeRrGNEKoHNBpOSfYCOM16NjL8hIZB1CaV3WbT5oY+jp7Mzd5
|
||||||
|
+7d56RZOE+ERK2uz/7JX9VSsM/LbH9pJibd4e8mikDS9ntciqOH/3
|
||||||
|
+-----END RSA PRIVATE KEY-----
|
|
@ -1,31 +0,0 @@
|
||||||
From bfa2f72cfa3bfde34049d26dcb24976316074ad7 Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jun Aruga <jaruga@redhat.com>
|
|
||||||
Date: Mon, 21 Mar 2022 15:36:51 +0100
|
|
||||||
Subject: [PATCH] Fix a test for `bin/bundle update --bundler` to pass on
|
|
||||||
ruby/ruby.
|
|
||||||
|
|
||||||
Consider the case that the latest Bundler version on RubyGems is higher than
|
|
||||||
the `system_bundler_version` (= `Bundler::VERSION`) in `make test-bundler` on
|
|
||||||
ruby/ruby.
|
|
||||||
|
|
||||||
See <https://bugs.ruby-lang.org/issues/18643>.
|
|
||||||
---
|
|
||||||
spec/bundler/commands/binstubs_spec.rb | 5 ++++-
|
|
||||||
1 file changed, 4 insertions(+), 1 deletion(-)
|
|
||||||
|
|
||||||
diff --git a/spec/bundler/commands/binstubs_spec.rb b/spec/bundler/commands/binstubs_spec.rb
|
|
||||||
index 198226207bc..2634f43417c 100644
|
|
||||||
--- a/spec/bundler/commands/binstubs_spec.rb
|
|
||||||
+++ b/spec/bundler/commands/binstubs_spec.rb
|
|
||||||
@@ -226,7 +226,10 @@
|
|
||||||
|
|
||||||
it "calls through to the latest bundler version" do
|
|
||||||
sys_exec "bin/bundle update --bundler", :env => { "DEBUG" => "1" }
|
|
||||||
- expect(out).to include %(Using bundler #{system_bundler_version}\n)
|
|
||||||
+ using_bundler_line = /Using bundler ([\w\.]+)\n/.match(out)
|
|
||||||
+ expect(using_bundler_line).to_not be_nil
|
|
||||||
+ latest_version = using_bundler_line[1]
|
|
||||||
+ expect(Gem::Version.new(latest_version)).to be >= Gem::Version.new(system_bundler_version)
|
|
||||||
end
|
|
||||||
|
|
||||||
it "calls through to the explicit bundler version" do
|
|
|
@ -1,40 +0,0 @@
|
||||||
From 7e9ec8a20b0f7469b415283d2ec0c22087f8eb2b Mon Sep 17 00:00:00 2001
|
|
||||||
From: Jun Aruga <jaruga@redhat.com>
|
|
||||||
Date: Wed, 24 Aug 2022 12:02:56 +0200
|
|
||||||
Subject: [PATCH] Fix tests with Europe/Amsterdam pre-1970 time on tzdata
|
|
||||||
version 2022b.
|
|
||||||
|
|
||||||
The Time Zone Database (tzdata) changed the pre-1970 timestamps in some zones
|
|
||||||
including Europe/Amsterdam on tzdata version 2022b or later.
|
|
||||||
See <https://github.com/eggert/tz/commit/35fa37fbbb152f5dbed4fd5edfdc968e3584fe12>.
|
|
||||||
|
|
||||||
The tzdata RPM package maintainer on Fedora project suggested changing the Ruby
|
|
||||||
test, because the change is intentional.
|
|
||||||
See <https://bugzilla.redhat.com/show_bug.cgi?id=2118259#c1>.
|
|
||||||
|
|
||||||
We use post-1970 time test data to simplify the test.
|
|
||||||
---
|
|
||||||
core/time/shared/local.rb | 6 +++---
|
|
||||||
1 file changed, 3 insertions(+), 3 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/spec/ruby/core/time/shared/local.rb b/spec/ruby/core/time/shared/local.rb
|
|
||||||
index 43f331c4c..c4aa7a7ea 100644
|
|
||||||
--- a/spec/ruby/core/time/shared/local.rb
|
|
||||||
+++ b/spec/ruby/core/time/shared/local.rb
|
|
||||||
@@ -8,10 +8,10 @@ describe :time_local, shared: true do
|
|
||||||
|
|
||||||
platform_is_not :windows do
|
|
||||||
describe "timezone changes" do
|
|
||||||
- it "correctly adjusts the timezone change to 'CEST' on 'Europe/Amsterdam'" do
|
|
||||||
+ it "correctly adjusts the timezone change to 'CET' on 'Europe/Amsterdam'" do
|
|
||||||
with_timezone("Europe/Amsterdam") do
|
|
||||||
- Time.send(@method, 1940, 5, 16).to_a.should ==
|
|
||||||
- [0, 40, 1, 16, 5, 1940, 4, 137, true, "CEST"]
|
|
||||||
+ Time.send(@method, 1970, 5, 16).to_a.should ==
|
|
||||||
+ [0, 0, 0, 16, 5, 1970, 6, 136, false, "CET"]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
--
|
|
||||||
2.36.1
|
|
||||||
|
|
2
sources
2
sources
|
@ -1 +1 @@
|
||||||
SHA512 (ruby-3.1.2.tar.xz) = 4a74e9efc6ea4b3eff4fec7534eb1fff4794d021531defc2e9937e53c6668db8ecdc0fff2bc23d5e6602d0df344a2caa85b31c5414309541e3d5313ec82b6e21
|
SHA512 (ruby-3.3.0.tar.xz) = 7959c5753bfa0bfc4d6d74060869aabbe9815c1c97930659da11b917ee0803ddbbd80e869e00c48b8694b4ba48709c3b6493fd045568e36e902616c35ababf01
|
||||||
|
|
Loading…
Reference in New Issue