diff --git a/.gitignore b/.gitignore index da44e6e..6a673bb 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/ruby-2.5.9.tar.xz +SOURCES/ruby-3.3.0.tar.xz diff --git a/.ruby.metadata b/.ruby.metadata index a9edca5..24d7b2e 100644 --- a/.ruby.metadata +++ b/.ruby.metadata @@ -1 +1 @@ -7be8dc2e6e534eb36bfdf9f017af512996ec99a6 SOURCES/ruby-2.5.9.tar.xz +c8f68e1b0a114b90460a0b44165a3b2f540fa5b6 SOURCES/ruby-3.3.0.tar.xz diff --git a/SOURCES/abrt_prelude.rb b/SOURCES/abrt_prelude.rb deleted file mode 100644 index 587c6a6..0000000 --- a/SOURCES/abrt_prelude.rb +++ /dev/null @@ -1,8 +0,0 @@ -if defined?(Gem) - require 'rubygems.rb' - - begin - require 'abrt' - rescue LoadError - end -end diff --git a/SOURCES/macros.rubygems b/SOURCES/macros.rubygems index f821ba7..e2179bc 100644 --- a/SOURCES/macros.rubygems +++ b/SOURCES/macros.rubygems @@ -2,13 +2,31 @@ %gem_dir %{_datadir}/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. -%gem_instdir %{gem_dir}/gems/%{gem_name}-%{version}%{?prerelease} -%gem_extdir_mri %{gem_archdir}/%{name}/%{gem_name}-%{version}%{?prerelease} -%gem_libdir %{gem_instdir}/lib -%gem_cache %{gem_dir}/cache/%{gem_name}-%{version}%{?prerelease}.gem -%gem_spec %{gem_dir}/specifications/%{gem_name}-%{version}%{?prerelease}.gemspec -%gem_docdir %{gem_dir}/doc/%{gem_name}-%{version}%{?prerelease} +# +# These macros leverages %gem_name_version macro and accepts custom gem_name. +# +# -d Use default gem install location. +# +%gem_instdir() %{gem_dir}/gems/%{gem_name_version %{?1}} +%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. @@ -21,7 +39,7 @@ %gem_install(d:n:) \ mkdir -p %{-d*}%{!?-d:.%{gem_dir}} \ \ -CONFIGURE_ARGS="--with-cflags='%{optflags}' $CONFIGURE_ARGS" \\\ +CONFIGURE_ARGS="--with-cflags='%{optflags}' --with-cxxflags='%{optflags}' --with-ldflags='%{build_ldflags}' $CONFIGURE_ARGS" \\\ gem install \\\ -V \\\ --local \\\ @@ -32,16 +50,6 @@ gem install \\\ %{nil} -# For rubygems packages we want to filter out any provides caused by private -# libs in %%{gem_archdir}. -# -# Note that this must be invoked in the spec file, preferably as -# "%{?rubygems_default_filter}", before any %description block. -%rubygems_default_filter %{expand: \ -%global __provides_exclude_from %{?__provides_exclude_from:%{__provides_exclude_from}|}^%{gem_extdir_mri}/.*\\\\.so$ \ -} - - # The 'read' command in %%gemspec_* macros is not essential, but it is usefull # to make the sript appear in build log. diff --git a/SOURCES/operating_system.rb b/SOURCES/operating_system.rb index d95b303..fd56386 100644 --- a/SOURCES/operating_system.rb +++ b/SOURCES/operating_system.rb @@ -87,41 +87,51 @@ module Gem # Remove methods we are going to override. This avoids "method redefined;" # 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_specifications_dir if method_defined? :default_specifications_dir 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 - ## - # 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. def default_dir - Gem.default_dirs[:system][:gem_dir] + if opt_build_root? + Gem.default_dirs[:system][:gem_dir] + elsif Process.uid == 0 + Gem.default_dirs[:local][:gem_dir] + else + Gem.user_dir + 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 path = default_dirs.collect {|location, paths| paths[:gem_dir]} path.unshift Gem.user_dir if File.exist? Gem.user_home path 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 dir = if rpmbuild? build_dir = base_dir.chomp Gem.default_dirs[:system][:gem_dir] diff --git a/SOURCES/ruby-1.9.3-mkmf-verbose.patch b/SOURCES/ruby-1.9.3-mkmf-verbose.patch deleted file mode 100644 index b523657..0000000 --- a/SOURCES/ruby-1.9.3-mkmf-verbose.patch +++ /dev/null @@ -1,25 +0,0 @@ -From 28cc0749d6729aa2444661ee7b411e183fe220b0 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?V=C3=ADt=20Ondruch?= -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 -@@ -1900,7 +1900,7 @@ def configuration(srcdir) - SHELL = /bin/sh - - # V=0 quiet, V=1 verbose. other values don't work. --V = 0 -+V = 1 - Q1 = $(V:1=) - Q = $(Q1:0=@) - ECHO1 = $(V:1=@ #{CONFIG['NULLCMD']}) --- -1.8.3.1 - diff --git a/SOURCES/ruby-2.1.0-Allow-to-specify-additional-preludes-by-configuratio.patch b/SOURCES/ruby-2.1.0-Allow-to-specify-additional-preludes-by-configuratio.patch deleted file mode 100644 index 68e4abc..0000000 --- a/SOURCES/ruby-2.1.0-Allow-to-specify-additional-preludes-by-configuratio.patch +++ /dev/null @@ -1,58 +0,0 @@ -From 996012f6abe0ce4d68a2de9f249935c6d5b467bc Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?V=C3=ADt=20Ondruch?= -Date: Fri, 4 Oct 2013 22:13:11 +0200 -Subject: [PATCH] Allow to specify addition preludes by configuration option. - ---- - Makefile.in | 2 ++ - common.mk | 2 +- - configure.ac | 7 +++++++ - 3 files changed, 10 insertions(+), 1 deletion(-) - -diff --git a/Makefile.in b/Makefile.in -index 7e8ed82..7916993 100644 ---- a/Makefile.in -+++ b/Makefile.in -@@ -119,6 +119,8 @@ XRUBY_RUBYLIBDIR = @XRUBY_RUBYLIBDIR@ - XRUBY_RUBYHDRDIR = @XRUBY_RUBYHDRDIR@ - BOOTSTRAPRUBY = @BOOTSTRAPRUBY@ - -+OPTIONAL_PRELUDES = @OPTIONAL_PRELUDES@ -+ - #### End of system configuration section. #### - - MAJOR= @MAJOR@ -diff --git a/common.mk b/common.mk -index 5cfbc3d..3f0a82e 100644 ---- a/common.mk -+++ b/common.mk -@@ -147,7 +147,7 @@ ALLOBJS = $(NORMALMAINOBJ) $(MINIOBJS) $(COMMONOBJS) $(INITOBJS) - GOLFOBJS = goruby.$(OBJEXT) golf_prelude.$(OBJEXT) - - DEFAULT_PRELUDES = $(GEM_PRELUDE) --PRELUDE_SCRIPTS = $(srcdir)/prelude.rb $(DEFAULT_PRELUDES) -+PRELUDE_SCRIPTS = $(srcdir)/prelude.rb $(DEFAULT_PRELUDES) $(OPTIONAL_PRELUDES) - GEM_PRELUDE = $(srcdir)/gem_prelude.rb - PRELUDES = {$(srcdir)}prelude.c {$(srcdir)}miniprelude.c - GOLFPRELUDES = {$(srcdir)}golf_prelude.c -diff --git a/configure.ac b/configure.ac -index 028ef7ca3e..cdeff87871 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -4397,6 +4397,13 @@ AC_SUBST(rubyarchhdrdir)dnl - AC_SUBST(sitearchhdrdir)dnl - AC_SUBST(vendorarchhdrdir)dnl - -+AC_ARG_WITH(prelude, -+ AS_HELP_STRING([--with-prelude=FILE-LIST], [specify additional preludes separated by space]), -+ [prelude=$withval]) -+if test "$prelude" != ""; then -+ AC_SUBST(OPTIONAL_PRELUDES, $prelude) -+fi -+ - AC_ARG_WITH(mantype, - AS_HELP_STRING([--with-mantype=TYPE], [specify man page type; TYPE is one of man and doc]), - [ --- -1.8.3.1 - diff --git a/SOURCES/ruby-2.1.0-Enable-configuration-of-archlibdir.patch b/SOURCES/ruby-2.1.0-Enable-configuration-of-archlibdir.patch index 555b6b5..826d5f5 100644 --- a/SOURCES/ruby-2.1.0-Enable-configuration-of-archlibdir.patch +++ b/SOURCES/ruby-2.1.0-Enable-configuration-of-archlibdir.patch @@ -8,10 +8,10 @@ Subject: [PATCH] Allow to configure libruby.so placement. 1 file changed, 5 insertions(+) diff --git a/configure.ac b/configure.ac -index 11fc237552..b77e88fc37 100644 +index d261ea57b5..3c13076b82 100644 --- a/configure.ac +++ b/configure.ac -@@ -3642,6 +3642,11 @@ AS_IF([test ${multiarch+set}], [ +@@ -3470,6 +3470,11 @@ AS_IF([test ${multiarch+set}], [ ]) archlibdir='${libdir}/${arch}' @@ -23,6 +23,3 @@ index 11fc237552..b77e88fc37 100644 sitearchlibdir='${libdir}/${sitearch}' archincludedir='${includedir}/${arch}' sitearchincludedir='${includedir}/${sitearch}' --- -1.8.3.1 - diff --git a/SOURCES/ruby-2.1.0-Prevent-duplicated-paths-when-empty-version-string-i.patch b/SOURCES/ruby-2.1.0-Prevent-duplicated-paths-when-empty-version-string-i.patch index 20539fd..fb9b618 100644 --- a/SOURCES/ruby-2.1.0-Prevent-duplicated-paths-when-empty-version-string-i.patch +++ b/SOURCES/ruby-2.1.0-Prevent-duplicated-paths-when-empty-version-string-i.patch @@ -11,10 +11,10 @@ Subject: [PATCH] Prevent duplicated paths when empty version string is 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac -index 999e2d6d5d..11fc237552 100644 +index c42436c23d..d261ea57b5 100644 --- a/configure.ac +++ b/configure.ac -@@ -4252,7 +4252,8 @@ AS_CASE(["$ruby_version_dir_name"], +@@ -4309,7 +4309,8 @@ AS_CASE(["$ruby_version_dir_name"], ruby_version_dir=/'${ruby_version_dir_name}' if test -z "${ruby_version_dir_name}"; then @@ -66,7 +66,7 @@ diff --git a/tool/mkconfig.rb b/tool/mkconfig.rb index 07076d4..35e6c3c 100755 --- a/tool/mkconfig.rb +++ b/tool/mkconfig.rb -@@ -111,7 +111,7 @@ +@@ -115,7 +115,7 @@ val = val.gsub(/\$(?:\$|\{?(\w+)\}?)/) {$1 ? "$(#{$1})" : $&}.dump case name when /^prefix$/ @@ -75,6 +75,3 @@ index 07076d4..35e6c3c 100755 when /^ARCH_FLAG$/ val = "arch_flag || #{val}" if universal when /^UNIVERSAL_ARCHNAMES$/ --- -1.9.0 - diff --git a/SOURCES/ruby-2.1.0-always-use-i386.patch b/SOURCES/ruby-2.1.0-always-use-i386.patch index 5d45fac..a64b812 100644 --- a/SOURCES/ruby-2.1.0-always-use-i386.patch +++ b/SOURCES/ruby-2.1.0-always-use-i386.patch @@ -8,10 +8,10 @@ Subject: [PATCH] Always use i386. 1 file changed, 2 insertions(+) diff --git a/configure.ac b/configure.ac -index b77e88fc37..6bba453e3c 100644 +index 3c13076b82..93af30321d 100644 --- a/configure.ac +++ b/configure.ac -@@ -4316,6 +4316,8 @@ AC_SUBST(vendorarchdir)dnl +@@ -4373,6 +4373,8 @@ AC_SUBST(vendorarchdir)dnl AC_SUBST(CONFIGURE, "`echo $0 | sed 's|.*/||'`")dnl AC_SUBST(configure_args, "`echo "${ac_configure_args}" | sed 's/\\$/$$/g'`")dnl @@ -20,6 +20,3 @@ index b77e88fc37..6bba453e3c 100644 AS_IF([test "${universal_binary-no}" = yes ], [ arch="universal-${target_os}" AS_IF([test "${rb_cv_architecture_available}" = yes], [ --- -1.8.3.1 - diff --git a/SOURCES/ruby-2.1.0-custom-rubygems-location.patch b/SOURCES/ruby-2.1.0-custom-rubygems-location.patch index 5ebe1ce..91e53a1 100644 --- a/SOURCES/ruby-2.1.0-custom-rubygems-location.patch +++ b/SOURCES/ruby-2.1.0-custom-rubygems-location.patch @@ -5,17 +5,17 @@ Subject: [PATCH] Allow to install RubyGems into custom location, outside of Ruby tree. --- - configure.ac | 5 +++++ - loadpath.c | 4 ++++ - template/verconf.h.tmpl | 3 +++ - tool/rbinstall.rb | 7 +++++++ - 4 files changed, 19 insertions(+) + configure.ac | 5 +++++ + loadpath.c | 4 ++++ + template/verconf.h.tmpl | 3 +++ + tool/rbinstall.rb | 10 ++++++++++ + 4 files changed, 22 insertions(+) diff --git a/configure.ac b/configure.ac -index 6bba453e3c..028ef7ca3e 100644 +index 93af30321d..bc13397e0e 100644 --- a/configure.ac +++ b/configure.ac -@@ -4288,6 +4288,10 @@ AC_ARG_WITH(vendorarchdir, +@@ -4345,6 +4345,10 @@ AC_ARG_WITH(vendorarchdir, [vendorarchdir=$withval], [vendorarchdir=${multiarch+'${rubysitearchprefix}/vendor_ruby'${ruby_version_dir}}${multiarch-'${vendorlibdir}/${sitearch}'}]) @@ -26,7 +26,7 @@ index 6bba453e3c..028ef7ca3e 100644 AS_IF([test "${LOAD_RELATIVE+set}"], [ AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE) RUBY_EXEC_PREFIX='' -@@ -4312,6 +4316,7 @@ AC_SUBST(sitearchdir)dnl +@@ -4369,6 +4373,7 @@ AC_SUBST(sitearchdir)dnl AC_SUBST(vendordir)dnl AC_SUBST(vendorlibdir)dnl AC_SUBST(vendorarchdir)dnl @@ -64,31 +64,31 @@ index 79c003e..34f2382 100644 % R = {} % R["ruby_version"] = '"RUBY_LIB_VERSION"' diff --git a/tool/rbinstall.rb b/tool/rbinstall.rb -index b47b6e1..0b99408 100755 +index e9110a17ca..76a1f0a315 100755 --- a/tool/rbinstall.rb +++ b/tool/rbinstall.rb -@@ -335,6 +335,7 @@ def CONFIG.[](name, mandatory = false) +@@ -359,6 +359,7 @@ def CONFIG.[](name, mandatory = false) vendorlibdir = CONFIG["vendorlibdir"] vendorarchlibdir = CONFIG["vendorarchdir"] end +rubygemsdir = CONFIG["rubygemsdir"] mandir = CONFIG["mandir", true] docdir = CONFIG["docdir", true] - configure_args = Shellwords.shellwords(CONFIG["configure_args"]) -@@ -541,7 +542,13 @@ def install(src, cmd) + enable_shared = CONFIG["ENABLE_SHARED"] == 'yes' +@@ -595,7 +596,16 @@ def stub install?(:local, :comm, :lib) do prepare "library scripts", rubylibdir noinst = %w[*.txt *.rdoc *.gemspec] -+ noinst += %w[rubygems.rb rubygems/ datadir.rb] if rubygemsdir ++ # Bundler carries "rubygems.rb" file, so it must be specialcased :/ ++ noinst += %w[rubygems.rb rubygems/ bundler.rb bundler/] if rubygemsdir install_recursive(File.join(srcdir, "lib"), rubylibdir, :no_install => noinst, :mode => $data_mode) + if rubygemsdir -+ noinst = %w[obsolete.rb] -+ install_recursive(File.join(srcdir, "lib", "rubygems"), File.join(rubygemsdir, "rubygems"), :mode => $data_mode) ++ noinst = %w[*.txt *.rdoc *.gemspec] ++ install_recursive(File.join(srcdir, "lib", "rubygems"), File.join(rubygemsdir, "rubygems"), :no_install => noinst, :mode => $data_mode) + install(File.join(srcdir, "lib", "rubygems.rb"), File.join(rubygemsdir, "rubygems.rb"), :mode => $data_mode) ++ install_recursive(File.join(srcdir, "lib", "bundler"), File.join(rubylibdir, "bundler"), :no_install => noinst, :mode => $data_mode) ++ install(File.join(srcdir, "lib", "bundler.rb"), rubylibdir, :mode => $data_mode) + end end install?(:local, :comm, :hdr, :'comm-hdr') do --- -1.8.3.1 - diff --git a/SOURCES/ruby-2.2.3-Generate-preludes-using-miniruby.patch b/SOURCES/ruby-2.2.3-Generate-preludes-using-miniruby.patch deleted file mode 100644 index ca66d28..0000000 --- a/SOURCES/ruby-2.2.3-Generate-preludes-using-miniruby.patch +++ /dev/null @@ -1,28 +0,0 @@ -From 07eb5f5e775dec01a92a8b13910eaced9e8ee0cd Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?V=C3=ADt=20Ondruch?= -Date: Tue, 2 Dec 2014 10:56:58 +0100 -Subject: [PATCH] Generate preludes using miniruby. - ---- - common.mk | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/common.mk b/common.mk -index 168dc52..20c218a 100644 ---- a/common.mk -+++ b/common.mk -@@ -962,9 +962,9 @@ $(MINIPRELUDE_C): $(COMPILE_PRELUDE) - $(srcdir)/template/prelude.c.tmpl - - $(PRELUDE_C): $(COMPILE_PRELUDE) \ -- $(PRELUDE_SCRIPTS) -+ $(PRELUDE_SCRIPTS) $(PREP) - $(ECHO) generating $@ -- $(Q) $(BASERUBY) $(srcdir)/tool/generic_erb.rb -I$(srcdir) -c -o $@ \ -+ $(Q) $(MINIRUBY) $(srcdir)/tool/generic_erb.rb -I$(srcdir) -c -o $@ \ - $(srcdir)/template/prelude.c.tmpl $(PRELUDE_SCRIPTS) - - {$(VPATH)}golf_prelude.c: $(COMPILE_PRELUDE) {$(srcdir)}golf_prelude.rb --- -2.6.3 - diff --git a/SOURCES/ruby-2.3.0-ruby_version.patch b/SOURCES/ruby-2.3.0-ruby_version.patch index 7cc747f..c921c36 100644 --- a/SOURCES/ruby-2.3.0-ruby_version.patch +++ b/SOURCES/ruby-2.3.0-ruby_version.patch @@ -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 string. --- - configure.ac | 64 ++++++++++++++++++++++++++++------------------------- + configure.ac | 66 ++++++++++++++++++++++++--------------------- 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 -index 8ea969412f..a00f2b6776 100644 +index 80b137e380..63cd3b4f8b 100644 --- a/configure.ac +++ b/configure.ac -@@ -4203,9 +4203,6 @@ AS_CASE(["$target_os"], +@@ -4259,9 +4259,6 @@ AS_CASE(["$target_os"], rubyw_install_name='$(RUBYW_INSTALL_NAME)' ]) @@ -30,7 +30,7 @@ index 8ea969412f..a00f2b6776 100644 rubyarchprefix=${multiarch+'${archlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${arch}'} AC_ARG_WITH(rubyarchprefix, AS_HELP_STRING([--with-rubyarchprefix=DIR], -@@ -4228,56 +4225,62 @@ AC_ARG_WITH(ridir, +@@ -4284,57 +4281,63 @@ AC_ARG_WITH(ridir, AC_SUBST(ridir) AC_SUBST(RI_BASE_NAME) @@ -46,6 +46,7 @@ index 8ea969412f..a00f2b6776 100644 -AS_IF([test ${RUBY_LIB_VERSION_STYLE+set}], [ - { - echo "#define RUBY_LIB_VERSION_STYLE $RUBY_LIB_VERSION_STYLE" +- echo '@%:@include "confdefs.h"' - echo '#define STRINGIZE(x) x' - test -f revision.h -o -f "${srcdir}/revision.h" || echo '#define RUBY_REVISION 0' - echo '#include "version.h"' @@ -61,6 +62,7 @@ index 8ea969412f..a00f2b6776 100644 +RUBY_LIB_VERSION_STYLE='3 /* full */' +{ +echo "#define RUBY_LIB_VERSION_STYLE $RUBY_LIB_VERSION_STYLE" ++echo '@%:@include "confdefs.h"' +echo '#define STRINGIZE(x) x' +test -f revision.h -o -f "${srcdir}/revision.h" || echo '#define RUBY_REVISION 0' +echo '#include "version.h"' @@ -120,7 +122,7 @@ index 8ea969412f..a00f2b6776 100644 AS_IF([test "${LOAD_RELATIVE+set}"], [ AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE) -@@ -4294,6 +4297,7 @@ AC_SUBST(sitearchincludedir)dnl +@@ -4351,6 +4354,7 @@ AC_SUBST(sitearchincludedir)dnl AC_SUBST(arch)dnl AC_SUBST(sitearch)dnl AC_SUBST(ruby_version)dnl @@ -132,16 +134,14 @@ diff --git a/template/ruby.pc.in b/template/ruby.pc.in index 8a2c066..c81b211 100644 --- a/template/ruby.pc.in +++ b/template/ruby.pc.in -@@ -9,6 +9,7 @@ MAJOR=@MAJOR@ +@@ -2,6 +2,7 @@ MAJOR=@MAJOR@ MINOR=@MINOR@ TEENY=@TEENY@ ruby_version=@ruby_version@ +ruby_version_dir_name=@ruby_version_dir_name@ RUBY_API_VERSION=@RUBY_API_VERSION@ RUBY_PROGRAM_VERSION=@RUBY_PROGRAM_VERSION@ - RUBY_BASE_NAME=@RUBY_BASE_NAME@ --- -2.1.0 + arch=@arch@ From 518850aba6eee76de7715aae8d37330e34b01983 Mon Sep 17 00:00:00 2001 @@ -165,107 +165,87 @@ index 970cb91..5bf8230 100644 - version = RbConfig::CONFIG['ruby_version'] + version = RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version'] - BASE = if RbConfig::CONFIG.key? 'ridir' then - File.join RbConfig::CONFIG['ridir'], version + BASE = File.join RbConfig::CONFIG['ridir'], version + diff --git a/tool/rbinstall.rb b/tool/rbinstall.rb index d4c110e..d39c9a6 100755 --- a/tool/rbinstall.rb +++ b/tool/rbinstall.rb -@@ -421,7 +421,7 @@ def CONFIG.[](name, mandatory = false) +@@ -453,7 +453,7 @@ def CONFIG.[](name, mandatory = false) install?(:doc, :rdoc) do if $rdocdir - ridatadir = File.join(CONFIG['ridir'], CONFIG['ruby_version'], "system") + ridatadir = File.join(CONFIG['ridir'], CONFIG['ruby_version_dir_name'] || CONFIG['ruby_version'], "system") prepare "rdoc", ridatadir - install_recursive($rdocdir, ridatadir, :mode => $data_mode) + install_recursive($rdocdir, ridatadir, :no_install => rdoc_noinst, :mode => $data_mode) end --- -2.1.0 - -From f8d136f9a46d1fe87eba622ab9665935d05e981b Mon Sep 17 00:00:00 2001 +From 9f0ec0233f618cbb862629816b22491c3df79578 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20Ondruch?= Date: Tue, 31 Mar 2015 16:37:44 +0200 Subject: [PATCH 3/4] Add ruby_version_dir_name support for RubyGems. --- - lib/rubygems/defaults.rb | 11 ++++++----- - test/rubygems/test_gem.rb | 5 +++-- - 2 files changed, 9 insertions(+), 7 deletions(-) + lib/rubygems/defaults.rb | 7 ++++--- + test/rubygems/test_gem.rb | 5 +++-- + 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/lib/rubygems/defaults.rb b/lib/rubygems/defaults.rb -index 55ca080..75eea2b 100644 +index d4ff4a262c..3f9a5bf590 100644 --- a/lib/rubygems/defaults.rb +++ b/lib/rubygems/defaults.rb -@@ -32,20 +32,20 @@ def self.default_dir - [ - File.dirname(RbConfig::CONFIG['sitedir']), - 'Gems', -- RbConfig::CONFIG['ruby_version'] -+ RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version'] - ] - elsif RbConfig::CONFIG['rubylibprefix'] then - [ - RbConfig::CONFIG['rubylibprefix'], - 'gems', -- RbConfig::CONFIG['ruby_version'] -+ RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version'] - ] - else - [ - RbConfig::CONFIG['libdir'], - ruby_engine, - 'gems', -- RbConfig::CONFIG['ruby_version'] -+ RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version'] - ] - end +@@ -35,7 +35,7 @@ def self.default_spec_cache_dir + # specified in the environment -@@ -75,7 +75,8 @@ def self.default_rubygems_dirs + 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_dir_name"] || RbConfig::CONFIG["ruby_version"]) + end - def self.user_dir - parts = [Gem.user_home, '.gem', ruby_engine] -- 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'] + ## +@@ -104,7 +104,8 @@ def self.user_dir + gem_dir = File.join(Gem.user_home, ".gem") + gem_dir = File.join(Gem.data_home, "gem") unless File.exist?(gem_dir) + parts = [gem_dir, ruby_engine] +- 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"] + parts << ruby_version_dir_name unless ruby_version_dir_name.empty? File.join parts end -@@ -172,7 +173,7 @@ def self.vendor_dir # :nodoc: - return nil unless RbConfig::CONFIG.key? 'vendordir' +@@ -265,7 +266,7 @@ def self.vendor_dir # :nodoc: + return nil unless RbConfig::CONFIG.key? "vendordir" - File.join RbConfig::CONFIG['vendordir'], 'gems', -- RbConfig::CONFIG['ruby_version'] -+ RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version'] + File.join RbConfig::CONFIG["vendordir"], "gems", +- RbConfig::CONFIG["ruby_version"] ++ RbConfig::CONFIG["ruby_version_dir_name"] || RbConfig::CONFIG["ruby_version"] end ## diff --git a/test/rubygems/test_gem.rb b/test/rubygems/test_gem.rb -index 0428bea..b6e090e 100644 +index b25068405d..e9fef4a311 100644 --- a/test/rubygems/test_gem.rb +++ b/test/rubygems/test_gem.rb -@@ -1191,7 +1191,8 @@ def test_self_use_paths +@@ -1351,7 +1351,8 @@ def test_self_use_paths def test_self_user_dir - parts = [@userhome, '.gem', Gem.ruby_engine] -- 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'] + parts = [@userhome, ".gem", Gem.ruby_engine] +- 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"] + parts << ruby_version_dir_name unless ruby_version_dir_name.empty? - assert_equal File.join(parts), Gem.user_dir - end -@@ -1318,7 +1319,7 @@ def test_self_user_home_user_drive_and_path - def test_self_vendor_dir - expected = - File.join RbConfig::CONFIG['vendordir'], 'gems', -- RbConfig::CONFIG['ruby_version'] -+ RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version'] + FileUtils.mkdir_p File.join(parts) - assert_equal expected, Gem.vendor_dir - end --- -2.1.0 +@@ -1427,7 +1428,7 @@ def test_self_vendor_dir + vendordir(File.join(@tempdir, "vendor")) do + expected = + File.join RbConfig::CONFIG["vendordir"], "gems", +- RbConfig::CONFIG["ruby_version"] ++ RbConfig::CONFIG["ruby_version_dir_name"] || RbConfig::CONFIG["ruby_version"] + + assert_equal expected, Gem.vendor_dir + end From 88c38a030c22dbf9422ece847bdfbf87d6659313 Mon Sep 17 00:00:00 2001 @@ -282,15 +262,12 @@ diff --git a/configure.ac b/configure.ac index a00f2b6776..999e2d6d5d 100644 --- a/configure.ac +++ b/configure.ac -@@ -164,7 +164,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"` AC_SUBST(RUBY_BASE_NAME) AC_SUBST(RUBYW_BASE_NAME) -AC_SUBST(RUBY_VERSION_NAME, '${RUBY_BASE_NAME}-${ruby_version}') +AC_SUBST(RUBY_VERSION_NAME, '${RUBY_BASE_NAME}-${ruby_version_dir_name}') - AC_CANONICAL_TARGET - test x"$target_alias" = x && --- -2.1.0 - + dnl checks for alternative programs + AC_CANONICAL_BUILD diff --git a/SOURCES/ruby-2.5.0-Add-Gem.operating_system_defaults.patch b/SOURCES/ruby-2.5.0-Add-Gem.operating_system_defaults.patch deleted file mode 100644 index 7ac0e41..0000000 --- a/SOURCES/ruby-2.5.0-Add-Gem.operating_system_defaults.patch +++ /dev/null @@ -1,80 +0,0 @@ -From 60eb961c25f801ee43ca1be9393ab2f0a0546677 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?V=C3=ADt=20Ondruch?= -Date: Tue, 19 Dec 2017 14:00:20 +0100 -Subject: [PATCH] Add Gem.operating_system_defaults to allow packagers to - override defaults. - -This change allows Ruby packagers to override defaults and lazily query -them. - -This is very much the same change as #1644 to treat the -operating_system defaults the same way as platform defaults. ---- - lib/rubygems/config_file.rb | 2 +- - lib/rubygems/defaults.rb | 21 ++++++++++++++++++++- - test/rubygems/test_gem.rb | 7 +++++++ - 3 files changed, 28 insertions(+), 2 deletions(-) - -diff --git a/lib/rubygems/config_file.rb b/lib/rubygems/config_file.rb -index a4efed0f5a..deee38e6d9 100644 ---- a/lib/rubygems/config_file.rb -+++ b/lib/rubygems/config_file.rb -@@ -48,7 +48,7 @@ class Gem::ConfigFile - # For Ruby packagers to set configuration defaults. Set in - # rubygems/defaults/operating_system.rb - -- OPERATING_SYSTEM_DEFAULTS = {} -+ OPERATING_SYSTEM_DEFAULTS = Gem.operating_system_defaults - - ## - # For Ruby implementers to set configuration defaults. Set in -diff --git a/lib/rubygems/defaults.rb b/lib/rubygems/defaults.rb -index 43d57fc808..b8222877ae 100644 ---- a/lib/rubygems/defaults.rb -+++ b/lib/rubygems/defaults.rb -@@ -177,7 +177,26 @@ def self.vendor_dir # :nodoc: - end - - ## -- # Default options for gem commands. -+ # Default options for gem commands for Ruby packagers. -+ # -+ # The options here should be structured as an array of string "gem" -+ # command names as keys and a string of the default options as values. -+ # -+ # Example: -+ # -+ # def self.operating_system_defaults -+ # { -+ # 'install' => '--no-rdoc --no-ri --env-shebang', -+ # 'update' => '--no-rdoc --no-ri --env-shebang' -+ # } -+ # end -+ -+ def self.operating_system_defaults -+ {} -+ end -+ -+ ## -+ # Default options for gem commands for Ruby implementers. - # - # The options here should be structured as an array of string "gem" - # command names as keys and a string of the default options as values. -diff --git a/test/rubygems/test_gem.rb b/test/rubygems/test_gem.rb -index 3225a05c6b..62b80c4945 100644 ---- a/test/rubygems/test_gem.rb -+++ b/test/rubygems/test_gem.rb -@@ -1837,6 +1837,13 @@ def test_use_gemdeps_specific - ENV['RUBYGEMS_GEMDEPS'] = rubygems_gemdeps - end - -+ def test_operating_system_defaults -+ operating_system_defaults = Gem.operating_system_defaults -+ -+ assert operating_system_defaults != nil -+ assert operating_system_defaults.is_a? Hash -+ end -+ - def test_platform_defaults - platform_defaults = Gem.platform_defaults - diff --git a/SOURCES/ruby-2.5.1-Avoid-need-of-C++-compiler-to-pass-the-test-suite.patch b/SOURCES/ruby-2.5.1-Avoid-need-of-C++-compiler-to-pass-the-test-suite.patch deleted file mode 100644 index 413a1da..0000000 --- a/SOURCES/ruby-2.5.1-Avoid-need-of-C++-compiler-to-pass-the-test-suite.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 51e2c91412a511196e58efea5b87c460b4fa6a20 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?V=C3=ADt=20Ondruch?= -Date: Thu, 26 Jul 2018 13:17:52 +0200 -Subject: [PATCH] Avoid need of C++ compiler to pass the test suite. - -The test suite fails when C++ compiler is not available on the system: - -~~~ -TestGemExtCmakeBuilder#test_self_build: -Gem::InstallError: cmake failed, exit code 1 - /builddir/build/BUILD/ruby-2.5.1/lib/rubygems/ext/builder.rb:92:in `run' - /builddir/build/BUILD/ruby-2.5.1/lib/rubygems/ext/cmake_builder.rb:10:in `build' - /builddir/build/BUILD/ruby-2.5.1/test/rubygems/test_gem_ext_cmake_builder.rb:37:in `block in test_self_build' - /builddir/build/BUILD/ruby-2.5.1/test/rubygems/test_gem_ext_cmake_builder.rb:36:in `chdir' - /builddir/build/BUILD/ruby-2.5.1/test/rubygems/test_gem_ext_cmake_builder.rb:36:in `test_self_build' -~~~ - -But there is nothing which would realy required C++. It is just CMake -default to check for C++. ---- - test/rubygems/test_gem_ext_cmake_builder.rb | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/test/rubygems/test_gem_ext_cmake_builder.rb b/test/rubygems/test_gem_ext_cmake_builder.rb -index 76d3cb2afe..2d449fc2fd 100644 ---- a/test/rubygems/test_gem_ext_cmake_builder.rb -+++ b/test/rubygems/test_gem_ext_cmake_builder.rb -@@ -25,6 +25,7 @@ def test_self_build - File.open File.join(@ext, 'CMakeLists.txt'), 'w' do |cmakelists| - cmakelists.write <<-eo_cmake - cmake_minimum_required(VERSION 2.6) -+project(self_build LANGUAGES NONE) - install (FILES test.txt DESTINATION bin) - eo_cmake - end diff --git a/SOURCES/ruby-2.5.9-revert-stop-the-error-due-to-openssl-1-1-1h.patch b/SOURCES/ruby-2.5.9-revert-stop-the-error-due-to-openssl-1-1-1h.patch deleted file mode 100644 index 6b882a0..0000000 --- a/SOURCES/ruby-2.5.9-revert-stop-the-error-due-to-openssl-1-1-1h.patch +++ /dev/null @@ -1,46 +0,0 @@ -From 93e6364a848f00b34647b13063dceb854dfaa11e Mon Sep 17 00:00:00 2001 -From: usa -Date: Wed, 28 Oct 2020 13:12:06 +0000 -Subject: [PATCH] merge revision(s): 07786ed - - * test/net/http/test_https.rb: Stop the error due to openssl 1.1.1h - - On some environments that uses OpenSSL 1.1.1h, the two tests now fail. - - http://rubyci.s3.amazonaws.com/android29-x86_64/ruby-master/log/20200924T062352Z.fail.html.gz - https://github.com/ruby/ruby/runs/1159288773?check_suite_focus=true - - ``` - 1) Failure: - TestNetHTTPS#test_get [/data/data/com.termux/files/home/cb/tmp/build/202 00924T062352Z/ruby/test/net/http/test_https.rb:47]: - <"0\x82\x03\xED0\x82\x02\xD5\xA0\x03..."> expected but was - <"0\x82\x03\xE30\x82\x02\xCB\xA0\x03...">. - ``` - - Not sure why, but verify_callback now seems to receive only SERVER_CERT - but not CA_CERT. - It would be good to investigate the issue furthermore, but tentatively, - I want to stop the failures. - - -git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_5@67887 b2dd03c8-39d4-4d8f-98ff-823fe69b080e ---- - test/net/http/test_https.rb | 6 ++++-- - -diff --git a/test/net/http/test_https.rb b/test/net/http/test_https.rb -index c1d486470ae2..3a2341024121 100644 ---- a/test/net/http/test_https.rb -+++ b/test/net/http/test_https.rb -@@ -44,8 +44,10 @@ def test_get - http.request_get("/") {|res| - assert_equal($test_net_http_data, res.body) - } -- assert_equal(CA_CERT.to_der, certs[0].to_der) -- assert_equal(SERVER_CERT.to_der, certs[1].to_der) -+ # TODO: OpenSSL 1.1.1h seems to yield only SERVER_CERT; need to check the incompatibility -+ certs.zip([SERVER_CERT, CA_CERT]) do |actual, expected| -+ assert_equal(expected.to_der, actual.to_der) -+ end - rescue SystemCallError - skip $! - end diff --git a/SOURCES/ruby-2.6.0-Fix-issues-detected-by-code-analysis-tool.patch b/SOURCES/ruby-2.6.0-Fix-issues-detected-by-code-analysis-tool.patch deleted file mode 100644 index 00e1b4d..0000000 --- a/SOURCES/ruby-2.6.0-Fix-issues-detected-by-code-analysis-tool.patch +++ /dev/null @@ -1,78 +0,0 @@ -From 893949167bdb911c7db9fd59de85f288c09741e1 Mon Sep 17 00:00:00 2001 -From: nobu -Date: Sat, 15 Sep 2018 09:59:14 +0000 -Subject: [PATCH] Fix issues detected by code analysis tool (mainly Coverity). - -* Fix leaked storage in addr2line.c. -* Fix for "top_root" leaking the resource. - -[Fix GH-1956] - -From: Jun Aruga - -git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64750 b2dd03c8-39d4-4d8f-98ff-823fe69b080e ---- - addr2line.c | 8 ++++++-- - regcomp.c | 3 +++ - 2 files changed, 9 insertions(+), 2 deletions(-) - -diff --git a/addr2line.c b/addr2line.c -index 2c422cc1697a..b266e44d5d4b 100644 ---- a/addr2line.c -+++ b/addr2line.c -@@ -593,11 +593,12 @@ fill_lines(int num_traces, void **traces, int check_debuglink, - h = dlopen(NULL, RTLD_NOW|RTLD_LOCAL); - if (!h) continue; - s = dlsym(h, strtab + sym->st_name); -- if (!s) continue; -- if (dladdr(s, &info)) { -+ if (s && dladdr(s, &info)) { - dladdr_fbase = (uintptr_t)info.dli_fbase; -+ dlclose(h); - break; - } -+ dlclose(h); - } - if (ehdr->e_type == ET_EXEC) { - obj->base_addr = 0; -@@ -655,6 +656,9 @@ fill_lines(int num_traces, void **traces, int check_debuglink, - finish: - return dladdr_fbase; - fail: -+ if (file != NULL) { -+ munmap(file, (size_t)filesize); -+ } - return (uintptr_t)-1; - } - -diff --git a/regcomp.c b/regcomp.c -index 0f6bee60d576..df7f73bac501 100644 ---- a/regcomp.c -+++ b/regcomp.c -@@ -3596,6 +3596,7 @@ expand_case_fold_string(Node* node, regex_t* reg) - if (n == 0 || varlen == 0) { - if (IS_NULL(snode)) { - if (IS_NULL(root) && IS_NOT_NULL(prev_node)) { -+ onig_node_free(top_root); - top_root = root = onig_node_list_add(NULL_NODE, prev_node); - if (IS_NULL(root)) { - onig_node_free(prev_node); -@@ -3627,6 +3628,7 @@ expand_case_fold_string(Node* node, regex_t* reg) - } - } - if (IS_NULL(root) && IS_NOT_NULL(prev_node)) { -+ onig_node_free(top_root); - top_root = root = onig_node_list_add(NULL_NODE, prev_node); - if (IS_NULL(root)) { - onig_node_free(prev_node); -@@ -3677,6 +3679,7 @@ expand_case_fold_string(Node* node, regex_t* reg) - if (r != 0) goto mem_err; - - if (IS_NOT_NULL(prev_node) && IS_NULL(root)) { -+ onig_node_free(top_root); - top_root = root = onig_node_list_add(NULL_NODE, prev_node); - if (IS_NULL(root)) { - onig_node_free(srem); --- -2.21.0 - diff --git a/SOURCES/ruby-2.6.0-config-support-include-directive.patch b/SOURCES/ruby-2.6.0-config-support-include-directive.patch deleted file mode 100644 index 27ef50f..0000000 --- a/SOURCES/ruby-2.6.0-config-support-include-directive.patch +++ /dev/null @@ -1,182 +0,0 @@ -From f46bac1f3e8634e24c747d06b28e11b874f1e488 Mon Sep 17 00:00:00 2001 -From: Kazuki Yamaguchi -Date: Thu, 16 Aug 2018 19:40:48 +0900 -Subject: [PATCH] config: support .include directive - -OpenSSL 1.1.1 introduces a new '.include' directive. Update our config -parser to support that. - -As mentioned in the referenced GitHub issue, we should use the OpenSSL -API instead of implementing the parsing logic ourselves, but it will -need backwards-incompatible changes which we can't backport to stable -versions. So continue to use the Ruby implementation for now. - -Reference: https://github.com/ruby/openssl/issues/208 ---- - ext/openssl/lib/openssl/config.rb | 54 ++++++++++++++++++++++++++++--------------- - test/openssl/test_config.rb | 54 +++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 90 insertions(+), 18 deletions(-) - -diff --git a/ext/openssl/lib/openssl/config.rb b/ext/openssl/lib/openssl/config.rb -index 88225451..ba3a54c8 100644 ---- a/ext/openssl/lib/openssl/config.rb -+++ b/ext/openssl/lib/openssl/config.rb -@@ -77,29 +77,44 @@ def get_key_string(data, section, key) # :nodoc: - def parse_config_lines(io) - section = 'default' - data = {section => {}} -- while definition = get_definition(io) -+ io_stack = [io] -+ while definition = get_definition(io_stack) - definition = clear_comments(definition) - next if definition.empty? -- if definition[0] == ?[ -+ case definition -+ when /\A\[/ - if /\[([^\]]*)\]/ =~ definition - section = $1.strip - data[section] ||= {} - else - raise ConfigError, "missing close square bracket" - end -- else -- if /\A([^:\s]*)(?:::([^:\s]*))?\s*=(.*)\z/ =~ definition -- if $2 -- section = $1 -- key = $2 -- else -- key = $1 -+ when /\A\.include (.+)\z/ -+ path = $1 -+ if File.directory?(path) -+ files = Dir.glob(File.join(path, "*.{cnf,conf}"), File::FNM_EXTGLOB) -+ else -+ files = [path] -+ end -+ -+ files.each do |filename| -+ begin -+ io_stack << StringIO.new(File.read(filename)) -+ rescue -+ raise ConfigError, "could not include file '%s'" % filename - end -- value = unescape_value(data, section, $3) -- (data[section] ||= {})[key] = value.strip -+ end -+ when /\A([^:\s]*)(?:::([^:\s]*))?\s*=(.*)\z/ -+ if $2 -+ section = $1 -+ key = $2 - else -- raise ConfigError, "missing equal sign" -+ key = $1 - end -+ value = unescape_value(data, section, $3) -+ (data[section] ||= {})[key] = value.strip -+ else -+ raise ConfigError, "missing equal sign" - end - end - data -@@ -212,10 +227,10 @@ def clear_comments(line) - scanned.join - end - -- def get_definition(io) -- if line = get_line(io) -+ def get_definition(io_stack) -+ if line = get_line(io_stack) - while /[^\\]\\\z/ =~ line -- if extra = get_line(io) -+ if extra = get_line(io_stack) - line += extra - else - break -@@ -225,9 +240,12 @@ def get_definition(io) - end - end - -- def get_line(io) -- if line = io.gets -- line.gsub(/[\r\n]*/, '') -+ def get_line(io_stack) -+ while io = io_stack.last -+ if line = io.gets -+ return line.gsub(/[\r\n]*/, '') -+ end -+ io_stack.pop - end - end - end -diff --git a/test/openssl/test_config.rb b/test/openssl/test_config.rb -index 99dcc497..5653b5d0 100644 ---- a/test/openssl/test_config.rb -+++ b/test/openssl/test_config.rb -@@ -120,6 +120,49 @@ def test_s_parse_format - assert_equal("error in line 7: missing close square bracket", excn.message) - end - -+ def test_s_parse_include -+ in_tmpdir("ossl-config-include-test") do |dir| -+ Dir.mkdir("child") -+ File.write("child/a.conf", <<~__EOC__) -+ [default] -+ file-a = a.conf -+ [sec-a] -+ a = 123 -+ __EOC__ -+ File.write("child/b.cnf", <<~__EOC__) -+ [default] -+ file-b = b.cnf -+ [sec-b] -+ b = 123 -+ __EOC__ -+ File.write("include-child.conf", <<~__EOC__) -+ key_outside_section = value_a -+ .include child -+ __EOC__ -+ -+ include_file = <<~__EOC__ -+ [default] -+ file-main = unnamed -+ [sec-main] -+ main = 123 -+ .include include-child.conf -+ __EOC__ -+ -+ # Include a file by relative path -+ c1 = OpenSSL::Config.parse(include_file) -+ assert_equal(["default", "sec-a", "sec-b", "sec-main"], c1.sections.sort) -+ assert_equal(["file-main", "file-a", "file-b"], c1["default"].keys) -+ assert_equal({"a" => "123"}, c1["sec-a"]) -+ assert_equal({"b" => "123"}, c1["sec-b"]) -+ assert_equal({"main" => "123", "key_outside_section" => "value_a"}, c1["sec-main"]) -+ -+ # Relative paths are from the working directory -+ assert_raise(OpenSSL::ConfigError) do -+ Dir.chdir("child") { OpenSSL::Config.parse(include_file) } -+ end -+ end -+ end -+ - def test_s_load - # alias of new - c = OpenSSL::Config.load -@@ -299,6 +342,17 @@ def test_clone - @it['newsection'] = {'a' => 'b'} - assert_not_equal(@it.sections.sort, c.sections.sort) - end -+ -+ private -+ -+ def in_tmpdir(*args) -+ Dir.mktmpdir(*args) do |dir| -+ dir = File.realpath(dir) -+ Dir.chdir(dir) do -+ yield dir -+ end -+ end -+ end - end - - end diff --git a/SOURCES/ruby-2.6.0-configure-fstack-protector-strong.patch b/SOURCES/ruby-2.6.0-configure-fstack-protector-strong.patch deleted file mode 100644 index e44d9bb..0000000 --- a/SOURCES/ruby-2.6.0-configure-fstack-protector-strong.patch +++ /dev/null @@ -1,43 +0,0 @@ -From c8ccdbfe1e45cb3b832109d644296c0a3b3e0b59 Mon Sep 17 00:00:00 2001 -From: nobu -Date: Sun, 2 Sep 2018 03:49:31 +0000 -Subject: [PATCH] configure.ac: -fstack-protector-strong - -* configure.ac: use -fstack-protector-strong if available instead of - -fstack-protector conditionally. [ruby-core:88788] [Misc #15053] - -git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64614 b2dd03c8-39d4-4d8f-98ff-823fe69b080e ---- - configure.ac | 17 ++++++++++------- - 1 file changed, 10 insertions(+), 7 deletions(-) - -diff --git a/configure.ac b/configure.ac -index 9328fa532de0..b8ee57239215 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -837,15 +837,18 @@ AS_IF([test "$GCC" = yes], [ - stack_protector=no - ]) - AS_IF([test -z "${stack_protector+set}"], [ -- RUBY_TRY_CFLAGS(-fstack-protector, [stack_protector=yes], [stack_protector=no]) -- AS_IF([test "x$stack_protector" = xyes], [ -- RUBY_TRY_LDFLAGS(-fstack-protector, [], [stack_protector=broken]) -+ AS_FOR(option, opt, [-fstack-protector-strong -fstack-protector], [ -+ RUBY_TRY_CFLAGS(option, [stack_protector=yes]) -+ AS_IF([test "x$stack_protector" = xyes], [ -+ RUBY_TRY_LDFLAGS(option, [], [stack_protector=]) -+ ]) -+ AS_IF([test "x$stack_protector" = xyes], [stack_protector=option; break]) - ]) - ]) -- AS_IF([test "x$stack_protector" = xyes], [ -- RUBY_APPEND_OPTION(XCFLAGS, -fstack-protector) -- RUBY_APPEND_OPTION(XLDFLAGS, -fstack-protector) -- RUBY_APPEND_OPTION(LDFLAGS, -fstack-protector) -+ AS_CASE(["$stack_protector"], [-*], [ -+ RUBY_APPEND_OPTION(XCFLAGS, $stack_protector) -+ RUBY_APPEND_OPTION(XLDFLAGS, $stack_protector) -+ RUBY_APPEND_OPTION(LDFLAGS, $stack_protector) - ]) - - AS_CASE("${compress_debug_sections:-zlib}", diff --git a/SOURCES/ruby-2.6.0-library-options-to-MAINLIBS.patch b/SOURCES/ruby-2.6.0-library-options-to-MAINLIBS.patch deleted file mode 100644 index 5299c6f..0000000 --- a/SOURCES/ruby-2.6.0-library-options-to-MAINLIBS.patch +++ /dev/null @@ -1,177 +0,0 @@ -From bb3db69e2a0c210cc3a63940622db96a97eb7947 Mon Sep 17 00:00:00 2001 -From: nobu -Date: Fri, 2 Mar 2018 01:37:53 +0000 -Subject: [PATCH] configure.ac: library options to MAINLIBS - -* configure.ac (MAINLIBS): moved library options for main program - and static libruby, and append MAINLIBS to LIBRUBYARG_STATIC, as - these libraries are not needed for linking to shared libruby. - [ruby-core:85882] [Bug #14422] - -git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@62627 b2dd03c8-39d4-4d8f-98ff-823fe69b080e ---- - configure.ac | 33 +++++++++++++++------------------ - template/ruby.pc.in | 1 + - win32/Makefile.sub | 6 ++++-- - 3 files changed, 20 insertions(+), 20 deletions(-) - -diff --git a/configure.ac b/configure.ac -index aebbae1969a5..733a0c992fd7 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -10,6 +10,7 @@ AC_DISABLE_OPTION_CHECKING - AC_ARG_VAR([cflags], [additional CFLAGS]) - AC_ARG_VAR([cppflags], [additional CPPFLAGS]) - AC_ARG_VAR([cxxflags], [additional CXXFLAGS]) -+ORIG_LIBS=$LIBS - - AC_DEFUN([RUBY_RM_RECURSIVE], [ - m4_version_prereq([2.70], [-1], [ -@@ -2939,13 +2940,11 @@ AS_IF([test x"$enable_pthread" = xyes], [ - AC_DEFINE(_THREAD_SAFE) - AC_DEFINE(HAVE_LIBPTHREAD) - AC_CHECK_HEADERS(pthread_np.h, [], [], [@%:@include ]) -- AS_CASE([$pthread_lib], -- [c], [], -- [root], [], -- [c_r], [MAINLIBS="-pthread $MAINLIBS"], -- [AS_CASE(["$target_os"], -- [openbsd*|mirbsd*], [LIBS="-pthread $LIBS"], -- [LIBS="-l$pthread_lib $LIBS"])]) -+ AS_CASE(["$pthread_lib:$target_os"], -+ [c:*], [], -+ [root:*], [], -+ [c_r:*|*:openbsd*|*:mirbsd*], [LIBS="-pthread $LIBS"], -+ [LIBS="-l$pthread_lib $LIBS"]) - ], [ - AC_MSG_WARN("Don't know how to find pthread library on your system -- thread support disabled") - ]) -@@ -3624,7 +3623,7 @@ LIBRUBY_A='lib$(RUBY_SO_NAME)-static.a' - LIBRUBY='$(LIBRUBY_A)' - LIBRUBYARG_STATIC='-l$(RUBY_SO_NAME)-static' - LIBRUBYARG='$(LIBRUBYARG_STATIC)' --SOLIBS= -+SOLIBS='$(MAINLIBS)' - - AS_CASE(["$target_os"], - [cygwin*|mingw*|haiku*|darwin*], [ -@@ -3690,9 +3689,6 @@ AS_CASE("$enable_shared", [yes], [ - LIBRUBY_RELATIVE=no - test -z "$CCDLFLAGS" || CFLAGS="$CFLAGS $CCDLFLAGS" - ENABLE_SHARED=yes -- AS_IF([test "$rb_cv_binary_elf" = yes], [ -- SOLIBS='$(LIBS)' -- ]) - - # libdir can be overridden in config.site file (on OpenSUSE at least). - libdir_basename=lib -@@ -3727,7 +3723,6 @@ AS_CASE("$enable_shared", [yes], [ - ]) - ], - [freebsd*|dragonfly*], [ -- SOLIBS='$(LIBS)' - LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR)$(MINOR)' - LIBRUBY_SONAME='$(LIBRUBY_SO)' - AS_IF([test "$rb_cv_binary_elf" != "yes" ], [ -@@ -3736,7 +3731,6 @@ AS_CASE("$enable_shared", [yes], [ - ]) - ], - [netbsd*], [ -- SOLIBS='$(LIBS)' - LIBRUBY_SONAME='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR)$(MINOR)' - LIBRUBY_SO="${LIBRUBY_SONAME}"'.$(TEENY)' - RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ['-Wl,-soname,$(LIBRUBY_SONAME)' "$LDFLAGS_OPTDIR"]) -@@ -3747,11 +3741,9 @@ AS_CASE("$enable_shared", [yes], [ - ]) - ], - [openbsd*|mirbsd*], [ -- SOLIBS='$(LIBS)' - LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR).'`expr ${MINOR} \* 10 + ${TEENY}` - ], - [solaris*], [ -- SOLIBS='$(LIBS)' - LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR)' - LIBRUBY_SONAME='lib$(RUBY_SO_NAME).$(SOEXT).$(RUBY_PROGRAM_VERSION)' - LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_SO_NAME).$(SOEXT)' -@@ -3769,7 +3761,7 @@ AS_CASE("$enable_shared", [yes], [ - [aix*], [ - RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ["${linker_flag}-bnoentry" "$XLDFLAGS" "$LDFLAGS_OPTDIR"]) - LIBRUBYARG_SHARED='-L${libdir} -l${RUBY_SO_NAME}' -- SOLIBS='-lm -lc' -+ LIBS="$LIBS -lm -lc" - ], - [darwin*], [ - LIBRUBY_LDSHARED='$(CC) -dynamiclib' -@@ -3789,7 +3781,6 @@ AS_CASE("$enable_shared", [yes], [ - LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT)' - LIBRUBY_SONAME='lib$(RUBY_BASE_NAME).$(RUBY_API_VERSION).$(SOEXT)' - LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_INSTALL_NAME).$(SOEXT)' -- SOLIBS='$(LIBS)' - ], - [interix*], [ - LIBRUBYARG_SHARED='-L. -L${libdir} -l$(RUBY_SO_NAME)' -@@ -4032,7 +4023,6 @@ AS_CASE(["$target_os"], - ]) - LIBRUBY_ALIASES='' - FIRSTMAKEFILE=GNUmakefile:cygwin/GNUmakefile.in -- SOLIBS='$(LIBS)' - AS_IF([test x"$enable_shared" = xyes], [ - LIBRUBY='lib$(RUBY_SO_NAME).dll.a' - ], [ -@@ -4132,6 +4122,13 @@ AS_IF([test "${universal_binary-no}" = yes ], [ - [rb_cv_architecture_available=yes], [rb_cv_architecture_available=no])) - ]) - -+MAINLIBS="$LIBS" -+LIBS=$ORIG_LIBS -+AS_IF([test -n "${LIBS}"], [ -+ libspat=`echo "${LIBS}" | sed 's/[[][|.*$^]]/\\&/g;s/^ */ /;s/^ *$/ /'` -+ MAINFLAGS=`echo " $MAINLIBS " | sed "s|$libspat"'||;s/^ *//;s/ *$//'` -+]) -+LIBRUBYARG_STATIC="${LIBRUBYARG_STATIC} \$(MAINLIBS)" - CPPFLAGS="$CPPFLAGS "'$(DEFS)' - test -z "$CPPFLAGS" || CPPFLAGS="$CPPFLAGS "; CPPFLAGS="$CPPFLAGS"'${cppflags}' - AS_IF([test -n "${cflags+set}"], [ -diff --git a/template/ruby.pc.in b/template/ruby.pc.in -index d874f92c3b20..7ce4461c05df 100644 ---- a/template/ruby.pc.in -+++ b/template/ruby.pc.in -@@ -39,6 +39,7 @@ sitehdrdir=@sitehdrdir@ - rubyarchhdrdir=@rubyarchhdrdir@ - vendorarchhdrdir=@vendorarchhdrdir@ - sitearchhdrdir=@sitearchhdrdir@ -+MAINLIBS=@MAINLIBS@ - SOEXT=@SOEXT@ - LIBPATH=@LIBPATH@ - LIBRUBY_A=@LIBRUBY_A@ -diff --git a/win32/Makefile.sub b/win32/Makefile.sub -index 8673c121641e..f8316cccb68e 100644 ---- a/win32/Makefile.sub -+++ b/win32/Makefile.sub -@@ -279,6 +279,7 @@ MJIT_DEBUGFLAGS = $(DEBUGFLAGS) - CPPFLAGS = $(DEFS) $(ARCHDEFS) $(CPPFLAGS) - - DLDFLAGS = $(LDFLAGS) -dll -+MAINLIBS = $(LIBS) - SOLIBS = - RCFILES = $(RUBY_INSTALL_NAME).rc $(RUBYW_INSTALL_NAME).rc $(RUBY_SO_NAME).rc - !ifndef RCFLAGS -@@ -821,7 +822,8 @@ s,@CPPFLAGS@,$(CPPFLAGS),;t t - s,@CXXFLAGS@,$(CXXFLAGS),;t t - s,@FFLAGS@,$(FFLAGS),;t t - s,@LDFLAGS@,$(LDFLAGS),;t t --s,@LIBS@,$(LIBS),;t t -+s,@LIBS@,,;t t -+s,@MAINLIBS@,$(MAINLIBS),;t t - s,@exec_prefix@,$${prefix},;t t - s,@prefix@,$(prefix),;t t - s,@program_transform_name@,s,.*,$(PROGRAM_PREFIX)&$(PROGRAM_SUFFIX),,;t t -@@ -909,7 +911,7 @@ s,@LIBRUBY_SO@,$$(RUBY_SO_NAME).dll,;t t - s,@LIBRUBY_ALIASES@,$(LIBRUBY_ALIASES),;t t - s,@LIBRUBY@,$$(RUBY_SO_NAME).lib,;t t - s,@LIBRUBYARG@,$$(LIBRUBYARG_SHARED),;t t --s,@LIBRUBYARG_STATIC@,$$(LIBRUBY_A),;t t -+s,@LIBRUBYARG_STATIC@,$$(LIBRUBY_A) $$(MAINLIBS),;t t - s,@LIBRUBYARG_SHARED@,$$(LIBRUBY),;t t - s,@SOLIBS@,$(SOLIBS),;t t - s,@DLDLIBS@,$(DLDLIBS),;t t diff --git a/SOURCES/ruby-2.6.0-rdoc-6.0.2-check-nil-text-token.patch b/SOURCES/ruby-2.6.0-rdoc-6.0.2-check-nil-text-token.patch deleted file mode 100644 index 325a6bf..0000000 --- a/SOURCES/ruby-2.6.0-rdoc-6.0.2-check-nil-text-token.patch +++ /dev/null @@ -1,69 +0,0 @@ -From 9d98bfe7f1abdeda5aedf9404588104980ee7a86 Mon Sep 17 00:00:00 2001 -From: aycabta -Date: Mon, 15 Jan 2018 22:32:56 +0900 -Subject: [PATCH] Check nil text token - -Sometimes :on_ignored_nl token has nil text. This commit checks and -bypasses the token. ---- - lib/rdoc/parser/ripper_state_lex.rb | 4 +++- - test/test_rdoc_parser_ruby.rb | 30 +++++++++++++++++++++++++++++ - 2 files changed, 33 insertions(+), 1 deletion(-) - -diff --git a/lib/rdoc/parser/ripper_state_lex.rb b/lib/rdoc/parser/ripper_state_lex.rb -index 2a285b97a4..c56cef46ee 100644 ---- a/lib/rdoc/parser/ripper_state_lex.rb -+++ b/lib/rdoc/parser/ripper_state_lex.rb -@@ -330,8 +330,10 @@ class RDoc::RipperStateLex - @heredoc_queue << retrieve_heredoc_info(tk) - @inner_lex.lex_state = EXPR_END unless RIPPER_HAS_LEX_STATE - when :on_nl, :on_ignored_nl, :on_comment, :on_heredoc_end then -- unless @heredoc_queue.empty? -+ if !@heredoc_queue.empty? - get_heredoc_tk(*@heredoc_queue.shift) -+ elsif tk[:text].nil? # :on_ignored_nl sometimes gives nil -+ tk[:text] = '' - end - when :on_words_beg then - tk = get_words_tk(tk) -diff --git a/test/rdoc/test_rdoc_parser_ruby.rb b/test/rdoc/test_rdoc_parser_ruby.rb -index 833ed2cc74..c9d57021ce 100644 ---- a/test/rdoc/test_rdoc_parser_ruby.rb -+++ b/test/rdoc/test_rdoc_parser_ruby.rb -@@ -306,6 +306,36 @@ def sum(n) - assert_equal @top_level, sum.file - end - -+ def test_parse_on_ignored_nl_with_nil_text -+ util_parser <def meth -+ variable # comment -+ .chain -+end -+EXPECTED -+ expected = expected.rstrip -+ -+ @parser.scan -+ -+ foo = @store.find_class_named 'Foo' -+ meth = foo.method_list.first -+ -+ assert_equal 'meth', meth.name -+ assert_equal @top_level, meth.file -+ -+ markup_code = meth.markup_code.sub(/^.*\n/, '') -+ assert_equal expected, markup_code -+ end -+ - def test_parse_alias - klass = RDoc::NormalClass.new 'Foo' - klass.parent = @top_level diff --git a/SOURCES/ruby-2.6.0-rdoc-6.0.2-fix-different-js-gz-pages-across-multilib.patch b/SOURCES/ruby-2.6.0-rdoc-6.0.2-fix-different-js-gz-pages-across-multilib.patch deleted file mode 100644 index 041f327..0000000 --- a/SOURCES/ruby-2.6.0-rdoc-6.0.2-fix-different-js-gz-pages-across-multilib.patch +++ /dev/null @@ -1,214 +0,0 @@ -From 091459248d3ce814e10d50cc4421f0c0454ef61f Mon Sep 17 00:00:00 2001 -From: "Bernhard M. Wiedemann" -Date: Sun, 30 Apr 2017 22:47:40 +0200 -Subject: [PATCH 1/4] created.rid: use SOURCE_DATE_EPOCH - -use SOURCE_DATE_EPOCH instead of current time in created.rid top line -to enable reproducible builds of ruby docs - -See https://reproducible-builds.org/ for why this is good -and https://reproducible-builds.org/specs/source-date-epoch/ -for the definition of this variable. ---- - lib/rdoc/rdoc.rb | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/lib/rdoc/rdoc.rb b/lib/rdoc/rdoc.rb -index 68775c8be1..a2711fbbd1 100644 ---- a/lib/rdoc/rdoc.rb -+++ b/lib/rdoc/rdoc.rb -@@ -232,6 +232,9 @@ def store= store - - def update_output_dir(op_dir, time, last = {}) - return if @options.dry_run or not @options.update_output_dir -+ unless ENV['SOURCE_DATE_EPOCH'].nil? -+ time = Time.at(ENV['SOURCE_DATE_EPOCH'].to_i).gmtime -+ end - - open output_flag_file(op_dir), "w" do |f| - f.puts time.rfc2822 --- -2.21.0 - -From 73a935e9fa63b056ea0be69c0c923afdfb4d88da Mon Sep 17 00:00:00 2001 -From: "Bernhard M. Wiedemann" -Date: Thu, 14 Dec 2017 10:54:54 +0100 -Subject: [PATCH 2/4] Do not store current timestamps in gz headers - -to enable reproducible builds of rdoc - -Normally, 0 would be the preferred value to indicate "no date" -but that value is handled differently in Zlib::GzipWriter -to put in the current time ---- - lib/rdoc/generator/json_index.rb | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/lib/rdoc/generator/json_index.rb b/lib/rdoc/generator/json_index.rb -index e4cfe967c6..a059a5d4d0 100644 ---- a/lib/rdoc/generator/json_index.rb -+++ b/lib/rdoc/generator/json_index.rb -@@ -175,7 +175,7 @@ def generate_gzipped - debug_msg "Writing gzipped search index to %s" % outfile - - Zlib::GzipWriter.open(outfile) do |gz| -- gz.mtime = File.mtime(search_index_file) -+ gz.mtime = 1 # make output reproducible - gz.orig_name = search_index_file.basename.to_s - gz.write search_index - gz.close -@@ -193,7 +193,7 @@ def generate_gzipped - debug_msg "Writing gzipped file to %s" % outfile - - Zlib::GzipWriter.open(outfile) do |gz| -- gz.mtime = File.mtime(dest) -+ gz.mtime = 1 # make output reproducible - gz.orig_name = dest.basename.to_s - gz.write data - gz.close --- -2.21.0 - -From 1b34b337b72918e83c3b952eed6998ad47974960 Mon Sep 17 00:00:00 2001 -From: aycabta -Date: Sat, 27 Jan 2018 14:37:42 +0900 -Subject: [PATCH 3/4] Improve reproducible builds for .js and .js.gz files - -The mtime for search_index.js.gz should be updated because it's -generated dynamically. So uses SOURCE_DATE_EPOCH after -RDoc::Generator::JsonIndex#generate creates index file. - -FileUtils.install in RDoc::Generator::JsonIndex#generate with :preserve -option because the mtime value is based on original .js file. ---- - lib/rdoc/generator/json_index.rb | 9 +++++--- - test/rdoc/test_rdoc_generator_json_index.rb | 25 ++++++++++++++++++++- - 2 files changed, 30 insertions(+), 4 deletions(-) - -diff --git a/lib/rdoc/generator/json_index.rb b/lib/rdoc/generator/json_index.rb -index a059a5d4d0..3a1000033d 100644 ---- a/lib/rdoc/generator/json_index.rb -+++ b/lib/rdoc/generator/json_index.rb -@@ -147,12 +147,15 @@ def generate - - JSON.dump data, io, 0 - end -+ unless ENV['SOURCE_DATE_EPOCH'].nil? -+ index_file.utime index_file.atime, Time.at(ENV['SOURCE_DATE_EPOCH'].to_i).gmtime -+ end - - Dir.chdir @template_dir do - Dir['**/*.js'].each do |source| - dest = File.join out_dir, source - -- FileUtils.install source, dest, :mode => 0644, :verbose => $DEBUG_RDOC -+ FileUtils.install source, dest, :mode => 0644, :preserve => true, :verbose => $DEBUG_RDOC - end - end - end -@@ -175,7 +178,7 @@ def generate_gzipped - debug_msg "Writing gzipped search index to %s" % outfile - - Zlib::GzipWriter.open(outfile) do |gz| -- gz.mtime = 1 # make output reproducible -+ gz.mtime = File.mtime(search_index_file) - gz.orig_name = search_index_file.basename.to_s - gz.write search_index - gz.close -@@ -193,7 +196,7 @@ def generate_gzipped - debug_msg "Writing gzipped file to %s" % outfile - - Zlib::GzipWriter.open(outfile) do |gz| -- gz.mtime = 1 # make output reproducible -+ gz.mtime = File.mtime(dest) - gz.orig_name = dest.basename.to_s - gz.write data - gz.close -diff --git a/test/rdoc/test_rdoc_generator_json_index.rb b/test/rdoc/test_rdoc_generator_json_index.rb -index 6cb5463d29..65e7f087cc 100644 ---- a/test/rdoc/test_rdoc_generator_json_index.rb -+++ b/test/rdoc/test_rdoc_generator_json_index.rb -@@ -8,7 +8,7 @@ class TestRDocGeneratorJsonIndex < RDoc::TestCase - def setup - super - -- @tmpdir = File.join Dir.tmpdir, "test_rdoc_generator_darkfish_#{$$}" -+ @tmpdir = Dir.mktmpdir "test_rdoc_generator_darkfish_#{$$}_" - FileUtils.mkdir_p @tmpdir - - @options = RDoc::Options.new -@@ -89,12 +89,21 @@ def test_file_dir - end - - def test_generate -+ now = Time.now - @g.generate - - assert_file 'js/searcher.js' - assert_file 'js/navigation.js' - assert_file 'js/search_index.js' - -+ orig_file = Pathname(File.join @pwd, 'lib/rdoc/generator/template/json_index/js/navigation.js') -+ generated_file = Pathname(File.join @tmpdir, 'js/navigation.js') -+ assert_equal orig_file.mtime, generated_file.mtime -+ assert generated_file.mtime < now, '.js files should be the same timestamp' -+ -+ generated_search_index = Pathname(File.join @tmpdir, 'js/search_index.js') -+ assert generated_search_index.mtime > (now - 1), 'search_index.js should be generated timestamp' -+ - json = File.read 'js/search_index.js' - - json =~ /\Avar search_data = / -@@ -137,6 +146,20 @@ def test_generate - assert_equal expected, index - end - -+ def test_generate_search_index_with_reproducible_builds -+ backup_epoch = ENV['SOURCE_DATE_EPOCH'] -+ ruby_birthday = Time.parse 'Wed, 24 Feb 1993 21:00:00 +0900' -+ ENV['SOURCE_DATE_EPOCH'] = ruby_birthday.to_i.to_s -+ -+ @g.generate -+ -+ assert_file 'js/search_index.js' -+ generated_search_index = Pathname(File.join @tmpdir, 'js/search_index.js') -+ assert_equal ruby_birthday, generated_search_index.mtime -+ -+ ENV['SOURCE_DATE_EPOCH'] = backup_epoch -+ end -+ - def test_generate_gzipped - begin - require 'zlib' --- -2.21.0 - -From 74c1e201f2146e7175e74d6fc0b9386c2e95210f Mon Sep 17 00:00:00 2001 -From: aycabta -Date: Sat, 27 Jan 2018 17:54:31 +0900 -Subject: [PATCH 4/4] Use dirty hack on JRuby for MiniTest 4 - ---- - test/rdoc/test_rdoc_generator_json_index.rb | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -diff --git a/test/rdoc/test_rdoc_generator_json_index.rb b/test/rdoc/test_rdoc_generator_json_index.rb -index 65e7f087cc..714d496195 100644 ---- a/test/rdoc/test_rdoc_generator_json_index.rb -+++ b/test/rdoc/test_rdoc_generator_json_index.rb -@@ -98,7 +98,11 @@ def test_generate - - orig_file = Pathname(File.join @pwd, 'lib/rdoc/generator/template/json_index/js/navigation.js') - generated_file = Pathname(File.join @tmpdir, 'js/navigation.js') -- assert_equal orig_file.mtime, generated_file.mtime -+ -+ # This is dirty hack on JRuby for MiniTest 4 -+ assert orig_file.mtime.inspect == generated_file.mtime.inspect, -+ '.js files should be tha same timestamp of original' -+ - assert generated_file.mtime < now, '.js files should be the same timestamp' - - generated_search_index = Pathname(File.join @tmpdir, 'js/search_index.js') --- -2.21.0 - diff --git a/SOURCES/ruby-2.6.0-use-larger-keys-for-SSL-tests.patch b/SOURCES/ruby-2.6.0-use-larger-keys-for-SSL-tests.patch deleted file mode 100644 index 62f9488..0000000 --- a/SOURCES/ruby-2.6.0-use-larger-keys-for-SSL-tests.patch +++ /dev/null @@ -1,486 +0,0 @@ -From b0bcb19cb4f95d260c5993df0aaa3667522fb99d Mon Sep 17 00:00:00 2001 -From: Kazuki Yamaguchi -Date: Thu, 16 Aug 2018 20:54:47 +0900 -Subject: [PATCH 1/2] test/openssl/test_pair: fix deadlock in - test_connect_accept_nonblock - -Call IO.select with a timeout value and limit the number of retries to -prevent stacking forever. - -Reference: https://github.com/ruby/openssl/issues/214 ---- - test/openssl/test_pair.rb | 51 ++++++++++++++++++++--------------------------- - 1 file changed, 22 insertions(+), 29 deletions(-) - -diff --git a/test/openssl/test_pair.rb b/test/openssl/test_pair.rb -index ea5f0dcf..eac3655e 100644 ---- a/test/openssl/test_pair.rb -+++ b/test/openssl/test_pair.rb -@@ -442,7 +442,7 @@ def test_connect_accept_nonblock_no_exception - end - - def test_connect_accept_nonblock -- ctx = OpenSSL::SSL::SSLContext.new() -+ ctx = OpenSSL::SSL::SSLContext.new - ctx.cert = @svr_cert - ctx.key = @svr_key - ctx.tmp_dh_callback = proc { OpenSSL::TestUtils::Fixtures.pkey_dh("dh1024") } -@@ -451,45 +451,38 @@ def test_connect_accept_nonblock - - th = Thread.new { - s2 = OpenSSL::SSL::SSLSocket.new(sock2, ctx) -- s2.sync_close = true -- begin -+ 5.times { -+ begin -+ break s2.accept_nonblock -+ rescue IO::WaitReadable -+ IO.select([s2], nil, nil, 1) -+ rescue IO::WaitWritable -+ IO.select(nil, [s2], nil, 1) -+ end - sleep 0.2 -- s2.accept_nonblock -+ } -+ } -+ -+ s1 = OpenSSL::SSL::SSLSocket.new(sock1) -+ 5.times { -+ begin -+ break s1.connect_nonblock - rescue IO::WaitReadable -- IO.select([s2]) -- retry -+ IO.select([s1], nil, nil, 1) - rescue IO::WaitWritable -- IO.select(nil, [s2]) -- retry -+ IO.select(nil, [s1], nil, 1) - end -- s2 -- } -- -- sleep 0.1 -- ctx = OpenSSL::SSL::SSLContext.new() -- s1 = OpenSSL::SSL::SSLSocket.new(sock1, ctx) -- begin - sleep 0.2 -- s1.connect_nonblock -- rescue IO::WaitReadable -- IO.select([s1]) -- retry -- rescue IO::WaitWritable -- IO.select(nil, [s1]) -- retry -- end -- s1.sync_close = true -+ } - - s2 = th.value - - s1.print "a\ndef" - assert_equal("a\n", s2.gets) - ensure -- th.join if th -- s1.close if s1 && !s1.closed? -- s2.close if s2 && !s2.closed? -- sock1.close if sock1 && !sock1.closed? -- sock2.close if sock2 && !sock2.closed? -+ sock1&.close -+ sock2&.close -+ th&.join - end - end - - -From 5ba99ad7ae1267ed964f53906530579299f3fcc6 Mon Sep 17 00:00:00 2001 -From: Kazuki Yamaguchi -Date: Thu, 16 Aug 2018 20:04:13 +0900 -Subject: [PATCH 2/2] test: use larger keys for SSL tests - -Some systems enforce a system-wide policy to restrict key sizes used in -SSL/TLS. Use larger ones if possible so that the test suite runs -successfully. - -New PEM files test/openssl/fixtures/pkey/{dh-1,rsa-1,rsa-2,rsa-3}.pem are added -to the tree, and SSL tests now use them instead of the fixed-size keys. - -Reference: https://github.com/ruby/openssl/issues/215 ---- - test/openssl/fixtures/pkey/dh-1.pem | 13 +++++++++ - test/openssl/fixtures/pkey/rsa-1.pem | 51 ++++++++++++++++++++++++++++++++++++ - test/openssl/fixtures/pkey/rsa-2.pem | 51 ++++++++++++++++++++++++++++++++++++ - test/openssl/fixtures/pkey/rsa-3.pem | 51 ++++++++++++++++++++++++++++++++++++ - test/openssl/test_pair.rb | 8 +++--- - test/openssl/test_pkey_dh.rb | 8 +++--- - test/openssl/test_ssl.rb | 11 ++++---- - test/openssl/utils.rb | 14 +++++----- - 8 files changed, 186 insertions(+), 21 deletions(-) - create mode 100644 test/openssl/fixtures/pkey/dh-1.pem - create mode 100644 test/openssl/fixtures/pkey/rsa-1.pem - create mode 100644 test/openssl/fixtures/pkey/rsa-2.pem - create mode 100644 test/openssl/fixtures/pkey/rsa-3.pem - -diff --git a/test/openssl/fixtures/pkey/dh-1.pem b/test/openssl/fixtures/pkey/dh-1.pem -new file mode 100644 -index 00000000..3340a6a1 ---- /dev/null -+++ b/test/openssl/fixtures/pkey/dh-1.pem -@@ -0,0 +1,13 @@ -+-----BEGIN DH PARAMETERS----- -+MIICCAKCAgEAvRzXYxY6L2DjeYmm1eowtMDu1it3j+VwFr6s6PRWzc1apMtztr9G -+xZ2mYndUAJLgNLO3n2fUDCYVMB6ZkcekW8Siocof3xWiMA6wqZ6uw0dsE3q7ZX+6 -+TLjgSjaXeGvjutvuEwVrFeaUi83bMgfXN8ToxIQVprIF35sYFt6fpbFATKfW7qqi -+P1pQkjmCskU4tztaWvlLh0qg85wuQGnpJaQT3gS30378i0IGbA0EBvJcSpTHYbLa -+nsdI9bfN/ZVgeolVMNMU9/n8R8vRhNPcHuciFwaqS656q+HavCIyxw/LfjSwwFvR -+TngCn0wytRErkzFIXnRKckh8/BpI4S+0+l1NkOwG4WJ55KJ/9OOdZW5o/QCp2bDi -+E0JN1EP/gkSom/prq8JR/yEqtsy99uc5nUxPmzv0IgdcFHZEfiQU7iRggEbx7qfQ -+Ve55XksmmJInmpCy1bSabAEgIKp8Ckt5KLYZ0RgTXUhcEpsxEo6cuAwoSJT5o4Rp -+yG3xow2ozPcqZkvb+d2CHj1sc54w9BVFAjVANEKmRil/9WKz14bu3wxEhOPqC54n -+QojjLcoXSoT66ZUOQnYxTSiLtzoKGPy8cAVPbkBrXz2u2sj5gcvr1JjoGjdHm9/3 -+qnqC8fsTz8UndKNIQC337o4K0833bQMzRGl1/qjbAPit2B7E3b6xTZMCAQI= -+-----END DH PARAMETERS----- -diff --git a/test/openssl/fixtures/pkey/rsa-1.pem b/test/openssl/fixtures/pkey/rsa-1.pem -new file mode 100644 -index 00000000..bd5a624f ---- /dev/null -+++ b/test/openssl/fixtures/pkey/rsa-1.pem -@@ -0,0 +1,51 @@ -+-----BEGIN RSA PRIVATE KEY----- -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 -+-----END RSA PRIVATE KEY----- -diff --git a/test/openssl/fixtures/pkey/rsa-2.pem b/test/openssl/fixtures/pkey/rsa-2.pem -new file mode 100644 -index 00000000..e4fd4f43 ---- /dev/null -+++ b/test/openssl/fixtures/pkey/rsa-2.pem -@@ -0,0 +1,51 @@ -+-----BEGIN RSA PRIVATE KEY----- -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 -+-----END RSA PRIVATE KEY----- -diff --git a/test/openssl/fixtures/pkey/rsa-3.pem b/test/openssl/fixtures/pkey/rsa-3.pem -new file mode 100644 -index 00000000..6c9c9ced ---- /dev/null -+++ b/test/openssl/fixtures/pkey/rsa-3.pem -@@ -0,0 +1,51 @@ -+-----BEGIN RSA PRIVATE KEY----- -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 -+-----END RSA PRIVATE KEY----- -diff --git a/test/openssl/test_pair.rb b/test/openssl/test_pair.rb -index eac3655e..8d6ca1e9 100644 ---- a/test/openssl/test_pair.rb -+++ b/test/openssl/test_pair.rb -@@ -10,7 +10,7 @@ def setup - ee_exts = [ - ["keyUsage", "keyEncipherment,digitalSignature", true], - ] -- @svr_key = OpenSSL::TestUtils::Fixtures.pkey("rsa1024") -+ @svr_key = OpenSSL::TestUtils::Fixtures.pkey("rsa-1") - @svr_cert = issue_cert(svr_dn, @svr_key, 1, ee_exts, nil, nil) - end - -@@ -23,7 +23,7 @@ def ssl_pair - sctx = OpenSSL::SSL::SSLContext.new - sctx.cert = @svr_cert - sctx.key = @svr_key -- sctx.tmp_dh_callback = proc { OpenSSL::TestUtils::Fixtures.pkey_dh("dh1024") } -+ sctx.tmp_dh_callback = proc { OpenSSL::TestUtils::Fixtures.pkey("dh-1") } - sctx.options |= OpenSSL::SSL::OP_NO_COMPRESSION - ssls = OpenSSL::SSL::SSLServer.new(tcps, sctx) - ns = ssls.accept -@@ -397,7 +397,7 @@ def test_connect_accept_nonblock_no_exception - ctx2 = OpenSSL::SSL::SSLContext.new - ctx2.cert = @svr_cert - ctx2.key = @svr_key -- ctx2.tmp_dh_callback = proc { OpenSSL::TestUtils::Fixtures.pkey_dh("dh1024") } -+ ctx2.tmp_dh_callback = proc { OpenSSL::TestUtils::Fixtures.pkey("dh-1") } - - sock1, sock2 = tcp_pair - -@@ -445,7 +445,7 @@ def test_connect_accept_nonblock - ctx = OpenSSL::SSL::SSLContext.new - ctx.cert = @svr_cert - ctx.key = @svr_key -- ctx.tmp_dh_callback = proc { OpenSSL::TestUtils::Fixtures.pkey_dh("dh1024") } -+ ctx.tmp_dh_callback = proc { OpenSSL::TestUtils::Fixtures.pkey("dh-1") } - - sock1, sock2 = tcp_pair - -diff --git a/test/openssl/test_pkey_dh.rb b/test/openssl/test_pkey_dh.rb -index fb713813..79bf9bb7 100644 ---- a/test/openssl/test_pkey_dh.rb -+++ b/test/openssl/test_pkey_dh.rb -@@ -19,7 +19,7 @@ def test_new_break - end - - def test_DHparams -- dh1024 = Fixtures.pkey_dh("dh1024") -+ dh1024 = Fixtures.pkey("dh1024") - asn1 = OpenSSL::ASN1::Sequence([ - OpenSSL::ASN1::Integer(dh1024.p), - OpenSSL::ASN1::Integer(dh1024.g) -@@ -42,7 +42,7 @@ def test_DHparams - end - - def test_public_key -- dh = Fixtures.pkey_dh("dh1024") -+ dh = Fixtures.pkey("dh1024") - public_key = dh.public_key - assert_no_key(public_key) #implies public_key.public? is false! - assert_equal(dh.to_der, public_key.to_der) -@@ -50,14 +50,14 @@ def test_public_key - end - - def test_generate_key -- dh = Fixtures.pkey_dh("dh1024").public_key # creates a copy -+ dh = Fixtures.pkey("dh1024").public_key # creates a copy - assert_no_key(dh) - dh.generate_key! - assert_key(dh) - end - - def test_key_exchange -- dh = Fixtures.pkey_dh("dh1024") -+ dh = Fixtures.pkey("dh1024") - dh2 = dh.public_key - dh.generate_key! - dh2.generate_key! -diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb -index 408c7d82..2633f7c4 100644 ---- a/test/openssl/test_ssl.rb -+++ b/test/openssl/test_ssl.rb -@@ -708,7 +708,7 @@ def socketpair - - def test_tlsext_hostname - fooctx = OpenSSL::SSL::SSLContext.new -- fooctx.tmp_dh_callback = proc { Fixtures.pkey_dh("dh1024") } -+ fooctx.tmp_dh_callback = proc { Fixtures.pkey("dh-1") } - fooctx.cert = @cli_cert - fooctx.key = @cli_key - -@@ -760,7 +760,7 @@ def test_servername_cb_raises_an_exception_on_unknown_objects - ctx2 = OpenSSL::SSL::SSLContext.new - ctx2.cert = @svr_cert - ctx2.key = @svr_key -- ctx2.tmp_dh_callback = proc { Fixtures.pkey_dh("dh1024") } -+ ctx2.tmp_dh_callback = proc { Fixtures.pkey("dh-1") } - ctx2.servername_cb = lambda { |args| Object.new } - - sock1, sock2 = socketpair -@@ -1140,7 +1140,7 @@ def test_alpn_protocol_selection_cancel - ctx1 = OpenSSL::SSL::SSLContext.new - ctx1.cert = @svr_cert - ctx1.key = @svr_key -- ctx1.tmp_dh_callback = proc { Fixtures.pkey_dh("dh1024") } -+ ctx1.tmp_dh_callback = proc { Fixtures.pkey("dh-1") } - ctx1.alpn_select_cb = -> (protocols) { nil } - ssl1 = OpenSSL::SSL::SSLSocket.new(sock1, ctx1) - -@@ -1382,20 +1382,21 @@ def test_get_ephemeral_key - def test_dh_callback - pend "TLS 1.2 is not supported" unless tls12_supported? - -+ dh = Fixtures.pkey("dh-1") - called = false - ctx_proc = -> ctx { - ctx.ssl_version = :TLSv1_2 - ctx.ciphers = "DH:!NULL" - ctx.tmp_dh_callback = ->(*args) { - called = true -- Fixtures.pkey_dh("dh1024") -+ dh - } - } - start_server(ctx_proc: ctx_proc) do |port| - server_connect(port) { |ssl| - assert called, "dh callback should be called" - if ssl.respond_to?(:tmp_key) -- assert_equal Fixtures.pkey_dh("dh1024").to_der, ssl.tmp_key.to_der -+ assert_equal dh.to_der, ssl.tmp_key.to_der - end - } - end -diff --git a/test/openssl/utils.rb b/test/openssl/utils.rb -index b7ddd891..fe626ade 100644 ---- a/test/openssl/utils.rb -+++ b/test/openssl/utils.rb -@@ -42,10 +42,8 @@ module Fixtures - - def pkey(name) - OpenSSL::PKey.read(read_file("pkey", name)) -- end -- -- def pkey_dh(name) -- # DH parameters can be read by OpenSSL::PKey.read atm -+ rescue OpenSSL::PKey::PKeyError -+ # TODO: DH parameters can be read by OpenSSL::PKey.read atm - OpenSSL::PKey::DH.new(read_file("pkey", name)) - end - -@@ -157,9 +155,9 @@ class OpenSSL::SSLTestCase < OpenSSL::TestCase - - def setup - super -- @ca_key = Fixtures.pkey("rsa2048") -- @svr_key = Fixtures.pkey("rsa1024") -- @cli_key = Fixtures.pkey("rsa2048") -+ @ca_key = Fixtures.pkey("rsa-1") -+ @svr_key = Fixtures.pkey("rsa-2") -+ @cli_key = Fixtures.pkey("rsa-3") - @ca = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=CA") - @svr = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=localhost") - @cli = OpenSSL::X509::Name.parse("/DC=org/DC=ruby-lang/CN=localhost") -@@ -200,7 +198,7 @@ def start_server(verify_mode: OpenSSL::SSL::VERIFY_NONE, start_immediately: true - ctx.cert_store = store - ctx.cert = @svr_cert - ctx.key = @svr_key -- ctx.tmp_dh_callback = proc { Fixtures.pkey_dh("dh1024") } -+ ctx.tmp_dh_callback = proc { Fixtures.pkey("dh-1") } - ctx.verify_mode = verify_mode - ctx_proc.call(ctx) if ctx_proc - diff --git a/SOURCES/ruby-2.6.10-Fix-CVE-2022-28739-Buffer-overrun-in-str2float.patch b/SOURCES/ruby-2.6.10-Fix-CVE-2022-28739-Buffer-overrun-in-str2float.patch deleted file mode 100644 index 5c7aec5..0000000 --- a/SOURCES/ruby-2.6.10-Fix-CVE-2022-28739-Buffer-overrun-in-str2float.patch +++ /dev/null @@ -1,73 +0,0 @@ -From 8e2ed0b9d965a526b29f9dc3bff8e9fe33dae98d Mon Sep 17 00:00:00 2001 -From: usa -Date: Tue, 12 Apr 2022 11:49:45 +0000 -Subject: [PATCH] Fix CVE-2022-28739 Buffer overrun in str2float. - -CVE-2022-28739: Buffer overrun in String-to-Float conversion -Backported from upstream Ruby 2.6.10, -Git commit: -https://github.com/ruby/ruby/commit/69f9992ed41920389d4185141a14f02f89a4d306 - -==== Original commit message - -Fix dtoa buffer overrun - -git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_6@67957 b2dd03c8-39d4-4d8f-98ff-823fe69b080e ---- - test/ruby/test_float.rb | 18 ++++++++++++++++++ - util.c | 3 ++- - 2 files changed, 20 insertions(+), 1 deletion(-) - -diff --git a/test/ruby/test_float.rb b/test/ruby/test_float.rb -index 7fabfd3..78c63c2 100644 ---- a/test/ruby/test_float.rb -+++ b/test/ruby/test_float.rb -@@ -171,6 +171,24 @@ class TestFloat < Test::Unit::TestCase - assert_raise(ArgumentError, n += z + "A") {Float(n)} - assert_raise(ArgumentError, n += z + ".0") {Float(n)} - end -+ -+ x = nil -+ 2000.times do -+ x = Float("0x"+"0"*30) -+ break unless x == 0.0 -+ end -+ assert_equal(0.0, x, ->{"%a" % x}) -+ x = nil -+ 2000.times do -+ begin -+ x = Float("0x1."+"0"*270) -+ rescue ArgumentError => e -+ raise unless /"0x1\.0{270}"/ =~ e.message -+ else -+ break -+ end -+ end -+ assert_nil(x, ->{"%a" % x}) - end - - def test_divmod -diff --git a/util.c b/util.c -index 2222744..f1d910f 100644 ---- a/util.c -+++ b/util.c -@@ -2046,6 +2046,7 @@ break2: - if (!*++s || !(s1 = strchr(hexdigit, *s))) goto ret0; - if (*s == '0') { - while (*++s == '0'); -+ if (!*s) goto ret; - s1 = strchr(hexdigit, *s); - } - if (s1 != NULL) { -@@ -2068,7 +2069,7 @@ break2: - for (; *s && (s1 = strchr(hexdigit, *s)); ++s) { - adj += aadj * ((s1 - hexdigit) & 15); - if ((aadj /= 16) == 0.0) { -- while (strchr(hexdigit, *++s)); -+ while (*++s && strchr(hexdigit, *s)); - break; - } - } --- -2.41.0 - diff --git a/SOURCES/ruby-2.6.3-fiddle-1.0.0-ffi-closure-alloc-default.patch b/SOURCES/ruby-2.6.3-fiddle-1.0.0-ffi-closure-alloc-default.patch deleted file mode 100644 index c54f1e4..0000000 --- a/SOURCES/ruby-2.6.3-fiddle-1.0.0-ffi-closure-alloc-default.patch +++ /dev/null @@ -1,61 +0,0 @@ -diff --git a/ext/fiddle/closure.c b/ext/fiddle/closure.c -index 1a80b2b..b997e23 100644 ---- a/ext/fiddle/closure.c -+++ b/ext/fiddle/closure.c -@@ -13,25 +13,11 @@ typedef struct { - ffi_type **argv; - } fiddle_closure; - --#if defined(USE_FFI_CLOSURE_ALLOC) --#elif defined(__OpenBSD__) || defined(__APPLE__) || defined(__linux__) --# define USE_FFI_CLOSURE_ALLOC 0 --#elif defined(RUBY_LIBFFI_MODVERSION) && RUBY_LIBFFI_MODVERSION < 3000005 && \ -- (defined(__i386__) || defined(__x86_64__) || defined(_M_IX86) || defined(_M_AMD64)) --# define USE_FFI_CLOSURE_ALLOC 0 --#else --# define USE_FFI_CLOSURE_ALLOC 1 --#endif -- - static void - dealloc(void * ptr) - { - fiddle_closure * cls = (fiddle_closure *)ptr; --#if USE_FFI_CLOSURE_ALLOC - ffi_closure_free(cls->pcl); --#else -- munmap(cls->pcl, sizeof(*cls->pcl)); --#endif - if (cls->argv) xfree(cls->argv); - xfree(cls); - } -@@ -205,12 +191,7 @@ allocate(VALUE klass) - VALUE i = TypedData_Make_Struct(klass, fiddle_closure, - &closure_data_type, closure); - --#if USE_FFI_CLOSURE_ALLOC - closure->pcl = ffi_closure_alloc(sizeof(ffi_closure), &closure->code); --#else -- closure->pcl = mmap(NULL, sizeof(ffi_closure), PROT_READ | PROT_WRITE, -- MAP_ANON | MAP_PRIVATE, -1, 0); --#endif - - return i; - } -@@ -257,17 +238,8 @@ initialize(int rbargc, VALUE argv[], VALUE self) - if (FFI_OK != result) - rb_raise(rb_eRuntimeError, "error prepping CIF %d", result); - --#if USE_FFI_CLOSURE_ALLOC - result = ffi_prep_closure_loc(pcl, cif, callback, - (void *)self, cl->code); --#else -- result = ffi_prep_closure(pcl, cif, callback, (void *)self); -- cl->code = (void *)pcl; -- i = mprotect(pcl, sizeof(*pcl), PROT_READ | PROT_EXEC); -- if (i) { -- rb_sys_fail("mprotect"); -- } --#endif - - if (FFI_OK != result) - rb_raise(rb_eRuntimeError, "error prepping closure %d", result); diff --git a/SOURCES/ruby-2.6.8-net-ftp-pasv-can-connect-to-arbitrary-host.patch b/SOURCES/ruby-2.6.8-net-ftp-pasv-can-connect-to-arbitrary-host.patch deleted file mode 100644 index 03f9685..0000000 --- a/SOURCES/ruby-2.6.8-net-ftp-pasv-can-connect-to-arbitrary-host.patch +++ /dev/null @@ -1,247 +0,0 @@ -commit be5a83e84a34091f2a4e3c6dfb911b20e78e690c -Author: usa -Date: Wed Jul 7 10:34:08 2021 +0000 - - Ignore IP addresses in PASV responses by default, and add new option use_pasv_ip - - This fixes CVE-2021-31810. - Reported by Alexandr Savca. - - Co-authored-by: Shugo Maeda - - - git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_6@67949 b2dd03c8-39d4-4d8f-98ff-823fe69b080e - -diff --git a/lib/net/ftp.rb b/lib/net/ftp.rb -index e68d825dcf..c5d669d898 100644 ---- a/lib/net/ftp.rb -+++ b/lib/net/ftp.rb -@@ -97,6 +97,10 @@ class FTP < Protocol - # When +true+, the connection is in passive mode. Default: +true+. - attr_accessor :passive - -+ # When +true+, use the IP address in PASV responses. Otherwise, it uses -+ # the same IP address for the control connection. Default: +false+. -+ attr_accessor :use_pasv_ip -+ - # When +true+, all traffic to and from the server is written - # to +$stdout+. Default: +false+. - attr_accessor :debug_mode -@@ -205,6 +209,9 @@ def FTP.open(host, *args) - # handshake. - # See Net::FTP#ssl_handshake_timeout for - # details. Default: +nil+. -+ # use_pasv_ip:: When +true+, use the IP address in PASV responses. -+ # Otherwise, it uses the same IP address for the control -+ # connection. Default: +false+. - # debug_mode:: When +true+, all traffic to and from the server is - # written to +$stdout+. Default: +false+. - # -@@ -265,6 +272,7 @@ def initialize(host = nil, user_or_options = {}, passwd = nil, acct = nil) - @open_timeout = options[:open_timeout] - @ssl_handshake_timeout = options[:ssl_handshake_timeout] - @read_timeout = options[:read_timeout] || 60 -+ @use_pasv_ip = options[:use_pasv_ip] || false - if host - connect(host, options[:port] || FTP_PORT) - if options[:username] -@@ -1330,7 +1338,12 @@ def parse227(resp) # :nodoc: - raise FTPReplyError, resp - end - if m = /\((?\d+(,\d+){3}),(?\d+,\d+)\)/.match(resp) -- return parse_pasv_ipv4_host(m["host"]), parse_pasv_port(m["port"]) -+ if @use_pasv_ip -+ host = parse_pasv_ipv4_host(m["host"]) -+ else -+ host = @bare_sock.remote_address.ip_address -+ end -+ return host, parse_pasv_port(m["port"]) - else - raise FTPProtoError, resp - end -diff --git a/test/net/ftp/test_ftp.rb b/test/net/ftp/test_ftp.rb -index a5219644bb..b3fe7774ed 100644 ---- a/test/net/ftp/test_ftp.rb -+++ b/test/net/ftp/test_ftp.rb -@@ -61,7 +61,7 @@ def test_connect_fail - end - - def test_parse227 -- ftp = Net::FTP.new -+ ftp = Net::FTP.new(nil, use_pasv_ip: true) - host, port = ftp.send(:parse227, "227 Entering Passive Mode (192,168,0,1,12,34)") - assert_equal("192.168.0.1", host) - assert_equal(3106, port) -@@ -80,6 +80,14 @@ def test_parse227 - assert_raise(Net::FTPProtoError) do - ftp.send(:parse227, "227 ) foo bar (") - end -+ -+ ftp = Net::FTP.new -+ sock = OpenStruct.new -+ sock.remote_address = OpenStruct.new -+ sock.remote_address.ip_address = "10.0.0.1" -+ ftp.instance_variable_set(:@bare_sock, sock) -+ host, port = ftp.send(:parse227, "227 Entering Passive Mode (192,168,0,1,12,34)") -+ assert_equal("10.0.0.1", host) - end - - def test_parse228 -@@ -2360,10 +2368,155 @@ def test_puttextfile_command_injection - end - end - -+ def test_ignore_pasv_ip -+ commands = [] -+ binary_data = (0..0xff).map {|i| i.chr}.join * 4 * 3 -+ server = create_ftp_server(nil, "127.0.0.1") { |sock| -+ sock.print("220 (test_ftp).\r\n") -+ commands.push(sock.gets) -+ sock.print("331 Please specify the password.\r\n") -+ commands.push(sock.gets) -+ sock.print("230 Login successful.\r\n") -+ commands.push(sock.gets) -+ sock.print("200 Switching to Binary mode.\r\n") -+ line = sock.gets -+ commands.push(line) -+ data_server = TCPServer.new("127.0.0.1", 0) -+ port = data_server.local_address.ip_port -+ sock.printf("227 Entering Passive Mode (999,0,0,1,%s).\r\n", -+ port.divmod(256).join(",")) -+ commands.push(sock.gets) -+ sock.print("150 Opening BINARY mode data connection for foo (#{binary_data.size} bytes)\r\n") -+ conn = data_server.accept -+ binary_data.scan(/.{1,1024}/nm) do |s| -+ conn.print(s) -+ end -+ conn.shutdown(Socket::SHUT_WR) -+ conn.read -+ conn.close -+ data_server.close -+ sock.print("226 Transfer complete.\r\n") -+ } -+ begin -+ begin -+ ftp = Net::FTP.new -+ ftp.passive = true -+ ftp.read_timeout *= 5 if defined?(RubyVM::MJIT) && RubyVM::MJIT.enabled? # for --jit-wait -+ ftp.connect("127.0.0.1", server.port) -+ ftp.login -+ assert_match(/\AUSER /, commands.shift) -+ assert_match(/\APASS /, commands.shift) -+ assert_equal("TYPE I\r\n", commands.shift) -+ buf = ftp.getbinaryfile("foo", nil) -+ assert_equal(binary_data, buf) -+ assert_equal(Encoding::ASCII_8BIT, buf.encoding) -+ assert_equal("PASV\r\n", commands.shift) -+ assert_equal("RETR foo\r\n", commands.shift) -+ assert_equal(nil, commands.shift) -+ ensure -+ ftp.close if ftp -+ end -+ ensure -+ server.close -+ end -+ end -+ -+ def test_use_pasv_ip -+ commands = [] -+ binary_data = (0..0xff).map {|i| i.chr}.join * 4 * 3 -+ server = create_ftp_server(nil, "127.0.0.1") { |sock| -+ sock.print("220 (test_ftp).\r\n") -+ commands.push(sock.gets) -+ sock.print("331 Please specify the password.\r\n") -+ commands.push(sock.gets) -+ sock.print("230 Login successful.\r\n") -+ commands.push(sock.gets) -+ sock.print("200 Switching to Binary mode.\r\n") -+ line = sock.gets -+ commands.push(line) -+ data_server = TCPServer.new("127.0.0.1", 0) -+ port = data_server.local_address.ip_port -+ sock.printf("227 Entering Passive Mode (127,0,0,1,%s).\r\n", -+ port.divmod(256).join(",")) -+ commands.push(sock.gets) -+ sock.print("150 Opening BINARY mode data connection for foo (#{binary_data.size} bytes)\r\n") -+ conn = data_server.accept -+ binary_data.scan(/.{1,1024}/nm) do |s| -+ conn.print(s) -+ end -+ conn.shutdown(Socket::SHUT_WR) -+ conn.read -+ conn.close -+ data_server.close -+ sock.print("226 Transfer complete.\r\n") -+ } -+ begin -+ begin -+ ftp = Net::FTP.new -+ ftp.passive = true -+ ftp.use_pasv_ip = true -+ ftp.read_timeout *= 5 if defined?(RubyVM::MJIT) && RubyVM::MJIT.enabled? # for --jit-wait -+ ftp.connect("127.0.0.1", server.port) -+ ftp.login -+ assert_match(/\AUSER /, commands.shift) -+ assert_match(/\APASS /, commands.shift) -+ assert_equal("TYPE I\r\n", commands.shift) -+ buf = ftp.getbinaryfile("foo", nil) -+ assert_equal(binary_data, buf) -+ assert_equal(Encoding::ASCII_8BIT, buf.encoding) -+ assert_equal("PASV\r\n", commands.shift) -+ assert_equal("RETR foo\r\n", commands.shift) -+ assert_equal(nil, commands.shift) -+ ensure -+ ftp.close if ftp -+ end -+ ensure -+ server.close -+ end -+ end -+ -+ def test_use_pasv_invalid_ip -+ commands = [] -+ binary_data = (0..0xff).map {|i| i.chr}.join * 4 * 3 -+ server = create_ftp_server(nil, "127.0.0.1") { |sock| -+ sock.print("220 (test_ftp).\r\n") -+ commands.push(sock.gets) -+ sock.print("331 Please specify the password.\r\n") -+ commands.push(sock.gets) -+ sock.print("230 Login successful.\r\n") -+ commands.push(sock.gets) -+ sock.print("200 Switching to Binary mode.\r\n") -+ line = sock.gets -+ commands.push(line) -+ sock.print("227 Entering Passive Mode (999,0,0,1,48,57).\r\n") -+ commands.push(sock.gets) -+ } -+ begin -+ begin -+ ftp = Net::FTP.new -+ ftp.passive = true -+ ftp.use_pasv_ip = true -+ ftp.read_timeout *= 5 if defined?(RubyVM::MJIT) && RubyVM::MJIT.enabled? # for --jit-wait -+ ftp.connect("127.0.0.1", server.port) -+ ftp.login -+ assert_match(/\AUSER /, commands.shift) -+ assert_match(/\APASS /, commands.shift) -+ assert_equal("TYPE I\r\n", commands.shift) -+ assert_raise(SocketError) do -+ ftp.getbinaryfile("foo", nil) -+ end -+ ensure -+ ftp.close if ftp -+ end -+ ensure -+ server.close -+ end -+ end -+ - private - -- def create_ftp_server(sleep_time = nil) -- server = TCPServer.new(SERVER_ADDR, 0) -+ def create_ftp_server(sleep_time = nil, addr = SERVER_ADDR) -+ server = TCPServer.new(addr, 0) - @thread = Thread.start do - if sleep_time - sleep(sleep_time) diff --git a/SOURCES/ruby-2.6.8-net-imap-startls-stripping-vulnerability.patch b/SOURCES/ruby-2.6.8-net-imap-startls-stripping-vulnerability.patch deleted file mode 100644 index 83a655f..0000000 --- a/SOURCES/ruby-2.6.8-net-imap-startls-stripping-vulnerability.patch +++ /dev/null @@ -1,101 +0,0 @@ -commit 95ba9053e20ad8d113af37b3f1f4cbfff1f6a8f1 -Author: usa -Date: Wed Jul 7 10:38:10 2021 +0000 - - Fix StartTLS stripping vulnerability - - Reported by Alexandr Savca in https://hackerone.com/reports/1178562 - - Co-authored-by: Shugo Maeda - - - git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_6@67950 b2dd03c8-39d4-4d8f-98ff-823fe69b080e - -diff --git a/lib/net/imap.rb b/lib/net/imap.rb -index 1c7e89ba14..91df89b79e 100644 ---- a/lib/net/imap.rb -+++ b/lib/net/imap.rb -@@ -1213,12 +1213,14 @@ def get_tagged_response(tag, cmd) - end - resp = @tagged_responses.delete(tag) - case resp.name -+ when /\A(?:OK)\z/ni -+ return resp - when /\A(?:NO)\z/ni - raise NoResponseError, resp - when /\A(?:BAD)\z/ni - raise BadResponseError, resp - else -- return resp -+ raise UnknownResponseError, resp - end - end - -@@ -3714,6 +3716,10 @@ class BadResponseError < ResponseError - class ByeResponseError < ResponseError - end - -+ # Error raised upon an unknown response from the server. -+ class UnknownResponseError < ResponseError -+ end -+ - RESPONSE_ERRORS = Hash.new(ResponseError) - RESPONSE_ERRORS["NO"] = NoResponseError - RESPONSE_ERRORS["BAD"] = BadResponseError -diff --git a/test/net/imap/test_imap.rb b/test/net/imap/test_imap.rb -index 936f4e0f42..81928cb8fe 100644 ---- a/test/net/imap/test_imap.rb -+++ b/test/net/imap/test_imap.rb -@@ -127,6 +127,24 @@ def test_starttls - imap.disconnect - end - end -+ -+ def test_starttls_stripping -+ starttls_stripping_test do |port| -+ imap = Net::IMAP.new("localhost", :port => port) -+ assert_raise(Net::IMAP::UnknownResponseError) do -+ imap.starttls(:ca_file => CA_FILE) -+ end -+ imap -+ end -+ end -+ end -+ -+ def start_server -+ th = Thread.new do -+ yield -+ end -+ @threads << th -+ sleep 0.1 until th.stop? - end - - def test_unexpected_eof -@@ -760,6 +760,27 @@ def starttls_test - end - end - -+ def starttls_stripping_test -+ server = create_tcp_server -+ port = server.addr[1] -+ start_server do -+ sock = server.accept -+ begin -+ sock.print("* OK test server\r\n") -+ sock.gets -+ sock.print("RUBY0001 BUG unhandled command\r\n") -+ ensure -+ sock.close -+ server.close -+ end -+ end -+ begin -+ imap = yield(port) -+ ensure -+ imap.disconnect if imap && !imap.disconnected? -+ end -+ end -+ - def create_tcp_server - return TCPServer.new(server_addr, 0) - end diff --git a/SOURCES/ruby-2.6.8-rdoc-6.1.2.1-command-injection-vulnerability.patch b/SOURCES/ruby-2.6.8-rdoc-6.1.2.1-command-injection-vulnerability.patch deleted file mode 100644 index 2cca400..0000000 --- a/SOURCES/ruby-2.6.8-rdoc-6.1.2.1-command-injection-vulnerability.patch +++ /dev/null @@ -1,88 +0,0 @@ -commit fe3c49c9baeeab58304ede915b7edd18ecf360fc -Author: usa -Date: Sat Jul 3 17:10:28 2021 +0000 - - merge revision(s) b1c73f23,c9ab8fe2: [Backport #17877] - - [ruby/rdoc] Use File.open to fix the OS Command Injection vulnerability in CVE-2021-31799 - - https://github.com/ruby/rdoc/commit/a7f5d6ab88 - - The test for command injection on Unix platforms should be omitted on Windows - - - git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_6@67947 b2dd03c8-39d4-4d8f-98ff-823fe69b080e - -diff --git a/lib/rdoc/rdoc.rb b/lib/rdoc/rdoc.rb -index ca2c1abefd..46aace7839 100644 ---- a/lib/rdoc/rdoc.rb -+++ b/lib/rdoc/rdoc.rb -@@ -436,7 +436,7 @@ def remove_unparseable files - files.reject do |file| - file =~ /\.(?:class|eps|erb|scpt\.txt|svg|ttf|yml)$/i or - (file =~ /tags$/i and -- open(file, 'rb') { |io| -+ File.open(file, 'rb') { |io| - io.read(100) =~ /\A(\f\n[^,]+,\d+$|!_TAG_)/ - }) - end ---- a/lib/rdoc/encoding.rb 2022-02-16 16:51:28.080178281 +0100 -+++ b/lib/rdoc/encoding.rb 2022-02-16 16:51:37.108160840 +0100 -@@ -18,7 +18,7 @@ - # unknown character in the target encoding will be replaced with '?' - - def self.read_file filename, encoding, force_transcode = false -- content = open filename, "rb" do |f| f.read end -+ content = File.open filename, "rb" do |f| f.read end - content.gsub!("\r\n", "\n") if RUBY_PLATFORM =~ /mswin|mingw/ - - utf8 = content.sub!(/\A\xef\xbb\xbf/, '') ---- a/lib/rdoc/parser.rb 2021-04-05 13:46:35.000000000 +0200 -+++ b/lib/rdoc/parser.rb 2022-02-16 15:37:17.904822389 +0100 -@@ -74,7 +74,12 @@ - def self.binary?(file) - return false if file =~ /\.(rdoc|txt)$/ - -- s = File.read(file, 1024) or return false -+ begin -+ open_file = File.open(file) -+ s = open_file.read(1024) or return false -+ ensure -+ open_file.close if open_file -+ end - - return true if s[0, 2] == Marshal.dump('')[0, 2] or s.index("\x00") - -@@ -92,7 +97,8 @@ - # http://www.garykessler.net/library/file_sigs.html - - def self.zip? file -- zip_signature = File.read file, 4 -+ zip_signature = '' -+ File.open(file) { |f| zip_signature = f.read(4) } - - zip_signature == "PK\x03\x04" or - zip_signature == "PK\x05\x06" or -diff --git a/test/rdoc/test_rdoc_rdoc.rb b/test/rdoc/test_rdoc_rdoc.rb -index 3bce54b243..123b1a4f87 100644 ---- a/test/rdoc/test_rdoc_rdoc.rb -+++ b/test/rdoc/test_rdoc_rdoc.rb -@@ -366,6 +366,18 @@ def test_remove_unparseable_tags_vim - end - end - -+ def test_remove_unparseable_CVE_2021_31799 -+ skip 'for Un*x platforms' if Gem.win_platform? -+ temp_dir do -+ file_list = ['| touch evil.txt && echo tags'] -+ file_list.each do |f| -+ FileUtils.touch f -+ end -+ assert_equal file_list, @rdoc.remove_unparseable(file_list) -+ assert_equal file_list, Dir.children('.') -+ end -+ end -+ - def test_setup_output_dir - Dir.mktmpdir {|d| - path = File.join d, 'testdir' diff --git a/SOURCES/ruby-2.6.9-cgi-0.1.1-cookie-parse-not-decode-names.patch b/SOURCES/ruby-2.6.9-cgi-0.1.1-cookie-parse-not-decode-names.patch deleted file mode 100644 index ba3bb3b..0000000 --- a/SOURCES/ruby-2.6.9-cgi-0.1.1-cookie-parse-not-decode-names.patch +++ /dev/null @@ -1,42 +0,0 @@ -From e2c0652dff671dc6e16a80887e781edc0abc8454 Mon Sep 17 00:00:00 2001 -From: usa -Date: Wed, 24 Nov 2021 11:41:55 +0000 -Subject: [PATCH 2/2] When parsing cookies, only decode the values - -git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_6@67953 b2dd03c8-39d4-4d8f-98ff-823fe69b080e ---- - lib/cgi/cookie.rb | 1 - - test/cgi/test_cgi_cookie.rb | 5 +++++ - 2 files changed, 5 insertions(+), 1 deletion(-) - -diff --git a/lib/cgi/cookie.rb b/lib/cgi/cookie.rb -index a2155edb77..009566bb92 100644 ---- a/lib/cgi/cookie.rb -+++ b/lib/cgi/cookie.rb -@@ -165,7 +165,6 @@ def self.parse(raw_cookie) - raw_cookie.split(/;\s?/).each do |pairs| - name, values = pairs.split('=',2) - next unless name and values -- name = CGI.unescape(name) - values ||= "" - values = values.split('&').collect{|v| CGI.unescape(v,@@accept_charset) } - if cookies.has_key?(name) -diff --git a/test/cgi/test_cgi_cookie.rb b/test/cgi/test_cgi_cookie.rb -index 115a57e4a1..985cc0d7a1 100644 ---- a/test/cgi/test_cgi_cookie.rb -+++ b/test/cgi/test_cgi_cookie.rb -@@ -101,6 +101,11 @@ def test_cgi_cookie_parse - end - end - -+ def test_cgi_cookie_parse_not_decode_name -+ cookie_str = "%66oo=baz;foo=bar" -+ cookies = CGI::Cookie.parse(cookie_str) -+ assert_equal({"%66oo" => ["baz"], "foo" => ["bar"]}, cookies) -+ end - - def test_cgi_cookie_arrayinterface - cookie = CGI::Cookie.new('name1', 'a', 'b', 'c') --- -2.36.1 - diff --git a/SOURCES/ruby-2.6.9-date-2.0.1-parse-length-limit.patch b/SOURCES/ruby-2.6.9-date-2.0.1-parse-length-limit.patch deleted file mode 100644 index 22ba7eb..0000000 --- a/SOURCES/ruby-2.6.9-date-2.0.1-parse-length-limit.patch +++ /dev/null @@ -1,918 +0,0 @@ -From d5753ec513fa5a4bdcf59fa298642fd0d3a3c364 Mon Sep 17 00:00:00 2001 -From: Yusuke Endoh -Date: Fri, 12 Nov 2021 12:11:13 +0900 -Subject: [PATCH 1/2] Add length limit option for methods that parses date - strings - -This patch fixes CVE-2021-41817 and created from the commit -. -We didn't merge the files included in the original commit below, as those are -for rebasing date gem version. - -* ext/date/date.gemspec -* ext/date/lib/date.rb - -== Original commit message == - -`Date.parse` now raises an ArgumentError when a given date string is -longer than 128. You can configure the limit by giving `limit` keyword -arguments like `Date.parse(str, limit: 1000)`. If you pass `limit: nil`, -the limit is disabled. - -Not only `Date.parse` but also the following methods are changed. - -* Date._parse -* Date.parse -* DateTime.parse -* Date._iso8601 -* Date.iso8601 -* DateTime.iso8601 -* Date._rfc3339 -* Date.rfc3339 -* DateTime.rfc3339 -* Date._xmlschema -* Date.xmlschema -* DateTime.xmlschema -* Date._rfc2822 -* Date.rfc2822 -* DateTime.rfc2822 -* Date._rfc822 -* Date.rfc822 -* DateTime.rfc822 -* Date._jisx0301 -* Date.jisx0301 -* DateTime.jisx0301 ---- - ext/date/date_core.c | 384 +++++++++++++++++++++++++++-------- - test/date/test_date_parse.rb | 29 +++ - 2 files changed, 325 insertions(+), 88 deletions(-) - -diff --git a/ext/date/date_core.c b/ext/date/date_core.c -index c250633426..177ea0f6c5 100644 ---- a/ext/date/date_core.c -+++ b/ext/date/date_core.c -@@ -4290,12 +4290,37 @@ date_s_strptime(int argc, VALUE *argv, VALUE klass) - - VALUE date__parse(VALUE str, VALUE comp); - -+static size_t -+get_limit(VALUE opt) -+{ -+ if (!NIL_P(opt)) { -+ VALUE limit = rb_hash_aref(opt, ID2SYM(rb_intern("limit"))); -+ if (NIL_P(limit)) return SIZE_MAX; -+ return NUM2SIZET(limit); -+ } -+ return 128; -+} -+ -+static void -+check_limit(VALUE str, VALUE opt) -+{ -+ StringValue(str); -+ size_t slen = RSTRING_LEN(str); -+ size_t limit = get_limit(opt); -+ if (slen > limit) { -+ rb_raise(rb_eArgError, -+ "string length (%"PRI_SIZE_PREFIX"u) exceeds the limit %"PRI_SIZE_PREFIX"u", slen, limit); -+ } -+} -+ - static VALUE - date_s__parse_internal(int argc, VALUE *argv, VALUE klass) - { -- VALUE vstr, vcomp, hash; -+ VALUE vstr, vcomp, hash, opt; - -- rb_scan_args(argc, argv, "11", &vstr, &vcomp); -+ rb_scan_args(argc, argv, "11:", &vstr, &vcomp, &opt); -+ if (!NIL_P(opt)) argc--; -+ check_limit(vstr, opt); - StringValue(vstr); - if (!rb_enc_str_asciicompat_p(vstr)) - rb_raise(rb_eArgError, -@@ -4320,7 +4345,7 @@ date_s__parse_internal(int argc, VALUE *argv, VALUE klass) - - /* - * call-seq: -- * Date._parse(string[, comp=true]) -> hash -+ * Date._parse(string[, comp=true], limit: 128) -> hash - * - * Parses the given representation of date and time, and returns a - * hash of parsed elements. This method does not function as a -@@ -4331,6 +4356,10 @@ date_s__parse_internal(int argc, VALUE *argv, VALUE klass) - * it full. - * - * Date._parse('2001-02-03') #=> {:year=>2001, :mon=>2, :mday=>3} -+ * -+ * Raise an ArgumentError when the string length is longer than _limit_. -+ * You can stop this check by passing `limit: nil`, but note that -+ * it may take a long time to parse. - */ - static VALUE - date_s__parse(int argc, VALUE *argv, VALUE klass) -@@ -4340,7 +4369,7 @@ date_s__parse(int argc, VALUE *argv, VALUE klass) - - /* - * call-seq: -- * Date.parse(string='-4712-01-01'[, comp=true[, start=Date::ITALY]]) -> date -+ * Date.parse(string='-4712-01-01'[, comp=true[, start=Date::ITALY]], limit: 128) -> date - * - * Parses the given representation of date and time, and creates a - * date object. This method does not function as a validator. -@@ -4352,13 +4381,18 @@ date_s__parse(int argc, VALUE *argv, VALUE klass) - * Date.parse('2001-02-03') #=> # - * Date.parse('20010203') #=> # - * Date.parse('3rd Feb 2001') #=> # -+ * -+ * Raise an ArgumentError when the string length is longer than _limit_. -+ * You can stop this check by passing `limit: nil`, but note that -+ * it may take a long time to parse. - */ - static VALUE - date_s_parse(int argc, VALUE *argv, VALUE klass) - { -- VALUE str, comp, sg; -+ VALUE str, comp, sg, opt; - -- rb_scan_args(argc, argv, "03", &str, &comp, &sg); -+ rb_scan_args(argc, argv, "03:", &str, &comp, &sg, &opt); -+ if (!NIL_P(opt)) argc--; - - switch (argc) { - case 0: -@@ -4370,11 +4404,12 @@ date_s_parse(int argc, VALUE *argv, VALUE klass) - } - - { -- VALUE argv2[2], hash; -- -- argv2[0] = str; -- argv2[1] = comp; -- hash = date_s__parse(2, argv2, klass); -+ int argc2 = 2; -+ VALUE argv2[3]; -+ argv2[0] = str; -+ argv2[1] = comp; -+ if (!NIL_P(opt)) argv2[argc2++] = opt; -+ VALUE hash = date_s__parse(argc2, argv2, klass); - return d_new_by_frags(klass, hash, sg); - } - } -@@ -4388,19 +4423,28 @@ VALUE date__jisx0301(VALUE); - - /* - * call-seq: -- * Date._iso8601(string) -> hash -+ * Date._iso8601(string, limit: 128) -> hash - * - * Returns a hash of parsed elements. -+ * -+ * Raise an ArgumentError when the string length is longer than _limit_. -+ * You can stop this check by passing `limit: nil`, but note that -+ * it may take a long time to parse. - */ - static VALUE --date_s__iso8601(VALUE klass, VALUE str) -+date_s__iso8601(int argc, VALUE *argv, VALUE klass) - { -+ VALUE str, opt; -+ -+ rb_scan_args(argc, argv, "1:", &str, &opt); -+ check_limit(str, opt); -+ - return date__iso8601(str); - } - - /* - * call-seq: -- * Date.iso8601(string='-4712-01-01'[, start=Date::ITALY]) -> date -+ * Date.iso8601(string='-4712-01-01'[, start=Date::ITALY], limit: 128) -> date - * - * Creates a new Date object by parsing from a string according to - * some typical ISO 8601 formats. -@@ -4408,13 +4452,18 @@ date_s__iso8601(VALUE klass, VALUE str) - * Date.iso8601('2001-02-03') #=> # - * Date.iso8601('20010203') #=> # - * Date.iso8601('2001-W05-6') #=> # -+ * -+ * Raise an ArgumentError when the string length is longer than _limit_. -+ * You can stop this check by passing `limit: nil`, but note that -+ * it may take a long time to parse. - */ - static VALUE - date_s_iso8601(int argc, VALUE *argv, VALUE klass) - { -- VALUE str, sg; -+ VALUE str, sg, opt; - -- rb_scan_args(argc, argv, "02", &str, &sg); -+ rb_scan_args(argc, argv, "02:", &str, &sg, &opt); -+ if (!NIL_P(opt)) argc--; - - switch (argc) { - case 0: -@@ -4424,38 +4473,56 @@ date_s_iso8601(int argc, VALUE *argv, VALUE klass) - } - - { -- VALUE hash = date_s__iso8601(klass, str); -+ int argc2 = 1; -+ VALUE argv2[2]; -+ argv2[0] = str; -+ if (!NIL_P(opt)) argv2[argc2++] = opt; -+ VALUE hash = date_s__iso8601(argc2, argv2, klass); - return d_new_by_frags(klass, hash, sg); - } - } - - /* - * call-seq: -- * Date._rfc3339(string) -> hash -+ * Date._rfc3339(string, limit: 128) -> hash - * - * Returns a hash of parsed elements. -+ * -+ * Raise an ArgumentError when the string length is longer than _limit_. -+ * You can stop this check by passing `limit: nil`, but note that -+ * it may take a long time to parse. - */ - static VALUE --date_s__rfc3339(VALUE klass, VALUE str) -+date_s__rfc3339(int argc, VALUE *argv, VALUE klass) - { -+ VALUE str, opt; -+ -+ rb_scan_args(argc, argv, "1:", &str, &opt); -+ check_limit(str, opt); -+ - return date__rfc3339(str); - } - - /* - * call-seq: -- * Date.rfc3339(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY]) -> date -+ * Date.rfc3339(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY], limit: 128) -> date - * - * Creates a new Date object by parsing from a string according to - * some typical RFC 3339 formats. - * - * Date.rfc3339('2001-02-03T04:05:06+07:00') #=> # -+ * -+ * Raise an ArgumentError when the string length is longer than _limit_. -+ * You can stop this check by passing `limit: nil`, but note that -+ * it may take a long time to parse. - */ - static VALUE - date_s_rfc3339(int argc, VALUE *argv, VALUE klass) - { -- VALUE str, sg; -+ VALUE str, sg, opt; - -- rb_scan_args(argc, argv, "02", &str, &sg); -+ rb_scan_args(argc, argv, "02:", &str, &sg, &opt); -+ if (!NIL_P(opt)) argc--; - - switch (argc) { - case 0: -@@ -4465,38 +4532,56 @@ date_s_rfc3339(int argc, VALUE *argv, VALUE klass) - } - - { -- VALUE hash = date_s__rfc3339(klass, str); -+ int argc2 = 1; -+ VALUE argv2[2]; -+ argv2[0] = str; -+ if (!NIL_P(opt)) argv2[argc2++] = opt; -+ VALUE hash = date_s__rfc3339(argc2, argv2, klass); - return d_new_by_frags(klass, hash, sg); - } - } - - /* - * call-seq: -- * Date._xmlschema(string) -> hash -+ * Date._xmlschema(string, limit: 128) -> hash - * - * Returns a hash of parsed elements. -+ * -+ * Raise an ArgumentError when the string length is longer than _limit_. -+ * You can stop this check by passing `limit: nil`, but note that -+ * it may take a long time to parse. - */ - static VALUE --date_s__xmlschema(VALUE klass, VALUE str) -+date_s__xmlschema(int argc, VALUE *argv, VALUE klass) - { -+ VALUE str, opt; -+ -+ rb_scan_args(argc, argv, "1:", &str, &opt); -+ check_limit(str, opt); -+ - return date__xmlschema(str); - } - - /* - * call-seq: -- * Date.xmlschema(string='-4712-01-01'[, start=Date::ITALY]) -> date -+ * Date.xmlschema(string='-4712-01-01'[, start=Date::ITALY], limit: 128) -> date - * - * Creates a new Date object by parsing from a string according to - * some typical XML Schema formats. - * - * Date.xmlschema('2001-02-03') #=> # -+ * -+ * Raise an ArgumentError when the string length is longer than _limit_. -+ * You can stop this check by passing `limit: nil`, but note that -+ * it may take a long time to parse. - */ - static VALUE - date_s_xmlschema(int argc, VALUE *argv, VALUE klass) - { -- VALUE str, sg; -+ VALUE str, sg, opt; - -- rb_scan_args(argc, argv, "02", &str, &sg); -+ rb_scan_args(argc, argv, "02:", &str, &sg, &opt); -+ if (!NIL_P(opt)) argc--; - - switch (argc) { - case 0: -@@ -4506,41 +4591,58 @@ date_s_xmlschema(int argc, VALUE *argv, VALUE klass) - } - - { -- VALUE hash = date_s__xmlschema(klass, str); -+ int argc2 = 1; -+ VALUE argv2[2]; -+ argv2[0] = str; -+ if (!NIL_P(opt)) argv2[argc2++] = opt; -+ VALUE hash = date_s__xmlschema(argc2, argv2, klass); - return d_new_by_frags(klass, hash, sg); - } - } - - /* - * call-seq: -- * Date._rfc2822(string) -> hash -- * Date._rfc822(string) -> hash -+ * Date._rfc2822(string, limit: 128) -> hash -+ * Date._rfc822(string, limit: 128) -> hash - * - * Returns a hash of parsed elements. -+ * -+ * Raise an ArgumentError when the string length is longer than _limit_. -+ * You can stop this check by passing `limit: nil`, but note that -+ * it may take a long time to parse. - */ - static VALUE --date_s__rfc2822(VALUE klass, VALUE str) -+date_s__rfc2822(int argc, VALUE *argv, VALUE klass) - { -+ VALUE str, opt; -+ -+ rb_scan_args(argc, argv, "1:", &str, &opt); -+ check_limit(str, opt); -+ - return date__rfc2822(str); - } - - /* - * call-seq: -- * Date.rfc2822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY]) -> date -- * Date.rfc822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY]) -> date -+ * Date.rfc2822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY], limit: 128) -> date -+ * Date.rfc822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY], limit: 128) -> date - * - * Creates a new Date object by parsing from a string according to - * some typical RFC 2822 formats. - * - * Date.rfc2822('Sat, 3 Feb 2001 00:00:00 +0000') - * #=> # -+ * -+ * Raise an ArgumentError when the string length is longer than _limit_. -+ * You can stop this check by passing `limit: nil`, but note that -+ * it may take a long time to parse. - */ - static VALUE - date_s_rfc2822(int argc, VALUE *argv, VALUE klass) - { -- VALUE str, sg; -+ VALUE str, sg, opt; - -- rb_scan_args(argc, argv, "02", &str, &sg); -+ rb_scan_args(argc, argv, "02:", &str, &sg, &opt); - - switch (argc) { - case 0: -@@ -4550,39 +4652,56 @@ date_s_rfc2822(int argc, VALUE *argv, VALUE klass) - } - - { -- VALUE hash = date_s__rfc2822(klass, str); -+ int argc2 = 1; -+ VALUE argv2[2]; -+ argv2[0] = str; -+ if (!NIL_P(opt)) argv2[argc2++] = opt; -+ VALUE hash = date_s__rfc2822(argc2, argv2, klass); - return d_new_by_frags(klass, hash, sg); - } - } - - /* - * call-seq: -- * Date._httpdate(string) -> hash -+ * Date._httpdate(string, limit: 128) -> hash - * - * Returns a hash of parsed elements. -+ * -+ * Raise an ArgumentError when the string length is longer than _limit_. -+ * You can stop this check by passing `limit: nil`, but note that -+ * it may take a long time to parse. - */ - static VALUE --date_s__httpdate(VALUE klass, VALUE str) -+date_s__httpdate(int argc, VALUE *argv, VALUE klass) - { -+ VALUE str, opt; -+ -+ rb_scan_args(argc, argv, "1:", &str, &opt); -+ check_limit(str, opt); -+ - return date__httpdate(str); - } - - /* - * call-seq: -- * Date.httpdate(string='Mon, 01 Jan -4712 00:00:00 GMT'[, start=Date::ITALY]) -> date -+ * Date.httpdate(string='Mon, 01 Jan -4712 00:00:00 GMT'[, start=Date::ITALY], limit: 128) -> date - * - * Creates a new Date object by parsing from a string according to - * some RFC 2616 format. - * - * Date.httpdate('Sat, 03 Feb 2001 00:00:00 GMT') - * #=> # -+ * -+ * Raise an ArgumentError when the string length is longer than _limit_. -+ * You can stop this check by passing `limit: nil`, but note that -+ * it may take a long time to parse. - */ - static VALUE - date_s_httpdate(int argc, VALUE *argv, VALUE klass) - { -- VALUE str, sg; -+ VALUE str, sg, opt; - -- rb_scan_args(argc, argv, "02", &str, &sg); -+ rb_scan_args(argc, argv, "02:", &str, &sg, &opt); - - switch (argc) { - case 0: -@@ -4592,38 +4711,56 @@ date_s_httpdate(int argc, VALUE *argv, VALUE klass) - } - - { -- VALUE hash = date_s__httpdate(klass, str); -+ int argc2 = 1; -+ VALUE argv2[2]; -+ argv2[0] = str; -+ if (!NIL_P(opt)) argv2[argc2++] = opt; -+ VALUE hash = date_s__httpdate(argc2, argv2, klass); - return d_new_by_frags(klass, hash, sg); - } - } - - /* - * call-seq: -- * Date._jisx0301(string) -> hash -+ * Date._jisx0301(string, limit: 128) -> hash - * - * Returns a hash of parsed elements. -+ * -+ * Raise an ArgumentError when the string length is longer than _limit_. -+ * You can stop this check by passing `limit: nil`, but note that -+ * it may take a long time to parse. - */ - static VALUE --date_s__jisx0301(VALUE klass, VALUE str) -+date_s__jisx0301(int argc, VALUE *argv, VALUE klass) - { -+ VALUE str, opt; -+ -+ rb_scan_args(argc, argv, "1:", &str, &opt); -+ check_limit(str, opt); -+ - return date__jisx0301(str); - } - - /* - * call-seq: -- * Date.jisx0301(string='-4712-01-01'[, start=Date::ITALY]) -> date -+ * Date.jisx0301(string='-4712-01-01'[, start=Date::ITALY], limit: 128) -> date - * - * Creates a new Date object by parsing from a string according to - * some typical JIS X 0301 formats. - * - * Date.jisx0301('H13.02.03') #=> # -+ * -+ * Raise an ArgumentError when the string length is longer than _limit_. -+ * You can stop this check by passing `limit: nil`, but note that -+ * it may take a long time to parse. - */ - static VALUE - date_s_jisx0301(int argc, VALUE *argv, VALUE klass) - { -- VALUE str, sg; -+ VALUE str, sg, opt; - -- rb_scan_args(argc, argv, "02", &str, &sg); -+ rb_scan_args(argc, argv, "02:", &str, &sg, &opt); -+ if (!NIL_P(opt)) argc--; - - switch (argc) { - case 0: -@@ -4633,7 +4770,11 @@ date_s_jisx0301(int argc, VALUE *argv, VALUE klass) - } - - { -- VALUE hash = date_s__jisx0301(klass, str); -+ int argc2 = 1; -+ VALUE argv2[2]; -+ argv2[0] = str; -+ if (!NIL_P(opt)) argv2[argc2++] = opt; -+ VALUE hash = date_s__jisx0301(argc2, argv2, klass); - return d_new_by_frags(klass, hash, sg); - } - } -@@ -7925,7 +8066,7 @@ datetime_s_strptime(int argc, VALUE *argv, VALUE klass) - - /* - * call-seq: -- * DateTime.parse(string='-4712-01-01T00:00:00+00:00'[, comp=true[, start=Date::ITALY]]) -> datetime -+ * DateTime.parse(string='-4712-01-01T00:00:00+00:00'[, comp=true[, start=Date::ITALY]], limit: 128) -> datetime - * - * Parses the given representation of date and time, and creates a - * DateTime object. This method does not function as a validator. -@@ -7939,13 +8080,18 @@ datetime_s_strptime(int argc, VALUE *argv, VALUE klass) - * #=> # - * DateTime.parse('3rd Feb 2001 04:05:06 PM') - * #=> # -+ * -+ * Raise an ArgumentError when the string length is longer than _limit_. -+ * You can stop this check by passing `limit: nil`, but note that -+ * it may take a long time to parse. - */ - static VALUE - datetime_s_parse(int argc, VALUE *argv, VALUE klass) - { -- VALUE str, comp, sg; -+ VALUE str, comp, sg, opt; - -- rb_scan_args(argc, argv, "03", &str, &comp, &sg); -+ rb_scan_args(argc, argv, "03:", &str, &comp, &sg, &opt); -+ if (!NIL_P(opt)) argc--; - - switch (argc) { - case 0: -@@ -7957,18 +8103,20 @@ datetime_s_parse(int argc, VALUE *argv, VALUE klass) - } - - { -- VALUE argv2[2], hash; -- -- argv2[0] = str; -- argv2[1] = comp; -- hash = date_s__parse(2, argv2, klass); -+ int argc2 = 2; -+ VALUE argv2[3]; -+ argv2[0] = str; -+ argv2[1] = comp; -+ argv2[2] = opt; -+ if (!NIL_P(opt)) argc2++; -+ VALUE hash = date_s__parse(argc2, argv2, klass); - return dt_new_by_frags(klass, hash, sg); - } - } - - /* - * call-seq: -- * DateTime.iso8601(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY]) -> datetime -+ * DateTime.iso8601(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY], limit: 128) -> datetime - * - * Creates a new DateTime object by parsing from a string according to - * some typical ISO 8601 formats. -@@ -7979,13 +8127,18 @@ datetime_s_parse(int argc, VALUE *argv, VALUE klass) - * #=> # - * DateTime.iso8601('2001-W05-6T04:05:06+07:00') - * #=> # -+ * -+ * Raise an ArgumentError when the string length is longer than _limit_. -+ * You can stop this check by passing `limit: nil`, but note that -+ * it may take a long time to parse. - */ - static VALUE - datetime_s_iso8601(int argc, VALUE *argv, VALUE klass) - { -- VALUE str, sg; -+ VALUE str, sg, opt; - -- rb_scan_args(argc, argv, "02", &str, &sg); -+ rb_scan_args(argc, argv, "02:", &str, &sg, &opt); -+ if (!NIL_P(opt)) argc--; - - switch (argc) { - case 0: -@@ -7995,27 +8148,37 @@ datetime_s_iso8601(int argc, VALUE *argv, VALUE klass) - } - - { -- VALUE hash = date_s__iso8601(klass, str); -+ int argc2 = 1; -+ VALUE argv2[2]; -+ argv2[0] = str; -+ argv2[1] = opt; -+ if (!NIL_P(opt)) argc2--; -+ VALUE hash = date_s__iso8601(argc2, argv2, klass); - return dt_new_by_frags(klass, hash, sg); - } - } - - /* - * call-seq: -- * DateTime.rfc3339(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY]) -> datetime -+ * DateTime.rfc3339(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY], limit: 128) -> datetime - * - * Creates a new DateTime object by parsing from a string according to - * some typical RFC 3339 formats. - * - * DateTime.rfc3339('2001-02-03T04:05:06+07:00') - * #=> # -+ * -+ * Raise an ArgumentError when the string length is longer than _limit_. -+ * You can stop this check by passing `limit: nil`, but note that -+ * it may take a long time to parse. - */ - static VALUE - datetime_s_rfc3339(int argc, VALUE *argv, VALUE klass) - { -- VALUE str, sg; -+ VALUE str, sg, opt; - -- rb_scan_args(argc, argv, "02", &str, &sg); -+ rb_scan_args(argc, argv, "02:", &str, &sg, &opt); -+ if (!NIL_P(opt)) argc--; - - switch (argc) { - case 0: -@@ -8025,27 +8188,37 @@ datetime_s_rfc3339(int argc, VALUE *argv, VALUE klass) - } - - { -- VALUE hash = date_s__rfc3339(klass, str); -+ int argc2 = 1; -+ VALUE argv2[2]; -+ argv2[0] = str; -+ argv2[1] = opt; -+ if (!NIL_P(opt)) argc2++; -+ VALUE hash = date_s__rfc3339(argc2, argv2, klass); - return dt_new_by_frags(klass, hash, sg); - } - } - - /* - * call-seq: -- * DateTime.xmlschema(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY]) -> datetime -+ * DateTime.xmlschema(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY], limit: 128) -> datetime - * - * Creates a new DateTime object by parsing from a string according to - * some typical XML Schema formats. - * - * DateTime.xmlschema('2001-02-03T04:05:06+07:00') - * #=> # -+ * -+ * Raise an ArgumentError when the string length is longer than _limit_. -+ * You can stop this check by passing `limit: nil`, but note that -+ * it may take a long time to parse. - */ - static VALUE - datetime_s_xmlschema(int argc, VALUE *argv, VALUE klass) - { -- VALUE str, sg; -+ VALUE str, sg, opt; - -- rb_scan_args(argc, argv, "02", &str, &sg); -+ rb_scan_args(argc, argv, "02:", &str, &sg, &opt); -+ if (!NIL_P(opt)) argc--; - - switch (argc) { - case 0: -@@ -8055,28 +8228,38 @@ datetime_s_xmlschema(int argc, VALUE *argv, VALUE klass) - } - - { -- VALUE hash = date_s__xmlschema(klass, str); -+ int argc2 = 1; -+ VALUE argv2[2]; -+ argv2[0] = str; -+ argv2[1] = opt; -+ if (!NIL_P(opt)) argc2++; -+ VALUE hash = date_s__xmlschema(argc2, argv2, klass); - return dt_new_by_frags(klass, hash, sg); - } - } - - /* - * call-seq: -- * DateTime.rfc2822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY]) -> datetime -- * DateTime.rfc822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY]) -> datetime -+ * DateTime.rfc2822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY], limit: 128) -> datetime -+ * DateTime.rfc822(string='Mon, 1 Jan -4712 00:00:00 +0000'[, start=Date::ITALY], limit: 128) -> datetime - * - * Creates a new DateTime object by parsing from a string according to - * some typical RFC 2822 formats. - * - * DateTime.rfc2822('Sat, 3 Feb 2001 04:05:06 +0700') - * #=> # -+ * -+ * Raise an ArgumentError when the string length is longer than _limit_. -+ * You can stop this check by passing `limit: nil`, but note that -+ * it may take a long time to parse. - */ - static VALUE - datetime_s_rfc2822(int argc, VALUE *argv, VALUE klass) - { -- VALUE str, sg; -+ VALUE str, sg, opt; - -- rb_scan_args(argc, argv, "02", &str, &sg); -+ rb_scan_args(argc, argv, "02:", &str, &sg, &opt); -+ if (!NIL_P(opt)) argc--; - - switch (argc) { - case 0: -@@ -8086,7 +8269,12 @@ datetime_s_rfc2822(int argc, VALUE *argv, VALUE klass) - } - - { -- VALUE hash = date_s__rfc2822(klass, str); -+ int argc2 = 1; -+ VALUE argv2[2]; -+ argv2[0] = str; -+ argv2[1] = opt; -+ if (!NIL_P(opt)) argc2++; -+ VALUE hash = date_s__rfc2822(argc2, argv2, klass); - return dt_new_by_frags(klass, hash, sg); - } - } -@@ -8100,13 +8288,18 @@ datetime_s_rfc2822(int argc, VALUE *argv, VALUE klass) - * - * DateTime.httpdate('Sat, 03 Feb 2001 04:05:06 GMT') - * #=> # -+ * -+ * Raise an ArgumentError when the string length is longer than _limit_. -+ * You can stop this check by passing `limit: nil`, but note that -+ * it may take a long time to parse. - */ - static VALUE - datetime_s_httpdate(int argc, VALUE *argv, VALUE klass) - { -- VALUE str, sg; -+ VALUE str, sg, opt; - -- rb_scan_args(argc, argv, "02", &str, &sg); -+ rb_scan_args(argc, argv, "02:", &str, &sg, &opt); -+ if (!NIL_P(opt)) argc--; - - switch (argc) { - case 0: -@@ -8116,27 +8309,37 @@ datetime_s_httpdate(int argc, VALUE *argv, VALUE klass) - } - - { -- VALUE hash = date_s__httpdate(klass, str); -+ int argc2 = 1; -+ VALUE argv2[2]; -+ argv2[0] = str; -+ argv2[1] = opt; -+ if (!NIL_P(opt)) argc2++; -+ VALUE hash = date_s__httpdate(argc2, argv2, klass); - return dt_new_by_frags(klass, hash, sg); - } - } - - /* - * call-seq: -- * DateTime.jisx0301(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY]) -> datetime -+ * DateTime.jisx0301(string='-4712-01-01T00:00:00+00:00'[, start=Date::ITALY], limit: 128) -> datetime - * - * Creates a new DateTime object by parsing from a string according to - * some typical JIS X 0301 formats. - * - * DateTime.jisx0301('H13.02.03T04:05:06+07:00') - * #=> # -+ * -+ * Raise an ArgumentError when the string length is longer than _limit_. -+ * You can stop this check by passing `limit: nil`, but note that -+ * it may take a long time to parse. - */ - static VALUE - datetime_s_jisx0301(int argc, VALUE *argv, VALUE klass) - { -- VALUE str, sg; -+ VALUE str, sg, opt; - -- rb_scan_args(argc, argv, "02", &str, &sg); -+ rb_scan_args(argc, argv, "02:", &str, &sg, &opt); -+ if (!NIL_P(opt)) argc--; - - switch (argc) { - case 0: -@@ -8146,7 +8349,12 @@ datetime_s_jisx0301(int argc, VALUE *argv, VALUE klass) - } - - { -- VALUE hash = date_s__jisx0301(klass, str); -+ int argc2 = 1; -+ VALUE argv2[2]; -+ argv2[0] = str; -+ argv2[1] = opt; -+ if (!NIL_P(opt)) argc2++; -+ VALUE hash = date_s__jisx0301(argc2, argv2, klass); - return dt_new_by_frags(klass, hash, sg); - } - } -@@ -9297,19 +9505,19 @@ Init_date_core(void) - rb_define_singleton_method(cDate, "strptime", date_s_strptime, -1); - rb_define_singleton_method(cDate, "_parse", date_s__parse, -1); - rb_define_singleton_method(cDate, "parse", date_s_parse, -1); -- rb_define_singleton_method(cDate, "_iso8601", date_s__iso8601, 1); -+ rb_define_singleton_method(cDate, "_iso8601", date_s__iso8601, -1); - rb_define_singleton_method(cDate, "iso8601", date_s_iso8601, -1); -- rb_define_singleton_method(cDate, "_rfc3339", date_s__rfc3339, 1); -+ rb_define_singleton_method(cDate, "_rfc3339", date_s__rfc3339, -1); - rb_define_singleton_method(cDate, "rfc3339", date_s_rfc3339, -1); -- rb_define_singleton_method(cDate, "_xmlschema", date_s__xmlschema, 1); -+ rb_define_singleton_method(cDate, "_xmlschema", date_s__xmlschema, -1); - rb_define_singleton_method(cDate, "xmlschema", date_s_xmlschema, -1); -- rb_define_singleton_method(cDate, "_rfc2822", date_s__rfc2822, 1); -- rb_define_singleton_method(cDate, "_rfc822", date_s__rfc2822, 1); -+ rb_define_singleton_method(cDate, "_rfc2822", date_s__rfc2822, -1); -+ rb_define_singleton_method(cDate, "_rfc822", date_s__rfc2822, -1); - rb_define_singleton_method(cDate, "rfc2822", date_s_rfc2822, -1); - rb_define_singleton_method(cDate, "rfc822", date_s_rfc2822, -1); -- rb_define_singleton_method(cDate, "_httpdate", date_s__httpdate, 1); -+ rb_define_singleton_method(cDate, "_httpdate", date_s__httpdate, -1); - rb_define_singleton_method(cDate, "httpdate", date_s_httpdate, -1); -- rb_define_singleton_method(cDate, "_jisx0301", date_s__jisx0301, 1); -+ rb_define_singleton_method(cDate, "_jisx0301", date_s__jisx0301, -1); - rb_define_singleton_method(cDate, "jisx0301", date_s_jisx0301, -1); - - #ifndef NDEBUG -diff --git a/test/date/test_date_parse.rb b/test/date/test_date_parse.rb -index ac0eb85ca7..f9b160ee8c 100644 ---- a/test/date/test_date_parse.rb -+++ b/test/date/test_date_parse.rb -@@ -1,6 +1,7 @@ - # frozen_string_literal: true - require 'test/unit' - require 'date' -+require 'timeout' - - class TestDateParse < Test::Unit::TestCase - -@@ -1122,4 +1123,32 @@ def test_given_string - assert_equal(s0, s) - end - -+ def test_length_limit -+ assert_raise(ArgumentError) { Date._parse("1" * 1000) } -+ assert_raise(ArgumentError) { Date._iso8601("1" * 1000) } -+ assert_raise(ArgumentError) { Date._rfc3339("1" * 1000) } -+ assert_raise(ArgumentError) { Date._xmlschema("1" * 1000) } -+ assert_raise(ArgumentError) { Date._rfc2822("1" * 1000) } -+ assert_raise(ArgumentError) { Date._rfc822("1" * 1000) } -+ assert_raise(ArgumentError) { Date._jisx0301("1" * 1000) } -+ -+ assert_raise(ArgumentError) { Date.parse("1" * 1000) } -+ assert_raise(ArgumentError) { Date.iso8601("1" * 1000) } -+ assert_raise(ArgumentError) { Date.rfc3339("1" * 1000) } -+ assert_raise(ArgumentError) { Date.xmlschema("1" * 1000) } -+ assert_raise(ArgumentError) { Date.rfc2822("1" * 1000) } -+ assert_raise(ArgumentError) { Date.rfc822("1" * 1000) } -+ assert_raise(ArgumentError) { Date.jisx0301("1" * 1000) } -+ -+ assert_raise(ArgumentError) { DateTime.parse("1" * 1000) } -+ assert_raise(ArgumentError) { DateTime.iso8601("1" * 1000) } -+ assert_raise(ArgumentError) { DateTime.rfc3339("1" * 1000) } -+ assert_raise(ArgumentError) { DateTime.xmlschema("1" * 1000) } -+ assert_raise(ArgumentError) { DateTime.rfc2822("1" * 1000) } -+ assert_raise(ArgumentError) { DateTime.rfc822("1" * 1000) } -+ assert_raise(ArgumentError) { DateTime.jisx0301("1" * 1000) } -+ -+ assert_raise(ArgumentError) { Date._parse("Jan " + "9" * 1000000) } -+ assert_raise(Timeout::Error) { Timeout.timeout(1) { Date._parse("Jan " + "9" * 1000000, limit: nil) } } -+ end - end --- -2.36.1 - diff --git a/SOURCES/ruby-2.7.0-Initialize-ABRT-hook.patch b/SOURCES/ruby-2.7.0-Initialize-ABRT-hook.patch new file mode 100644 index 0000000..0f32243 --- /dev/null +++ b/SOURCES/ruby-2.7.0-Initialize-ABRT-hook.patch @@ -0,0 +1,88 @@ +From eca084e4079c77c061045df9c21b219175b05228 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?V=C3=ADt=20Ondruch?= +Date: Mon, 6 Jan 2020 13:56:04 +0100 +Subject: [PATCH] Initialize ABRT hook. + +The ABRT hook used to be initialized by preludes via patches [[1], [2]]. +Unfortunately, due to [[3]] and especially since [[4]], this would +require boostrapping [[5]]. + +To keep the things simple for now, load the ABRT hook via C. + +[1]: https://bugs.ruby-lang.org/issues/8566 +[2]: https://bugs.ruby-lang.org/issues/15306 +[3]: https://bugs.ruby-lang.org/issues/16254 +[4]: https://github.com/ruby/ruby/pull/2735 +[5]: https://lists.fedoraproject.org/archives/list/ruby-sig@lists.fedoraproject.org/message/LH6L6YJOYQT4Y5ZNOO4SLIPTUWZ5V45Q/ +--- + abrt.c | 12 ++++++++++++ + common.mk | 3 ++- + ruby.c | 4 ++++ + spec/ruby/core/kernel/require_spec.rb | 2 ++ + 4 files changed, 20 insertions(+), 1 deletion(-) + create mode 100644 abrt.c + +diff --git a/abrt.c b/abrt.c +new file mode 100644 +index 0000000000..74b0bd5c0f +--- /dev/null ++++ b/abrt.c +@@ -0,0 +1,12 @@ ++#include "internal.h" ++ ++void ++Init_abrt(void) ++{ ++ rb_eval_string( ++ " begin\n" ++ " require 'abrt'\n" ++ " rescue LoadError\n" ++ " end\n" ++ ); ++} +diff --git a/common.mk b/common.mk +index b2e5b2b6d0..f39f81da5c 100644 +--- a/common.mk ++++ b/common.mk +@@ -111,7 +111,8 @@ PRISM_FILES = prism/api_node.$(OBJEXT) \ + prism/prism.$(OBJEXT) \ + prism_init.$(OBJEXT) + +-COMMONOBJS = array.$(OBJEXT) \ ++COMMONOBJS = abrt.$(OBJEXT) \ ++ array.$(OBJEXT) \ + ast.$(OBJEXT) \ + bignum.$(OBJEXT) \ + class.$(OBJEXT) \ +diff --git a/ruby.c b/ruby.c +index 60c57d6259..1eec16f2c8 100644 +--- a/ruby.c ++++ b/ruby.c +@@ -1724,10 +1724,14 @@ proc_options(long argc, char **argv, ruby_cmdline_options_t *opt, int envopt) + + void Init_builtin_features(void); + ++/* abrt.c */ ++void Init_abrt(void); ++ + static void + ruby_init_prelude(void) + { + Init_builtin_features(); ++ Init_abrt(); + 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 +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') } diff --git a/SOURCES/ruby-2.7.7-Fix-CVE-2021-33621-HTTP-response-splitting-in-CGI.patch b/SOURCES/ruby-2.7.7-Fix-CVE-2021-33621-HTTP-response-splitting-in-CGI.patch deleted file mode 100644 index b30dc6a..0000000 --- a/SOURCES/ruby-2.7.7-Fix-CVE-2021-33621-HTTP-response-splitting-in-CGI.patch +++ /dev/null @@ -1,328 +0,0 @@ -From 8fc4b4792919c627183f4ddb6dc256aae49eb738 Mon Sep 17 00:00:00 2001 -From: Hiroshi SHIBATA -Date: Tue, 22 Nov 2022 13:48:18 +0900 -Subject: [PATCH] Fix CVE-2021-33621 HTTP response splitting in CGI. - -Backported from upstream Ruby, commit: -https://github.com/ruby/ruby/commit/7cf697179dab52b0d024543304f4d3ab5fa5e847 - -Test "CGICookieTest#test_cgi_cookie_new_with_domain" was adjusted to -deal with Ruby 2.5 not allowing String with double splat operator. - -==== Original commit message -Merge CGI-0.1.0.2 ---- - lib/cgi/cookie.rb | 51 ++++++++++++++++------- - lib/cgi/core.rb | 45 ++++++++++++-------- - test/cgi/test_cgi_cookie.rb | 82 +++++++++++++++++++++++++++++++++++++ - test/cgi/test_cgi_header.rb | 8 ++++ - 4 files changed, 154 insertions(+), 32 deletions(-) - -diff --git a/lib/cgi/cookie.rb b/lib/cgi/cookie.rb -index 009566b..f26f015 100644 ---- a/lib/cgi/cookie.rb -+++ b/lib/cgi/cookie.rb -@@ -40,6 +40,10 @@ class CGI - class Cookie < Array - @@accept_charset="UTF-8" unless defined?(@@accept_charset) - -+ TOKEN_RE = %r"\A[[!-~]&&[^()<>@,;:\\\"/?=\[\]{}]]+\z" -+ PATH_VALUE_RE = %r"\A[[ -~]&&[^;]]*\z" -+ DOMAIN_VALUE_RE = %r"\A(?