Compare commits
No commits in common. "c8s-stream-2.6" and "c8-stream-2.5" have entirely different histories.
c8s-stream
...
c8-stream-
|
@ -1 +1 @@
|
||||||
SOURCES/ruby-2.6.10.tar.xz
|
SOURCES/ruby-2.5.9.tar.xz
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
e91de95735d0af32238903c7c58d2b660433e0cc SOURCES/ruby-2.6.10.tar.xz
|
7be8dc2e6e534eb36bfdf9f017af512996ec99a6 SOURCES/ruby-2.5.9.tar.xz
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
%gem_install(d:n:) \
|
%gem_install(d:n:) \
|
||||||
mkdir -p %{-d*}%{!?-d:.%{gem_dir}} \
|
mkdir -p %{-d*}%{!?-d:.%{gem_dir}} \
|
||||||
\
|
\
|
||||||
CONFIGURE_ARGS="--with-cflags='%{optflags}' --with-cxxflags='%{optflags}' $CONFIGURE_ARGS" \\\
|
CONFIGURE_ARGS="--with-cflags='%{optflags}' $CONFIGURE_ARGS" \\\
|
||||||
gem install \\\
|
gem install \\\
|
||||||
-V \\\
|
-V \\\
|
||||||
--local \\\
|
--local \\\
|
||||||
|
|
|
@ -11,7 +11,7 @@ diff --git a/lib/mkmf.rb b/lib/mkmf.rb
|
||||||
index 682eb46..e6b1445 100644
|
index 682eb46..e6b1445 100644
|
||||||
--- a/lib/mkmf.rb
|
--- a/lib/mkmf.rb
|
||||||
+++ b/lib/mkmf.rb
|
+++ b/lib/mkmf.rb
|
||||||
@@ -1911,7 +1911,7 @@ def configuration(srcdir)
|
@@ -1900,7 +1900,7 @@ def configuration(srcdir)
|
||||||
SHELL = /bin/sh
|
SHELL = /bin/sh
|
||||||
|
|
||||||
# V=0 quiet, V=1 verbose. other values don't work.
|
# V=0 quiet, V=1 verbose. other values don't work.
|
||||||
|
|
|
@ -13,9 +13,9 @@ diff --git a/Makefile.in b/Makefile.in
|
||||||
index 7e8ed82..7916993 100644
|
index 7e8ed82..7916993 100644
|
||||||
--- a/Makefile.in
|
--- a/Makefile.in
|
||||||
+++ b/Makefile.in
|
+++ b/Makefile.in
|
||||||
@@ -154,6 +154,8 @@ BOOTSTRAPRUBY = @BOOTSTRAPRUBY@
|
@@ -119,6 +119,8 @@ XRUBY_RUBYLIBDIR = @XRUBY_RUBYLIBDIR@
|
||||||
COROUTINE_H = @X_FIBER_COROUTINE_H@
|
XRUBY_RUBYHDRDIR = @XRUBY_RUBYHDRDIR@
|
||||||
COROUTINE_OBJ = $(COROUTINE_H:.h=.@OBJEXT@)
|
BOOTSTRAPRUBY = @BOOTSTRAPRUBY@
|
||||||
|
|
||||||
+OPTIONAL_PRELUDES = @OPTIONAL_PRELUDES@
|
+OPTIONAL_PRELUDES = @OPTIONAL_PRELUDES@
|
||||||
+
|
+
|
||||||
|
@ -26,7 +26,7 @@ diff --git a/common.mk b/common.mk
|
||||||
index 5cfbc3d..3f0a82e 100644
|
index 5cfbc3d..3f0a82e 100644
|
||||||
--- a/common.mk
|
--- a/common.mk
|
||||||
+++ b/common.mk
|
+++ b/common.mk
|
||||||
@@ -156,7 +156,7 @@ ALLOBJS = $(NORMALMAINOBJ) $(MINIOBJS) $(COMMONOBJS) $(INITOBJS)
|
@@ -147,7 +147,7 @@ ALLOBJS = $(NORMALMAINOBJ) $(MINIOBJS) $(COMMONOBJS) $(INITOBJS)
|
||||||
GOLFOBJS = goruby.$(OBJEXT) golf_prelude.$(OBJEXT)
|
GOLFOBJS = goruby.$(OBJEXT) golf_prelude.$(OBJEXT)
|
||||||
|
|
||||||
DEFAULT_PRELUDES = $(GEM_PRELUDE)
|
DEFAULT_PRELUDES = $(GEM_PRELUDE)
|
||||||
|
@ -39,7 +39,7 @@ diff --git a/configure.ac b/configure.ac
|
||||||
index 028ef7ca3e..cdeff87871 100644
|
index 028ef7ca3e..cdeff87871 100644
|
||||||
--- a/configure.ac
|
--- a/configure.ac
|
||||||
+++ b/configure.ac
|
+++ b/configure.ac
|
||||||
@@ -3872,6 +3872,13 @@ AC_SUBST(rubyarchhdrdir)dnl
|
@@ -4397,6 +4397,13 @@ AC_SUBST(rubyarchhdrdir)dnl
|
||||||
AC_SUBST(sitearchhdrdir)dnl
|
AC_SUBST(sitearchhdrdir)dnl
|
||||||
AC_SUBST(vendorarchhdrdir)dnl
|
AC_SUBST(vendorarchhdrdir)dnl
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ diff --git a/configure.ac b/configure.ac
|
||||||
index 11fc237552..b77e88fc37 100644
|
index 11fc237552..b77e88fc37 100644
|
||||||
--- a/configure.ac
|
--- a/configure.ac
|
||||||
+++ b/configure.ac
|
+++ b/configure.ac
|
||||||
@@ -3102,6 +3102,11 @@ AS_IF([test ${multiarch+set}], [
|
@@ -3642,6 +3642,11 @@ AS_IF([test ${multiarch+set}], [
|
||||||
])
|
])
|
||||||
|
|
||||||
archlibdir='${libdir}/${arch}'
|
archlibdir='${libdir}/${arch}'
|
||||||
|
|
|
@ -14,7 +14,7 @@ diff --git a/configure.ac b/configure.ac
|
||||||
index 999e2d6d5d..11fc237552 100644
|
index 999e2d6d5d..11fc237552 100644
|
||||||
--- a/configure.ac
|
--- a/configure.ac
|
||||||
+++ b/configure.ac
|
+++ b/configure.ac
|
||||||
@@ -3727,7 +3727,8 @@ AS_CASE(["$ruby_version_dir_name"],
|
@@ -4252,7 +4252,8 @@ AS_CASE(["$ruby_version_dir_name"],
|
||||||
ruby_version_dir=/'${ruby_version_dir_name}'
|
ruby_version_dir=/'${ruby_version_dir_name}'
|
||||||
|
|
||||||
if test -z "${ruby_version_dir_name}"; then
|
if test -z "${ruby_version_dir_name}"; then
|
||||||
|
@ -66,7 +66,7 @@ diff --git a/tool/mkconfig.rb b/tool/mkconfig.rb
|
||||||
index 07076d4..35e6c3c 100755
|
index 07076d4..35e6c3c 100755
|
||||||
--- a/tool/mkconfig.rb
|
--- a/tool/mkconfig.rb
|
||||||
+++ b/tool/mkconfig.rb
|
+++ b/tool/mkconfig.rb
|
||||||
@@ -114,7 +114,7 @@
|
@@ -111,7 +111,7 @@
|
||||||
val = val.gsub(/\$(?:\$|\{?(\w+)\}?)/) {$1 ? "$(#{$1})" : $&}.dump
|
val = val.gsub(/\$(?:\$|\{?(\w+)\}?)/) {$1 ? "$(#{$1})" : $&}.dump
|
||||||
case name
|
case name
|
||||||
when /^prefix$/
|
when /^prefix$/
|
||||||
|
|
|
@ -11,7 +11,7 @@ diff --git a/configure.ac b/configure.ac
|
||||||
index b77e88fc37..6bba453e3c 100644
|
index b77e88fc37..6bba453e3c 100644
|
||||||
--- a/configure.ac
|
--- a/configure.ac
|
||||||
+++ b/configure.ac
|
+++ b/configure.ac
|
||||||
@@ -3791,6 +3791,8 @@ AC_SUBST(vendorarchdir)dnl
|
@@ -4316,6 +4316,8 @@ AC_SUBST(vendorarchdir)dnl
|
||||||
AC_SUBST(CONFIGURE, "`echo $0 | sed 's|.*/||'`")dnl
|
AC_SUBST(CONFIGURE, "`echo $0 | sed 's|.*/||'`")dnl
|
||||||
AC_SUBST(configure_args, "`echo "${ac_configure_args}" | sed 's/\\$/$$/g'`")dnl
|
AC_SUBST(configure_args, "`echo "${ac_configure_args}" | sed 's/\\$/$$/g'`")dnl
|
||||||
|
|
||||||
|
|
|
@ -8,14 +8,14 @@ Subject: [PATCH] Allow to install RubyGems into custom location, outside of
|
||||||
configure.ac | 5 +++++
|
configure.ac | 5 +++++
|
||||||
loadpath.c | 4 ++++
|
loadpath.c | 4 ++++
|
||||||
template/verconf.h.tmpl | 3 +++
|
template/verconf.h.tmpl | 3 +++
|
||||||
tool/rbinstall.rb | 10 ++++++++++
|
tool/rbinstall.rb | 7 +++++++
|
||||||
4 files changed, 22 insertions(+)
|
4 files changed, 19 insertions(+)
|
||||||
|
|
||||||
diff --git a/configure.ac b/configure.ac
|
diff --git a/configure.ac b/configure.ac
|
||||||
index 6bba453e3c..028ef7ca3e 100644
|
index 6bba453e3c..028ef7ca3e 100644
|
||||||
--- a/configure.ac
|
--- a/configure.ac
|
||||||
+++ b/configure.ac
|
+++ b/configure.ac
|
||||||
@@ -3763,6 +3763,10 @@ AC_ARG_WITH(vendorarchdir,
|
@@ -4288,6 +4288,10 @@ AC_ARG_WITH(vendorarchdir,
|
||||||
[vendorarchdir=$withval],
|
[vendorarchdir=$withval],
|
||||||
[vendorarchdir=${multiarch+'${rubysitearchprefix}/vendor_ruby'${ruby_version_dir}}${multiarch-'${vendorlibdir}/${sitearch}'}])
|
[vendorarchdir=${multiarch+'${rubysitearchprefix}/vendor_ruby'${ruby_version_dir}}${multiarch-'${vendorlibdir}/${sitearch}'}])
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ index 6bba453e3c..028ef7ca3e 100644
|
||||||
AS_IF([test "${LOAD_RELATIVE+set}"], [
|
AS_IF([test "${LOAD_RELATIVE+set}"], [
|
||||||
AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
|
AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
|
||||||
RUBY_EXEC_PREFIX=''
|
RUBY_EXEC_PREFIX=''
|
||||||
@@ -3787,6 +3787,7 @@ AC_SUBST(sitearchdir)dnl
|
@@ -4312,6 +4316,7 @@ AC_SUBST(sitearchdir)dnl
|
||||||
AC_SUBST(vendordir)dnl
|
AC_SUBST(vendordir)dnl
|
||||||
AC_SUBST(vendorlibdir)dnl
|
AC_SUBST(vendorlibdir)dnl
|
||||||
AC_SUBST(vendorarchdir)dnl
|
AC_SUBST(vendorarchdir)dnl
|
||||||
|
@ -64,30 +64,27 @@ index 79c003e..34f2382 100644
|
||||||
% R = {}
|
% R = {}
|
||||||
% R["ruby_version"] = '"RUBY_LIB_VERSION"'
|
% R["ruby_version"] = '"RUBY_LIB_VERSION"'
|
||||||
diff --git a/tool/rbinstall.rb b/tool/rbinstall.rb
|
diff --git a/tool/rbinstall.rb b/tool/rbinstall.rb
|
||||||
index d8987af..1efbd33 100755
|
index b47b6e1..0b99408 100755
|
||||||
--- a/tool/rbinstall.rb
|
--- a/tool/rbinstall.rb
|
||||||
+++ b/tool/rbinstall.rb
|
+++ b/tool/rbinstall.rb
|
||||||
@@ -338,6 +338,7 @@ if CONFIG["vendordir"]
|
@@ -335,6 +335,7 @@ def CONFIG.[](name, mandatory = false)
|
||||||
vendorlibdir = CONFIG["vendorlibdir"]
|
vendorlibdir = CONFIG["vendorlibdir"]
|
||||||
vendorarchlibdir = CONFIG["vendorarchdir"]
|
vendorarchlibdir = CONFIG["vendorarchdir"]
|
||||||
end
|
end
|
||||||
+rubygemsdir = CONFIG["rubygemsdir"]
|
+rubygemsdir = CONFIG["rubygemsdir"]
|
||||||
mandir = CONFIG["mandir", true]
|
mandir = CONFIG["mandir", true]
|
||||||
docdir = CONFIG["docdir", true]
|
docdir = CONFIG["docdir", true]
|
||||||
enable_shared = CONFIG["ENABLE_SHARED"] == 'yes'
|
configure_args = Shellwords.shellwords(CONFIG["configure_args"])
|
||||||
@@ -564,7 +565,16 @@ end
|
@@ -541,7 +542,13 @@ def install(src, cmd)
|
||||||
install?(:local, :comm, :lib) do
|
install?(:local, :comm, :lib) do
|
||||||
prepare "library scripts", rubylibdir
|
prepare "library scripts", rubylibdir
|
||||||
noinst = %w[*.txt *.rdoc *.gemspec]
|
noinst = %w[*.txt *.rdoc *.gemspec]
|
||||||
+ # Bundler carries "rubygems.rb" file, so it must be specialcased :/
|
+ noinst += %w[rubygems.rb rubygems/ datadir.rb] if rubygemsdir
|
||||||
+ noinst += %w[rubygems.rb rubygems/ bundler.rb bundler/] if rubygemsdir
|
|
||||||
install_recursive(File.join(srcdir, "lib"), rubylibdir, :no_install => noinst, :mode => $data_mode)
|
install_recursive(File.join(srcdir, "lib"), rubylibdir, :no_install => noinst, :mode => $data_mode)
|
||||||
+ if rubygemsdir
|
+ if rubygemsdir
|
||||||
+ noinst = %w[*.txt *.rdoc *.gemspec]
|
+ noinst = %w[obsolete.rb]
|
||||||
+ install_recursive(File.join(srcdir, "lib", "rubygems"), File.join(rubygemsdir, "rubygems"), :no_install => noinst, :mode => $data_mode)
|
+ install_recursive(File.join(srcdir, "lib", "rubygems"), File.join(rubygemsdir, "rubygems"), :mode => $data_mode)
|
||||||
+ install(File.join(srcdir, "lib", "rubygems.rb"), File.join(rubygemsdir, "rubygems.rb"), :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
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ diff --git a/common.mk b/common.mk
|
||||||
index 168dc52..20c218a 100644
|
index 168dc52..20c218a 100644
|
||||||
--- a/common.mk
|
--- a/common.mk
|
||||||
+++ b/common.mk
|
+++ b/common.mk
|
||||||
@@ -1053,9 +1053,9 @@ $(MINIPRELUDE_C): $(COMPILE_PRELUDE)
|
@@ -962,9 +962,9 @@ $(MINIPRELUDE_C): $(COMPILE_PRELUDE)
|
||||||
$(srcdir)/template/prelude.c.tmpl
|
$(srcdir)/template/prelude.c.tmpl
|
||||||
|
|
||||||
$(PRELUDE_C): $(COMPILE_PRELUDE) \
|
$(PRELUDE_C): $(COMPILE_PRELUDE) \
|
||||||
|
@ -22,7 +22,7 @@ index 168dc52..20c218a 100644
|
||||||
+ $(Q) $(MINIRUBY) $(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)
|
$(srcdir)/template/prelude.c.tmpl $(PRELUDE_SCRIPTS)
|
||||||
|
|
||||||
$(GOLF_PRELUDE_C): $(COMPILE_PRELUDE) {$(srcdir)}golf_prelude.rb
|
{$(VPATH)}golf_prelude.c: $(COMPILE_PRELUDE) {$(srcdir)}golf_prelude.rb
|
||||||
--
|
--
|
||||||
2.6.3
|
2.6.3
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ ruby_version_dir_name now specifies custom version string for versioned
|
||||||
directories, e.g. instead of default X.Y.Z, you can specify whatever
|
directories, e.g. instead of default X.Y.Z, you can specify whatever
|
||||||
string.
|
string.
|
||||||
---
|
---
|
||||||
configure.ac | 64 ++++++++++++++++++++++++---------------------
|
configure.ac | 64 ++++++++++++++++++++++++++++-------------------------
|
||||||
template/ruby.pc.in | 1 +
|
template/ruby.pc.in | 1 +
|
||||||
2 files changed, 35 insertions(+), 30 deletions(-)
|
2 files changed, 35 insertions(+), 30 deletions(-)
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ diff --git a/configure.ac b/configure.ac
|
||||||
index 8ea969412f..a00f2b6776 100644
|
index 8ea969412f..a00f2b6776 100644
|
||||||
--- a/configure.ac
|
--- a/configure.ac
|
||||||
+++ b/configure.ac
|
+++ b/configure.ac
|
||||||
@@ -3678,9 +3678,6 @@ AS_CASE(["$target_os"],
|
@@ -4203,9 +4203,6 @@ AS_CASE(["$target_os"],
|
||||||
rubyw_install_name='$(RUBYW_INSTALL_NAME)'
|
rubyw_install_name='$(RUBYW_INSTALL_NAME)'
|
||||||
])
|
])
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@ index 8ea969412f..a00f2b6776 100644
|
||||||
rubyarchprefix=${multiarch+'${archlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${arch}'}
|
rubyarchprefix=${multiarch+'${archlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${arch}'}
|
||||||
AC_ARG_WITH(rubyarchprefix,
|
AC_ARG_WITH(rubyarchprefix,
|
||||||
AS_HELP_STRING([--with-rubyarchprefix=DIR],
|
AS_HELP_STRING([--with-rubyarchprefix=DIR],
|
||||||
@@ -3703,56 +3703,62 @@ AC_ARG_WITH(ridir,
|
@@ -4228,56 +4225,62 @@ AC_ARG_WITH(ridir,
|
||||||
AC_SUBST(ridir)
|
AC_SUBST(ridir)
|
||||||
AC_SUBST(RI_BASE_NAME)
|
AC_SUBST(RI_BASE_NAME)
|
||||||
|
|
||||||
|
@ -120,7 +120,7 @@ index 8ea969412f..a00f2b6776 100644
|
||||||
|
|
||||||
AS_IF([test "${LOAD_RELATIVE+set}"], [
|
AS_IF([test "${LOAD_RELATIVE+set}"], [
|
||||||
AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
|
AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
|
||||||
@@ -3769,6 +3769,7 @@ AC_SUBST(sitearchincludedir)dnl
|
@@ -4294,6 +4297,7 @@ AC_SUBST(sitearchincludedir)dnl
|
||||||
AC_SUBST(arch)dnl
|
AC_SUBST(arch)dnl
|
||||||
AC_SUBST(sitearch)dnl
|
AC_SUBST(sitearch)dnl
|
||||||
AC_SUBST(ruby_version)dnl
|
AC_SUBST(ruby_version)dnl
|
||||||
|
@ -171,14 +171,14 @@ diff --git a/tool/rbinstall.rb b/tool/rbinstall.rb
|
||||||
index d4c110e..d39c9a6 100755
|
index d4c110e..d39c9a6 100755
|
||||||
--- a/tool/rbinstall.rb
|
--- a/tool/rbinstall.rb
|
||||||
+++ b/tool/rbinstall.rb
|
+++ b/tool/rbinstall.rb
|
||||||
@@ -428,7 +428,7 @@ def CONFIG.[](name, mandatory = false)
|
@@ -421,7 +421,7 @@ def CONFIG.[](name, mandatory = false)
|
||||||
|
|
||||||
install?(:doc, :rdoc) do
|
install?(:doc, :rdoc) do
|
||||||
if $rdocdir
|
if $rdocdir
|
||||||
- ridatadir = File.join(CONFIG['ridir'], CONFIG['ruby_version'], "system")
|
- ridatadir = File.join(CONFIG['ridir'], CONFIG['ruby_version'], "system")
|
||||||
+ ridatadir = File.join(CONFIG['ridir'], CONFIG['ruby_version_dir_name'] || CONFIG['ruby_version'], "system")
|
+ ridatadir = File.join(CONFIG['ridir'], CONFIG['ruby_version_dir_name'] || CONFIG['ruby_version'], "system")
|
||||||
prepare "rdoc", ridatadir
|
prepare "rdoc", ridatadir
|
||||||
install_recursive($rdocdir, ridatadir, :no_install => rdoc_noinst, :mode => $data_mode)
|
install_recursive($rdocdir, ridatadir, :mode => $data_mode)
|
||||||
end
|
end
|
||||||
--
|
--
|
||||||
2.1.0
|
2.1.0
|
||||||
|
@ -205,7 +205,7 @@ index 55ca080..75eea2b 100644
|
||||||
- RbConfig::CONFIG['ruby_version']
|
- RbConfig::CONFIG['ruby_version']
|
||||||
+ RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']
|
+ RbConfig::CONFIG['ruby_version_dir_name'] || RbConfig::CONFIG['ruby_version']
|
||||||
]
|
]
|
||||||
elsif RbConfig::CONFIG['rubylibprefix']
|
elsif RbConfig::CONFIG['rubylibprefix'] then
|
||||||
[
|
[
|
||||||
RbConfig::CONFIG['rubylibprefix'],
|
RbConfig::CONFIG['rubylibprefix'],
|
||||||
'gems',
|
'gems',
|
||||||
|
@ -245,7 +245,7 @@ diff --git a/test/rubygems/test_gem.rb b/test/rubygems/test_gem.rb
|
||||||
index 0428bea..b6e090e 100644
|
index 0428bea..b6e090e 100644
|
||||||
--- a/test/rubygems/test_gem.rb
|
--- a/test/rubygems/test_gem.rb
|
||||||
+++ b/test/rubygems/test_gem.rb
|
+++ b/test/rubygems/test_gem.rb
|
||||||
@@ -1288,7 +1288,8 @@ def test_self_use_paths
|
@@ -1191,7 +1191,8 @@ def test_self_use_paths
|
||||||
|
|
||||||
def test_self_user_dir
|
def test_self_user_dir
|
||||||
parts = [@userhome, '.gem', Gem.ruby_engine]
|
parts = [@userhome, '.gem', Gem.ruby_engine]
|
||||||
|
@ -255,7 +255,7 @@ index 0428bea..b6e090e 100644
|
||||||
|
|
||||||
assert_equal File.join(parts), Gem.user_dir
|
assert_equal File.join(parts), Gem.user_dir
|
||||||
end
|
end
|
||||||
@@ -1365,7 +1366,7 @@ def test_self_gzip
|
@@ -1318,7 +1319,7 @@ def test_self_user_home_user_drive_and_path
|
||||||
def test_self_vendor_dir
|
def test_self_vendor_dir
|
||||||
expected =
|
expected =
|
||||||
File.join RbConfig::CONFIG['vendordir'], 'gems',
|
File.join RbConfig::CONFIG['vendordir'], 'gems',
|
||||||
|
@ -282,7 +282,7 @@ diff --git a/configure.ac b/configure.ac
|
||||||
index a00f2b6776..999e2d6d5d 100644
|
index a00f2b6776..999e2d6d5d 100644
|
||||||
--- a/configure.ac
|
--- a/configure.ac
|
||||||
+++ b/configure.ac
|
+++ b/configure.ac
|
||||||
@@ -101,7 +101,7 @@ RUBY_BASE_NAME=`echo ruby | sed "$program_transform_name"`
|
@@ -164,7 +164,7 @@ RUBY_BASE_NAME=`echo ruby | sed "$program_transform_name"`
|
||||||
RUBYW_BASE_NAME=`echo rubyw | sed "$program_transform_name"`
|
RUBYW_BASE_NAME=`echo rubyw | sed "$program_transform_name"`
|
||||||
AC_SUBST(RUBY_BASE_NAME)
|
AC_SUBST(RUBY_BASE_NAME)
|
||||||
AC_SUBST(RUBYW_BASE_NAME)
|
AC_SUBST(RUBYW_BASE_NAME)
|
||||||
|
|
|
@ -0,0 +1,80 @@
|
||||||
|
From 60eb961c25f801ee43ca1be9393ab2f0a0546677 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||||
|
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
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
From 51e2c91412a511196e58efea5b87c460b4fa6a20 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?V=C3=ADt=20Ondruch?= <vondruch@redhat.com>
|
||||||
|
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
|
|
@ -0,0 +1,46 @@
|
||||||
|
From 93e6364a848f00b34647b13063dceb854dfaa11e Mon Sep 17 00:00:00 2001
|
||||||
|
From: usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
|
||||||
|
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
|
|
@ -0,0 +1,78 @@
|
||||||
|
From 893949167bdb911c7db9fd59de85f288c09741e1 Mon Sep 17 00:00:00 2001
|
||||||
|
From: nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
|
||||||
|
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 <jaruga@redhat.com>
|
||||||
|
|
||||||
|
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
|
||||||
|
|
|
@ -13,8 +13,8 @@ versions. So continue to use the Ruby implementation for now.
|
||||||
|
|
||||||
Reference: https://github.com/ruby/openssl/issues/208
|
Reference: https://github.com/ruby/openssl/issues/208
|
||||||
---
|
---
|
||||||
ext/openssl/lib/openssl/config.rb | 54 ++++++++++++++++++++-----------
|
ext/openssl/lib/openssl/config.rb | 54 ++++++++++++++++++++++++++++---------------
|
||||||
test/openssl/test_config.rb | 54 +++++++++++++++++++++++++++++++
|
test/openssl/test_config.rb | 54 +++++++++++++++++++++++++++++++++++++++++++
|
||||||
2 files changed, 90 insertions(+), 18 deletions(-)
|
2 files changed, 90 insertions(+), 18 deletions(-)
|
||||||
|
|
||||||
diff --git a/ext/openssl/lib/openssl/config.rb b/ext/openssl/lib/openssl/config.rb
|
diff --git a/ext/openssl/lib/openssl/config.rb b/ext/openssl/lib/openssl/config.rb
|
||||||
|
@ -46,8 +46,8 @@ index 88225451..ba3a54c8 100644
|
||||||
- key = $2
|
- key = $2
|
||||||
- else
|
- else
|
||||||
- key = $1
|
- key = $1
|
||||||
+ when /\A\.include (\s*=\s*)?(.+)\z/
|
+ when /\A\.include (.+)\z/
|
||||||
+ path = $2
|
+ path = $1
|
||||||
+ if File.directory?(path)
|
+ if File.directory?(path)
|
||||||
+ files = Dir.glob(File.join(path, "*.{cnf,conf}"), File::FNM_EXTGLOB)
|
+ files = Dir.glob(File.join(path, "*.{cnf,conf}"), File::FNM_EXTGLOB)
|
||||||
+ else
|
+ else
|
||||||
|
@ -141,7 +141,7 @@ index 99dcc497..5653b5d0 100644
|
||||||
+ file-main = unnamed
|
+ file-main = unnamed
|
||||||
+ [sec-main]
|
+ [sec-main]
|
||||||
+ main = 123
|
+ main = 123
|
||||||
+ .include = include-child.conf
|
+ .include include-child.conf
|
||||||
+ __EOC__
|
+ __EOC__
|
||||||
+
|
+
|
||||||
+ # Include a file by relative path
|
+ # Include a file by relative path
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
From c8ccdbfe1e45cb3b832109d644296c0a3b3e0b59 Mon Sep 17 00:00:00 2001
|
||||||
|
From: nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
|
||||||
|
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}",
|
|
@ -0,0 +1,177 @@
|
||||||
|
From bb3db69e2a0c210cc3a63940622db96a97eb7947 Mon Sep 17 00:00:00 2001
|
||||||
|
From: nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
|
||||||
|
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 <pthread.h>])
|
||||||
|
- 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
|
|
@ -0,0 +1,69 @@
|
||||||
|
From 9d98bfe7f1abdeda5aedf9404588104980ee7a86 Mon Sep 17 00:00:00 2001
|
||||||
|
From: aycabta <aycabta@gmail.com>
|
||||||
|
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 <<ruby
|
||||||
|
+class Foo
|
||||||
|
+ def meth
|
||||||
|
+ variable # comment
|
||||||
|
+ .chain
|
||||||
|
+ end
|
||||||
|
+end
|
||||||
|
+ruby
|
||||||
|
+
|
||||||
|
+ expected = <<EXPECTED
|
||||||
|
+<span class="ruby-keyword">def</span> <span class="ruby-identifier ruby-title">meth</span>
|
||||||
|
+ <span class="ruby-identifier">variable</span> <span class="ruby-comment"># comment</span>
|
||||||
|
+ .<span class="ruby-identifier">chain</span>
|
||||||
|
+<span class="ruby-keyword">end</span>
|
||||||
|
+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
|
|
@ -0,0 +1,214 @@
|
||||||
|
From 091459248d3ce814e10d50cc4421f0c0454ef61f Mon Sep 17 00:00:00 2001
|
||||||
|
From: "Bernhard M. Wiedemann" <bwiedemann@suse.de>
|
||||||
|
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" <bwiedemann@suse.de>
|
||||||
|
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 <aycabta@gmail.com>
|
||||||
|
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 <aycabta@gmail.com>
|
||||||
|
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
|
||||||
|
|
|
@ -0,0 +1,486 @@
|
||||||
|
From b0bcb19cb4f95d260c5993df0aaa3667522fb99d Mon Sep 17 00:00:00 2001
|
||||||
|
From: Kazuki Yamaguchi <k@rhe.jp>
|
||||||
|
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 <k@rhe.jp>
|
||||||
|
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
|
||||||
|
|
|
@ -0,0 +1,73 @@
|
||||||
|
From 8e2ed0b9d965a526b29f9dc3bff8e9fe33dae98d Mon Sep 17 00:00:00 2001
|
||||||
|
From: usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
|
||||||
|
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
|
||||||
|
|
|
@ -2,12 +2,15 @@ diff --git a/ext/fiddle/closure.c b/ext/fiddle/closure.c
|
||||||
index 1a80b2b..b997e23 100644
|
index 1a80b2b..b997e23 100644
|
||||||
--- a/ext/fiddle/closure.c
|
--- a/ext/fiddle/closure.c
|
||||||
+++ b/ext/fiddle/closure.c
|
+++ b/ext/fiddle/closure.c
|
||||||
@@ -13,22 +13,11 @@ typedef struct {
|
@@ -13,25 +13,11 @@ typedef struct {
|
||||||
ffi_type **argv;
|
ffi_type **argv;
|
||||||
} fiddle_closure;
|
} fiddle_closure;
|
||||||
|
|
||||||
-#if defined(USE_FFI_CLOSURE_ALLOC)
|
-#if defined(USE_FFI_CLOSURE_ALLOC)
|
||||||
-#elif !defined(HAVE_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
|
-# define USE_FFI_CLOSURE_ALLOC 0
|
||||||
-#else
|
-#else
|
||||||
-# define USE_FFI_CLOSURE_ALLOC 1
|
-# define USE_FFI_CLOSURE_ALLOC 1
|
||||||
|
@ -25,7 +28,7 @@ index 1a80b2b..b997e23 100644
|
||||||
if (cls->argv) xfree(cls->argv);
|
if (cls->argv) xfree(cls->argv);
|
||||||
xfree(cls);
|
xfree(cls);
|
||||||
}
|
}
|
||||||
@@ -202,12 +188,7 @@ allocate(VALUE klass)
|
@@ -205,12 +191,7 @@ allocate(VALUE klass)
|
||||||
VALUE i = TypedData_Make_Struct(klass, fiddle_closure,
|
VALUE i = TypedData_Make_Struct(klass, fiddle_closure,
|
||||||
&closure_data_type, closure);
|
&closure_data_type, closure);
|
||||||
|
|
||||||
|
@ -38,7 +41,7 @@ index 1a80b2b..b997e23 100644
|
||||||
|
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
@@ -254,17 +238,8 @@ initialize(int rbargc, VALUE argv[], VALUE self)
|
@@ -257,17 +238,8 @@ initialize(int rbargc, VALUE argv[], VALUE self)
|
||||||
if (FFI_OK != result)
|
if (FFI_OK != result)
|
||||||
rb_raise(rb_eRuntimeError, "error prepping CIF %d", result);
|
rb_raise(rb_eRuntimeError, "error prepping CIF %d", result);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,247 @@
|
||||||
|
commit be5a83e84a34091f2a4e3c6dfb911b20e78e690c
|
||||||
|
Author: usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
|
||||||
|
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 <shugo@ruby-lang.org>
|
||||||
|
|
||||||
|
|
||||||
|
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 = /\((?<host>\d+(,\d+){3}),(?<port>\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)
|
|
@ -0,0 +1,101 @@
|
||||||
|
commit 95ba9053e20ad8d113af37b3f1f4cbfff1f6a8f1
|
||||||
|
Author: usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
|
||||||
|
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 <shugo@ruby-lang.org>
|
||||||
|
|
||||||
|
|
||||||
|
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
|
|
@ -0,0 +1,88 @@
|
||||||
|
commit fe3c49c9baeeab58304ede915b7edd18ecf360fc
|
||||||
|
Author: usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
|
||||||
|
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'
|
|
@ -0,0 +1,42 @@
|
||||||
|
From e2c0652dff671dc6e16a80887e781edc0abc8454 Mon Sep 17 00:00:00 2001
|
||||||
|
From: usa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
|
||||||
|
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
|
||||||
|
|
|
@ -0,0 +1,918 @@
|
||||||
|
From d5753ec513fa5a4bdcf59fa298642fd0d3a3c364 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Yusuke Endoh <mame@ruby-lang.org>
|
||||||
|
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
|
||||||
|
<https://github.com/ruby/date/commit/4f9b8e946ba98f0a1774f8e677baa4a45637ebb3>.
|
||||||
|
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: 2001-02-03 ...>
|
||||||
|
* Date.parse('20010203') #=> #<Date: 2001-02-03 ...>
|
||||||
|
* Date.parse('3rd Feb 2001') #=> #<Date: 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_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: 2001-02-03 ...>
|
||||||
|
* Date.iso8601('20010203') #=> #<Date: 2001-02-03 ...>
|
||||||
|
* Date.iso8601('2001-W05-6') #=> #<Date: 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_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') #=> #<Date: 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_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') #=> #<Date: 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')
|
||||||
|
* #=> #<Date: 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_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')
|
||||||
|
* #=> #<Date: 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_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') #=> #<Date: 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_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: 2001-02-03T04:05:06+07:00 ...>
|
||||||
|
* DateTime.parse('3rd Feb 2001 04:05:06 PM')
|
||||||
|
* #=> #<DateTime: 2001-02-03T16:05:06+00: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_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: 2001-02-03T04:05:06+07:00 ...>
|
||||||
|
* DateTime.iso8601('2001-W05-6T04:05:06+07:00')
|
||||||
|
* #=> #<DateTime: 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_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')
|
||||||
|
* #=> #<DateTime: 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')
|
||||||
|
* #=> #<DateTime: 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')
|
||||||
|
* #=> #<DateTime: 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_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')
|
||||||
|
* #=> #<DateTime: 2001-02-03T04:05:06+00: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_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')
|
||||||
|
* #=> #<DateTime: 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_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
|
||||||
|
|
|
@ -1,107 +0,0 @@
|
||||||
From 745899dec8f28d50a37dc03a96bbea972caaef58 Mon Sep 17 00:00:00 2001
|
|
||||||
From: SHIBATA Hiroshi <hsbt@ruby-lang.org>
|
|
||||||
Date: Tue, 19 Feb 2019 22:41:56 +0900
|
|
||||||
Subject: [PATCH] Use ENV["BUNDLE_GEM"] instead of gem command provided by
|
|
||||||
system ruby.
|
|
||||||
|
|
||||||
It break the examples of bundler. Because some examples detect the
|
|
||||||
different version of system ruby than test target version like trunk.
|
|
||||||
---
|
|
||||||
lib/bundler/gem_helper.rb | 8 ++++++--
|
|
||||||
spec/bundler/commands/clean_spec.rb | 14 +++++++++-----
|
|
||||||
spec/bundler/support/rubygems_ext.rb | 7 ++-----
|
|
||||||
3 files changed, 17 insertions(+), 12 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/bundler/gem_helper.rb b/lib/bundler/gem_helper.rb
|
|
||||||
index e7673cba88..c54259b5b6 100644
|
|
||||||
--- a/lib/bundler/gem_helper.rb
|
|
||||||
+++ b/lib/bundler/gem_helper.rb
|
|
||||||
@@ -74,7 +74,8 @@ def install
|
|
||||||
|
|
||||||
def build_gem
|
|
||||||
file_name = nil
|
|
||||||
- sh("gem build -V '#{spec_path}'") do
|
|
||||||
+ gem = ENV["BUNDLE_GEM"] ? ENV["BUNDLE_GEM"] : "gem"
|
|
||||||
+ sh("#{gem} build -V #{spec_path}") do
|
|
||||||
file_name = File.basename(built_gem_path)
|
|
||||||
SharedHelpers.filesystem_access(File.join(base, "pkg")) {|p| FileUtils.mkdir_p(p) }
|
|
||||||
FileUtils.mv(built_gem_path, "pkg")
|
|
||||||
@@ -85,7 +86,10 @@ def build_gem
|
|
||||||
|
|
||||||
def install_gem(built_gem_path = nil, local = false)
|
|
||||||
built_gem_path ||= build_gem
|
|
||||||
- out, _ = sh_with_code("gem install '#{built_gem_path}'#{" --local" if local}")
|
|
||||||
+ gem = ENV["BUNDLE_GEM"] ? ENV["BUNDLE_GEM"] : "gem"
|
|
||||||
+ cmd = "#{gem} install #{built_gem_path}"
|
|
||||||
+ cmd = "#{cmd} --local" if local
|
|
||||||
+ out, _ = sh_with_code(cmd)
|
|
||||||
raise "Couldn't install gem, run `gem install #{built_gem_path}' for more detailed output" unless out[/Successfully installed/]
|
|
||||||
Bundler.ui.confirm "#{name} (#{version}) installed."
|
|
||||||
end
|
|
||||||
diff --git a/spec/bundler/commands/clean_spec.rb b/spec/bundler/commands/clean_spec.rb
|
|
||||||
index 37cbeeb4e7..74a5b86ec1 100644
|
|
||||||
--- a/spec/bundler/commands/clean_spec.rb
|
|
||||||
+++ b/spec/bundler/commands/clean_spec.rb
|
|
||||||
@@ -339,7 +339,8 @@ def should_not_have_gems(*gems)
|
|
||||||
gem "rack"
|
|
||||||
G
|
|
||||||
|
|
||||||
- sys_exec! "gem list"
|
|
||||||
+ gem = ruby_core? ? ENV["BUNDLE_GEM"] : "gem"
|
|
||||||
+ sys_exec! "#{gem} list"
|
|
||||||
expect(out).to include("rack (1.0.0)").and include("thin (1.0)")
|
|
||||||
end
|
|
||||||
|
|
||||||
@@ -461,8 +462,9 @@ def should_not_have_gems(*gems)
|
|
||||||
end
|
|
||||||
bundle! :update, :all => bundle_update_requires_all?
|
|
||||||
|
|
||||||
- sys_exec! "gem list"
|
|
||||||
- expect(out).to include("foo (1.0.1, 1.0)")
|
|
||||||
+ gem = ruby_core? ? ENV["BUNDLE_GEM"] : "gem"
|
|
||||||
+ sys_exec! "#{gem} list"
|
|
||||||
+ expect(out).to include("foo (1.0.1, 1.0)")
|
|
||||||
end
|
|
||||||
|
|
||||||
it "cleans system gems when --force is used" do
|
|
||||||
@@ -485,7 +487,8 @@ def should_not_have_gems(*gems)
|
|
||||||
bundle "clean --force"
|
|
||||||
|
|
||||||
expect(out).to include("Removing foo (1.0)")
|
|
||||||
- sys_exec "gem list"
|
|
||||||
+ gem = ruby_core? ? ENV["BUNDLE_GEM"] : "gem"
|
|
||||||
+ sys_exec "#{gem} list"
|
|
||||||
expect(out).not_to include("foo (1.0)")
|
|
||||||
expect(out).to include("rack (1.0.0)")
|
|
||||||
end
|
|
||||||
@@ -519,7 +522,8 @@ def should_not_have_gems(*gems)
|
|
||||||
expect(out).to include(system_gem_path.to_s)
|
|
||||||
expect(out).to include("grant write permissions")
|
|
||||||
|
|
||||||
- sys_exec "gem list"
|
|
||||||
+ gem = ruby_core? ? ENV["BUNDLE_GEM"] : "gem"
|
|
||||||
+ sys_exec "#{gem} list"
|
|
||||||
expect(out).to include("foo (1.0)")
|
|
||||||
expect(out).to include("rack (1.0.0)")
|
|
||||||
end
|
|
||||||
diff --git a/spec/bundler/support/rubygems_ext.rb b/spec/bundler/support/rubygems_ext.rb
|
|
||||||
index c18f7650fc..408d715ecf 100644
|
|
||||||
--- a/spec/bundler/support/rubygems_ext.rb
|
|
||||||
+++ b/spec/bundler/support/rubygems_ext.rb
|
|
||||||
@@ -59,11 +59,8 @@ def self.install_gems(gems)
|
|
||||||
no_reqs.map!(&:first)
|
|
||||||
reqs.map! {|name, req| "'#{name}:#{req}'" }
|
|
||||||
deps = reqs.concat(no_reqs).join(" ")
|
|
||||||
- cmd = if Gem::VERSION < "2.0.0"
|
|
||||||
- "gem install #{deps} --no-rdoc --no-ri --conservative"
|
|
||||||
- else
|
|
||||||
- "gem install #{deps} --no-document --conservative"
|
|
||||||
- end
|
|
||||||
+ gem = Spec::Path.ruby_core? ? ENV["BUNDLE_GEM"] : "#{Gem.ruby} -S gem"
|
|
||||||
+ cmd = "#{gem} install #{deps} --no-document --conservative"
|
|
||||||
puts cmd
|
|
||||||
system(cmd) || raise("Installing gems #{deps} for the tests to use failed!")
|
|
||||||
end
|
|
||||||
--
|
|
||||||
2.31.1
|
|
||||||
|
|
|
@ -1,131 +0,0 @@
|
||||||
From 920b924e5652884064a9529ffbd80d458a46fbc6 Mon Sep 17 00:00:00 2001
|
|
||||||
From: eregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
|
|
||||||
Date: Tue, 5 Feb 2019 09:58:50 +0000
|
|
||||||
Subject: [PATCH] Make sure to wait with IO.select before using
|
|
||||||
Socket#recvfrom_nonblock
|
|
||||||
|
|
||||||
* On all platforms, as this is the recommended code pattern.
|
|
||||||
|
|
||||||
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67010 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
||||||
---
|
|
||||||
spec/ruby/library/socket/socket/recvfrom_nonblock_spec.rb | 8 ++++----
|
|
||||||
1 file changed, 4 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/spec/ruby/library/socket/socket/recvfrom_nonblock_spec.rb b/spec/ruby/library/socket/socket/recvfrom_nonblock_spec.rb
|
|
||||||
index c1239ae637e0..74fd286c42ad 100644
|
|
||||||
--- a/spec/ruby/library/socket/socket/recvfrom_nonblock_spec.rb
|
|
||||||
+++ b/spec/ruby/library/socket/socket/recvfrom_nonblock_spec.rb
|
|
||||||
@@ -36,12 +36,11 @@
|
|
||||||
describe 'with data available' do
|
|
||||||
before do
|
|
||||||
@client.write('hello')
|
|
||||||
-
|
|
||||||
- platform_is(:darwin, :freebsd) { IO.select([@server]) }
|
|
||||||
end
|
|
||||||
|
|
||||||
platform_is_not :windows do
|
|
||||||
it 'returns an Array containing the data and an Addrinfo' do
|
|
||||||
+ IO.select([@server])
|
|
||||||
ret = @server.recvfrom_nonblock(1)
|
|
||||||
|
|
||||||
ret.should be_an_instance_of(Array)
|
|
||||||
@@ -54,8 +53,7 @@
|
|
||||||
5.times do
|
|
||||||
@client.write('hello')
|
|
||||||
|
|
||||||
- platform_is(:darwin, :freebsd) { IO.select([@server]) }
|
|
||||||
-
|
|
||||||
+ IO.select([@server])
|
|
||||||
msg, _ = @server.recvfrom_nonblock(5)
|
|
||||||
|
|
||||||
msg.should == 'hello'
|
|
||||||
@@ -66,6 +64,7 @@
|
|
||||||
platform_is_not :windows do
|
|
||||||
describe 'the returned Array' do
|
|
||||||
before do
|
|
||||||
+ IO.select([@server])
|
|
||||||
@array = @server.recvfrom_nonblock(1)
|
|
||||||
end
|
|
||||||
|
|
||||||
@@ -80,6 +79,7 @@
|
|
||||||
|
|
||||||
describe 'the returned Addrinfo' do
|
|
||||||
before do
|
|
||||||
+ IO.select([@server])
|
|
||||||
@addr = @server.recvfrom_nonblock(1)[1]
|
|
||||||
end
|
|
||||||
|
|
||||||
From c1f0daeb6ac5c5414c9a4a58bb778a118006ae1f Mon Sep 17 00:00:00 2001
|
|
||||||
From: eregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
|
|
||||||
Date: Tue, 5 Feb 2019 10:19:29 +0000
|
|
||||||
Subject: [PATCH] Make sure to wait with IO.select before using
|
|
||||||
Socket#accept_nonblock and recvfrom_nonblock
|
|
||||||
|
|
||||||
* On all platforms, as this is the recommended code pattern.
|
|
||||||
|
|
||||||
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67011 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
||||||
---
|
|
||||||
spec/ruby/library/socket/socket/accept_nonblock_spec.rb | 4 ++--
|
|
||||||
spec/ruby/library/socket/udpsocket/recvfrom_nonblock_spec.rb | 5 +++--
|
|
||||||
2 files changed, 5 insertions(+), 4 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/spec/ruby/library/socket/socket/accept_nonblock_spec.rb b/spec/ruby/library/socket/socket/accept_nonblock_spec.rb
|
|
||||||
index 3ef219ed05a9..cde9e6a4b669 100644
|
|
||||||
--- a/spec/ruby/library/socket/socket/accept_nonblock_spec.rb
|
|
||||||
+++ b/spec/ruby/library/socket/socket/accept_nonblock_spec.rb
|
|
||||||
@@ -86,8 +86,6 @@
|
|
||||||
@client = Socket.new(family, :STREAM, 0)
|
|
||||||
|
|
||||||
@client.connect(addr)
|
|
||||||
-
|
|
||||||
- platform_is(:darwin, :freebsd, :solaris) { IO.select([@server]) }
|
|
||||||
end
|
|
||||||
|
|
||||||
after do
|
|
||||||
@@ -96,6 +94,7 @@
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'returns an Array containing a Socket and an Addrinfo' do
|
|
||||||
+ IO.select([@server])
|
|
||||||
@socket, addrinfo = @server.accept_nonblock
|
|
||||||
|
|
||||||
@socket.should be_an_instance_of(Socket)
|
|
||||||
@@ -104,6 +103,7 @@
|
|
||||||
|
|
||||||
describe 'the returned Addrinfo' do
|
|
||||||
before do
|
|
||||||
+ IO.select([@server])
|
|
||||||
@socket, @addr = @server.accept_nonblock
|
|
||||||
end
|
|
||||||
|
|
||||||
diff --git a/spec/ruby/library/socket/udpsocket/recvfrom_nonblock_spec.rb b/spec/ruby/library/socket/udpsocket/recvfrom_nonblock_spec.rb
|
|
||||||
index 015109a05200..62bbaf0dc93a 100644
|
|
||||||
--- a/spec/ruby/library/socket/udpsocket/recvfrom_nonblock_spec.rb
|
|
||||||
+++ b/spec/ruby/library/socket/udpsocket/recvfrom_nonblock_spec.rb
|
|
||||||
@@ -40,16 +40,16 @@
|
|
||||||
describe 'with data available' do
|
|
||||||
before do
|
|
||||||
@client.write('hello')
|
|
||||||
-
|
|
||||||
- platform_is(:darwin, :freebsd) { IO.select([@server]) }
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'returns an Array containing the data and an Array' do
|
|
||||||
+ IO.select([@server])
|
|
||||||
@server.recvfrom_nonblock(1).should be_an_instance_of(Array)
|
|
||||||
end
|
|
||||||
|
|
||||||
describe 'the returned Array' do
|
|
||||||
before do
|
|
||||||
+ IO.select([@server])
|
|
||||||
@array = @server.recvfrom_nonblock(1)
|
|
||||||
end
|
|
||||||
|
|
||||||
@@ -64,6 +64,7 @@
|
|
||||||
|
|
||||||
describe 'the returned address Array' do
|
|
||||||
before do
|
|
||||||
+ IO.select([@server])
|
|
||||||
@addr = @server.recvfrom_nonblock(1)[1]
|
|
||||||
end
|
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
From 8cca079d3be8d07c261baea72529628469938245 Mon Sep 17 00:00:00 2001
|
|
||||||
From: hsbt <hsbt@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
|
|
||||||
Date: Sat, 2 Feb 2019 10:41:22 +0000
|
|
||||||
Subject: [PATCH] Fixup r66984. Update the location of bundler gemspec.
|
|
||||||
|
|
||||||
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66993 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
|
|
||||||
---
|
|
||||||
spec/bundler/support/path.rb | 2 +-
|
|
||||||
tool/sync_default_gems.rb | 2 +-
|
|
||||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/spec/bundler/support/path.rb b/spec/bundler/support/path.rb
|
|
||||||
index 38f7145dc72a..69efcba05175 100644
|
|
||||||
--- a/spec/bundler/support/path.rb
|
|
||||||
+++ b/spec/bundler/support/path.rb
|
|
||||||
@@ -9,7 +9,7 @@ def root
|
|
||||||
end
|
|
||||||
|
|
||||||
def gemspec
|
|
||||||
- @gemspec ||= root.join(ruby_core? ? "lib/bundler.gemspec" : "bundler.gemspec")
|
|
||||||
+ @gemspec ||= root.join(ruby_core? ? "lib/bundler/bundler.gemspec" : "bundler.gemspec")
|
|
||||||
end
|
|
||||||
|
|
||||||
def bindir
|
|
||||||
diff --git a/tool/sync_default_gems.rb b/tool/sync_default_gems.rb
|
|
||||||
index bb4fcdd2cc12..26458147e5a3 100644
|
|
||||||
--- a/tool/sync_default_gems.rb
|
|
||||||
+++ b/tool/sync_default_gems.rb
|
|
||||||
@@ -89,7 +89,7 @@ def sync_default_gems(gem)
|
|
||||||
`rm -rf lib/bundler* libexec/bundler libexec/bundle libexec/bundle_ruby spec/bundler man/bundle* man/gemfile*`
|
|
||||||
`cp -r ../../bundler/bundler/lib/bundler* ./lib`
|
|
||||||
`cp -r ../../bundler/bundler/exe/bundle* ./libexec`
|
|
||||||
- `cp ../../bundler/bundler/bundler.gemspec ./lib`
|
|
||||||
+ `cp ../../bundler/bundler/bundler.gemspec ./lib/bundler`
|
|
||||||
`cp -r ../../bundler/bundler/spec spec/bundler`
|
|
||||||
`cp -r ../../bundler/bundler/man/*.{1,5,1\.txt,5\.txt,ronn} ./man`
|
|
||||||
`rm -rf spec/bundler/support/artifice/vcr_cassettes`
|
|
|
@ -0,0 +1,328 @@
|
||||||
|
From 8fc4b4792919c627183f4ddb6dc256aae49eb738 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Hiroshi SHIBATA <hsbt@ruby-lang.org>
|
||||||
|
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(?<label>(?!-)[-A-Za-z0-9]+(?<!-))(?:\.\g<label>)*\z"
|
||||||
|
+
|
||||||
|
# Create a new CGI::Cookie object.
|
||||||
|
#
|
||||||
|
# :call-seq:
|
||||||
|
@@ -72,9 +76,8 @@ class CGI
|
||||||
|
@domain = nil
|
||||||
|
@expires = nil
|
||||||
|
if name.kind_of?(String)
|
||||||
|
- @name = name
|
||||||
|
- %r|^(.*/)|.match(ENV["SCRIPT_NAME"])
|
||||||
|
- @path = ($1 or "")
|
||||||
|
+ self.name = name
|
||||||
|
+ self.path = (%r|\A(.*/)| =~ ENV["SCRIPT_NAME"] ? $1 : "")
|
||||||
|
@secure = false
|
||||||
|
@httponly = false
|
||||||
|
return super(value)
|
||||||
|
@@ -85,16 +88,11 @@ class CGI
|
||||||
|
raise ArgumentError, "`name' required"
|
||||||
|
end
|
||||||
|
|
||||||
|
- @name = options["name"]
|
||||||
|
+ self.name = options["name"]
|
||||||
|
value = Array(options["value"])
|
||||||
|
# simple support for IE
|
||||||
|
- if options["path"]
|
||||||
|
- @path = options["path"]
|
||||||
|
- else
|
||||||
|
- %r|^(.*/)|.match(ENV["SCRIPT_NAME"])
|
||||||
|
- @path = ($1 or "")
|
||||||
|
- end
|
||||||
|
- @domain = options["domain"]
|
||||||
|
+ self.path = options["path"] || (%r|\A(.*/)| =~ ENV["SCRIPT_NAME"] ? $1 : "")
|
||||||
|
+ self.domain = options["domain"]
|
||||||
|
@expires = options["expires"]
|
||||||
|
@secure = options["secure"] == true
|
||||||
|
@httponly = options["httponly"] == true
|
||||||
|
@@ -102,12 +100,35 @@ class CGI
|
||||||
|
super(value)
|
||||||
|
end
|
||||||
|
|
||||||
|
- # Name of this cookie, as a +String+
|
||||||
|
- attr_accessor :name
|
||||||
|
+ attr_reader :name
|
||||||
|
+ # Set name of this cookie
|
||||||
|
+ def name=(str)
|
||||||
|
+ if str and !TOKEN_RE.match?(str)
|
||||||
|
+ raise ArgumentError, "invalid name: #{str.dump}"
|
||||||
|
+ end
|
||||||
|
+ @name = str
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
# Path for which this cookie applies, as a +String+
|
||||||
|
- attr_accessor :path
|
||||||
|
+ attr_reader :path
|
||||||
|
+ # Set path for which this cookie applies
|
||||||
|
+ def path=(str)
|
||||||
|
+ if str and !PATH_VALUE_RE.match?(str)
|
||||||
|
+ raise ArgumentError, "invalid path: #{str.dump}"
|
||||||
|
+ end
|
||||||
|
+ @path = str
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
# Domain for which this cookie applies, as a +String+
|
||||||
|
- attr_accessor :domain
|
||||||
|
+ attr_reader :domain
|
||||||
|
+ # Set domain for which this cookie applies
|
||||||
|
+ def domain=(str)
|
||||||
|
+ if str and ((str = str.b).bytesize > 255 or !DOMAIN_VALUE_RE.match?(str))
|
||||||
|
+ raise ArgumentError, "invalid domain: #{str.dump}"
|
||||||
|
+ end
|
||||||
|
+ @domain = str
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
# Time at which this cookie expires, as a +Time+
|
||||||
|
attr_accessor :expires
|
||||||
|
# True if this cookie is secure; false otherwise
|
||||||
|
diff --git a/lib/cgi/core.rb b/lib/cgi/core.rb
|
||||||
|
index 9bd7798..7d8b223 100644
|
||||||
|
--- a/lib/cgi/core.rb
|
||||||
|
+++ b/lib/cgi/core.rb
|
||||||
|
@@ -188,17 +188,28 @@ class CGI
|
||||||
|
# Using #header with the HTML5 tag maker will create a <header> element.
|
||||||
|
alias :header :http_header
|
||||||
|
|
||||||
|
+ def _no_crlf_check(str)
|
||||||
|
+ if str
|
||||||
|
+ str = str.to_s
|
||||||
|
+ raise "A HTTP status or header field must not include CR and LF" if str =~ /[\r\n]/
|
||||||
|
+ str
|
||||||
|
+ else
|
||||||
|
+ nil
|
||||||
|
+ end
|
||||||
|
+ end
|
||||||
|
+ private :_no_crlf_check
|
||||||
|
+
|
||||||
|
def _header_for_string(content_type) #:nodoc:
|
||||||
|
buf = ''.dup
|
||||||
|
if nph?()
|
||||||
|
- buf << "#{$CGI_ENV['SERVER_PROTOCOL'] || 'HTTP/1.0'} 200 OK#{EOL}"
|
||||||
|
+ buf << "#{_no_crlf_check($CGI_ENV['SERVER_PROTOCOL']) || 'HTTP/1.0'} 200 OK#{EOL}"
|
||||||
|
buf << "Date: #{CGI.rfc1123_date(Time.now)}#{EOL}"
|
||||||
|
- buf << "Server: #{$CGI_ENV['SERVER_SOFTWARE']}#{EOL}"
|
||||||
|
+ buf << "Server: #{_no_crlf_check($CGI_ENV['SERVER_SOFTWARE'])}#{EOL}"
|
||||||
|
buf << "Connection: close#{EOL}"
|
||||||
|
end
|
||||||
|
- buf << "Content-Type: #{content_type}#{EOL}"
|
||||||
|
+ buf << "Content-Type: #{_no_crlf_check(content_type)}#{EOL}"
|
||||||
|
if @output_cookies
|
||||||
|
- @output_cookies.each {|cookie| buf << "Set-Cookie: #{cookie}#{EOL}" }
|
||||||
|
+ @output_cookies.each {|cookie| buf << "Set-Cookie: #{_no_crlf_check(cookie)}#{EOL}" }
|
||||||
|
end
|
||||||
|
return buf
|
||||||
|
end # _header_for_string
|
||||||
|
@@ -213,9 +224,9 @@ class CGI
|
||||||
|
## NPH
|
||||||
|
options.delete('nph') if defined?(MOD_RUBY)
|
||||||
|
if options.delete('nph') || nph?()
|
||||||
|
- protocol = $CGI_ENV['SERVER_PROTOCOL'] || 'HTTP/1.0'
|
||||||
|
+ protocol = _no_crlf_check($CGI_ENV['SERVER_PROTOCOL']) || 'HTTP/1.0'
|
||||||
|
status = options.delete('status')
|
||||||
|
- status = HTTP_STATUS[status] || status || '200 OK'
|
||||||
|
+ status = HTTP_STATUS[status] || _no_crlf_check(status) || '200 OK'
|
||||||
|
buf << "#{protocol} #{status}#{EOL}"
|
||||||
|
buf << "Date: #{CGI.rfc1123_date(Time.now)}#{EOL}"
|
||||||
|
options['server'] ||= $CGI_ENV['SERVER_SOFTWARE'] || ''
|
||||||
|
@@ -223,38 +234,38 @@ class CGI
|
||||||
|
end
|
||||||
|
## common headers
|
||||||
|
status = options.delete('status')
|
||||||
|
- buf << "Status: #{HTTP_STATUS[status] || status}#{EOL}" if status
|
||||||
|
+ buf << "Status: #{HTTP_STATUS[status] || _no_crlf_check(status)}#{EOL}" if status
|
||||||
|
server = options.delete('server')
|
||||||
|
- buf << "Server: #{server}#{EOL}" if server
|
||||||
|
+ buf << "Server: #{_no_crlf_check(server)}#{EOL}" if server
|
||||||
|
connection = options.delete('connection')
|
||||||
|
- buf << "Connection: #{connection}#{EOL}" if connection
|
||||||
|
+ buf << "Connection: #{_no_crlf_check(connection)}#{EOL}" if connection
|
||||||
|
type = options.delete('type')
|
||||||
|
- buf << "Content-Type: #{type}#{EOL}" #if type
|
||||||
|
+ buf << "Content-Type: #{_no_crlf_check(type)}#{EOL}" #if type
|
||||||
|
length = options.delete('length')
|
||||||
|
- buf << "Content-Length: #{length}#{EOL}" if length
|
||||||
|
+ buf << "Content-Length: #{_no_crlf_check(length)}#{EOL}" if length
|
||||||
|
language = options.delete('language')
|
||||||
|
- buf << "Content-Language: #{language}#{EOL}" if language
|
||||||
|
+ buf << "Content-Language: #{_no_crlf_check(language)}#{EOL}" if language
|
||||||
|
expires = options.delete('expires')
|
||||||
|
buf << "Expires: #{CGI.rfc1123_date(expires)}#{EOL}" if expires
|
||||||
|
## cookie
|
||||||
|
if cookie = options.delete('cookie')
|
||||||
|
case cookie
|
||||||
|
when String, Cookie
|
||||||
|
- buf << "Set-Cookie: #{cookie}#{EOL}"
|
||||||
|
+ buf << "Set-Cookie: #{_no_crlf_check(cookie)}#{EOL}"
|
||||||
|
when Array
|
||||||
|
arr = cookie
|
||||||
|
- arr.each {|c| buf << "Set-Cookie: #{c}#{EOL}" }
|
||||||
|
+ arr.each {|c| buf << "Set-Cookie: #{_no_crlf_check(c)}#{EOL}" }
|
||||||
|
when Hash
|
||||||
|
hash = cookie
|
||||||
|
- hash.each_value {|c| buf << "Set-Cookie: #{c}#{EOL}" }
|
||||||
|
+ hash.each_value {|c| buf << "Set-Cookie: #{_no_crlf_check(c)}#{EOL}" }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if @output_cookies
|
||||||
|
- @output_cookies.each {|c| buf << "Set-Cookie: #{c}#{EOL}" }
|
||||||
|
+ @output_cookies.each {|c| buf << "Set-Cookie: #{_no_crlf_check(c)}#{EOL}" }
|
||||||
|
end
|
||||||
|
## other headers
|
||||||
|
options.each do |key, value|
|
||||||
|
- buf << "#{key}: #{value}#{EOL}"
|
||||||
|
+ buf << "#{_no_crlf_check(key)}: #{_no_crlf_check(value)}#{EOL}"
|
||||||
|
end
|
||||||
|
return buf
|
||||||
|
end # _header_for_hash
|
||||||
|
diff --git a/test/cgi/test_cgi_cookie.rb b/test/cgi/test_cgi_cookie.rb
|
||||||
|
index 985cc0d..7afff5e 100644
|
||||||
|
--- a/test/cgi/test_cgi_cookie.rb
|
||||||
|
+++ b/test/cgi/test_cgi_cookie.rb
|
||||||
|
@@ -60,6 +60,24 @@ class CGICookieTest < Test::Unit::TestCase
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
+ def test_cgi_cookie_new_with_domain
|
||||||
|
+ h = {'name'=>'name1', 'value'=>'value1'}
|
||||||
|
+ cookie = CGI::Cookie.new({'domain' => 'a.example.com'}.merge(h))
|
||||||
|
+ assert_equal('a.example.com', cookie.domain)
|
||||||
|
+
|
||||||
|
+ cookie = CGI::Cookie.new({'domain'=>'1.example.com'}.merge(h))
|
||||||
|
+ assert_equal('1.example.com', cookie.domain, 'enhanced by RFC 1123')
|
||||||
|
+
|
||||||
|
+ assert_raise(ArgumentError) {
|
||||||
|
+ CGI::Cookie.new({'domain'=>'-a.example.com'}.merge(h))
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ assert_raise(ArgumentError) {
|
||||||
|
+ CGI::Cookie.new({'domain'=>'a-.example.com'}.merge(h))
|
||||||
|
+ }
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
+
|
||||||
|
def test_cgi_cookie_scriptname
|
||||||
|
cookie = CGI::Cookie.new('name1', 'value1')
|
||||||
|
assert_equal('', cookie.path)
|
||||||
|
@@ -118,6 +136,70 @@ class CGICookieTest < Test::Unit::TestCase
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
+ def test_cgi_cookie_domain_injection_into_name
|
||||||
|
+ name = "a=b; domain=example.com;"
|
||||||
|
+ path = "/"
|
||||||
|
+ domain = "example.jp"
|
||||||
|
+ assert_raise(ArgumentError) do
|
||||||
|
+ CGI::Cookie.new('name' => name,
|
||||||
|
+ 'value' => "value",
|
||||||
|
+ 'domain' => domain,
|
||||||
|
+ 'path' => path)
|
||||||
|
+ end
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+ def test_cgi_cookie_newline_injection_into_name
|
||||||
|
+ name = "a=b;\r\nLocation: http://example.com#"
|
||||||
|
+ path = "/"
|
||||||
|
+ domain = "example.jp"
|
||||||
|
+ assert_raise(ArgumentError) do
|
||||||
|
+ CGI::Cookie.new('name' => name,
|
||||||
|
+ 'value' => "value",
|
||||||
|
+ 'domain' => domain,
|
||||||
|
+ 'path' => path)
|
||||||
|
+ end
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+ def test_cgi_cookie_multibyte_injection_into_name
|
||||||
|
+ name = "a=b;\u3042"
|
||||||
|
+ path = "/"
|
||||||
|
+ domain = "example.jp"
|
||||||
|
+ assert_raise(ArgumentError) do
|
||||||
|
+ CGI::Cookie.new('name' => name,
|
||||||
|
+ 'value' => "value",
|
||||||
|
+ 'domain' => domain,
|
||||||
|
+ 'path' => path)
|
||||||
|
+ end
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+ def test_cgi_cookie_injection_into_path
|
||||||
|
+ name = "name"
|
||||||
|
+ path = "/; samesite=none"
|
||||||
|
+ domain = "example.jp"
|
||||||
|
+ assert_raise(ArgumentError) do
|
||||||
|
+ CGI::Cookie.new('name' => name,
|
||||||
|
+ 'value' => "value",
|
||||||
|
+ 'domain' => domain,
|
||||||
|
+ 'path' => path)
|
||||||
|
+ end
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+ def test_cgi_cookie_injection_into_domain
|
||||||
|
+ name = "name"
|
||||||
|
+ path = "/"
|
||||||
|
+ domain = "example.jp; samesite=none"
|
||||||
|
+ assert_raise(ArgumentError) do
|
||||||
|
+ CGI::Cookie.new('name' => name,
|
||||||
|
+ 'value' => "value",
|
||||||
|
+ 'domain' => domain,
|
||||||
|
+ 'path' => path)
|
||||||
|
+ end
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
|
||||||
|
instance_methods.each do |method|
|
||||||
|
private method if method =~ /^test_(.*)/ && $1 != ENV['TEST']
|
||||||
|
diff --git a/test/cgi/test_cgi_header.rb b/test/cgi/test_cgi_header.rb
|
||||||
|
index bab2d03..ec2f4de 100644
|
||||||
|
--- a/test/cgi/test_cgi_header.rb
|
||||||
|
+++ b/test/cgi/test_cgi_header.rb
|
||||||
|
@@ -176,6 +176,14 @@ class CGIHeaderTest < Test::Unit::TestCase
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
+ def test_cgi_http_header_crlf_injection
|
||||||
|
+ cgi = CGI.new
|
||||||
|
+ assert_raise(RuntimeError) { cgi.http_header("text/xhtml\r\nBOO") }
|
||||||
|
+ assert_raise(RuntimeError) { cgi.http_header("type" => "text/xhtml\r\nBOO") }
|
||||||
|
+ assert_raise(RuntimeError) { cgi.http_header("status" => "200 OK\r\nBOO") }
|
||||||
|
+ assert_raise(RuntimeError) { cgi.http_header("location" => "text/xhtml\r\nBOO") }
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
|
||||||
|
instance_methods.each do |method|
|
||||||
|
private method if method =~ /^test_(.*)/ && $1 != ENV['TEST']
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
|
@ -0,0 +1,52 @@
|
||||||
|
From 61fb466ea0b492c990fcd2d681c08f2001d7a659 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Hiroshi SHIBATA <hsbt@ruby-lang.org>
|
||||||
|
Date: Tue, 28 Mar 2023 17:33:19 +0900
|
||||||
|
Subject: [PATCH] Fix CVE-2023-28755 ReDos vulnerability in URI.
|
||||||
|
|
||||||
|
This patch was backported from Ruby 2.7.8
|
||||||
|
|
||||||
|
Backported from upstream Ruby, commit:
|
||||||
|
https://github.com/ruby/ruby/commit/6855779d580358a6a0b4c9ee06f20e7cae72955a
|
||||||
|
|
||||||
|
===== Original commit message
|
||||||
|
|
||||||
|
Merge URI-0.10.0.2
|
||||||
|
---
|
||||||
|
lib/uri/rfc3986_parser.rb | 4 ++--
|
||||||
|
test/uri/test_parser.rb | 7 +++++++
|
||||||
|
2 files changed, 9 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/uri/rfc3986_parser.rb b/lib/uri/rfc3986_parser.rb
|
||||||
|
index 8712800..ad32368 100644
|
||||||
|
--- a/lib/uri/rfc3986_parser.rb
|
||||||
|
+++ b/lib/uri/rfc3986_parser.rb
|
||||||
|
@@ -3,8 +3,8 @@ module URI
|
||||||
|
class RFC3986_Parser # :nodoc:
|
||||||
|
# URI defined in RFC3986
|
||||||
|
# this regexp is modified not to host is not empty string
|
||||||
|
- RFC3986_URI = /\A(?<URI>(?<scheme>[A-Za-z][+\-.0-9A-Za-z]*):(?<hier-part>\/\/(?<authority>(?:(?<userinfo>(?:%\h\h|[!$&-.0-;=A-Z_a-z~])*)@)?(?<host>(?<IP-literal>\[(?:(?<IPv6address>(?:\h{1,4}:){6}(?<ls32>\h{1,4}:\h{1,4}|(?<IPv4address>(?<dec-octet>[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]|\d)\.\g<dec-octet>\.\g<dec-octet>\.\g<dec-octet>))|::(?:\h{1,4}:){5}\g<ls32>|\h{1,4}?::(?:\h{1,4}:){4}\g<ls32>|(?:(?:\h{1,4}:)?\h{1,4})?::(?:\h{1,4}:){3}\g<ls32>|(?:(?:\h{1,4}:){,2}\h{1,4})?::(?:\h{1,4}:){2}\g<ls32>|(?:(?:\h{1,4}:){,3}\h{1,4})?::\h{1,4}:\g<ls32>|(?:(?:\h{1,4}:){,4}\h{1,4})?::\g<ls32>|(?:(?:\h{1,4}:){,5}\h{1,4})?::\h{1,4}|(?:(?:\h{1,4}:){,6}\h{1,4})?::)|(?<IPvFuture>v\h+\.[!$&-.0-;=A-Z_a-z~]+))\])|\g<IPv4address>|(?<reg-name>(?:%\h\h|[!$&-.0-9;=A-Z_a-z~])+))?(?::(?<port>\d*))?)(?<path-abempty>(?:\/(?<segment>(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*))*)|(?<path-absolute>\/(?:(?<segment-nz>(?:%\h\h|[!$&-.0-;=@-Z_a-z~])+)(?:\/\g<segment>)*)?)|(?<path-rootless>\g<segment-nz>(?:\/\g<segment>)*)|(?<path-empty>))(?:\?(?<query>[^#]*))?(?:\#(?<fragment>(?:%\h\h|[!$&-.0-;=@-Z_a-z~\/?])*))?)\z/
|
||||||
|
- RFC3986_relative_ref = /\A(?<relative-ref>(?<relative-part>\/\/(?<authority>(?:(?<userinfo>(?:%\h\h|[!$&-.0-;=A-Z_a-z~])*)@)?(?<host>(?<IP-literal>\[(?<IPv6address>(?:\h{1,4}:){6}(?<ls32>\h{1,4}:\h{1,4}|(?<IPv4address>(?<dec-octet>[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]|\d)\.\g<dec-octet>\.\g<dec-octet>\.\g<dec-octet>))|::(?:\h{1,4}:){5}\g<ls32>|\h{1,4}?::(?:\h{1,4}:){4}\g<ls32>|(?:(?:\h{1,4}:){,1}\h{1,4})?::(?:\h{1,4}:){3}\g<ls32>|(?:(?:\h{1,4}:){,2}\h{1,4})?::(?:\h{1,4}:){2}\g<ls32>|(?:(?:\h{1,4}:){,3}\h{1,4})?::\h{1,4}:\g<ls32>|(?:(?:\h{1,4}:){,4}\h{1,4})?::\g<ls32>|(?:(?:\h{1,4}:){,5}\h{1,4})?::\h{1,4}|(?:(?:\h{1,4}:){,6}\h{1,4})?::)|(?<IPvFuture>v\h+\.[!$&-.0-;=A-Z_a-z~]+)\])|\g<IPv4address>|(?<reg-name>(?:%\h\h|[!$&-.0-9;=A-Z_a-z~])+))?(?::(?<port>\d*))?)(?<path-abempty>(?:\/(?<segment>(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*))*)|(?<path-absolute>\/(?:(?<segment-nz>(?:%\h\h|[!$&-.0-;=@-Z_a-z~])+)(?:\/\g<segment>)*)?)|(?<path-noscheme>(?<segment-nz-nc>(?:%\h\h|[!$&-.0-9;=@-Z_a-z~])+)(?:\/\g<segment>)*)|(?<path-empty>))(?:\?(?<query>[^#]*))?(?:\#(?<fragment>(?:%\h\h|[!$&-.0-;=@-Z_a-z~\/?])*))?)\z/
|
||||||
|
+ RFC3986_URI = /\A(?<URI>(?<scheme>[A-Za-z][+\-.0-9A-Za-z]*+):(?<hier-part>\/\/(?<authority>(?:(?<userinfo>(?:%\h\h|[!$&-.0-;=A-Z_a-z~])*+)@)?(?<host>(?<IP-literal>\[(?:(?<IPv6address>(?:\h{1,4}:){6}(?<ls32>\h{1,4}:\h{1,4}|(?<IPv4address>(?<dec-octet>[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]|\d)\.\g<dec-octet>\.\g<dec-octet>\.\g<dec-octet>))|::(?:\h{1,4}:){5}\g<ls32>|\h{1,4}?::(?:\h{1,4}:){4}\g<ls32>|(?:(?:\h{1,4}:)?\h{1,4})?::(?:\h{1,4}:){3}\g<ls32>|(?:(?:\h{1,4}:){,2}\h{1,4})?::(?:\h{1,4}:){2}\g<ls32>|(?:(?:\h{1,4}:){,3}\h{1,4})?::\h{1,4}:\g<ls32>|(?:(?:\h{1,4}:){,4}\h{1,4})?::\g<ls32>|(?:(?:\h{1,4}:){,5}\h{1,4})?::\h{1,4}|(?:(?:\h{1,4}:){,6}\h{1,4})?::)|(?<IPvFuture>v\h++\.[!$&-.0-;=A-Z_a-z~]++))\])|\g<IPv4address>|(?<reg-name>(?:%\h\h|[!$&-.0-9;=A-Z_a-z~])++))?(?::(?<port>\d*+))?)(?<path-abempty>(?:\/(?<segment>(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*+))*+)|(?<path-absolute>\/(?:(?<segment-nz>(?:%\h\h|[!$&-.0-;=@-Z_a-z~])++)(?:\/\g<segment>)*+)?)|(?<path-rootless>\g<segment-nz>(?:\/\g<segment>)*+)|(?<path-empty>))(?:\?(?<query>[^#]*+))?(?:\#(?<fragment>(?:%\h\h|[!$&-.0-;=@-Z_a-z~\/?])*+))?)\z/
|
||||||
|
+ RFC3986_relative_ref = /\A(?<relative-ref>(?<relative-part>\/\/(?<authority>(?:(?<userinfo>(?:%\h\h|[!$&-.0-;=A-Z_a-z~])*+)@)?(?<host>(?<IP-literal>\[(?:(?<IPv6address>(?:\h{1,4}:){6}(?<ls32>\h{1,4}:\h{1,4}|(?<IPv4address>(?<dec-octet>[1-9]\d|1\d{2}|2[0-4]\d|25[0-5]|\d)\.\g<dec-octet>\.\g<dec-octet>\.\g<dec-octet>))|::(?:\h{1,4}:){5}\g<ls32>|\h{1,4}?::(?:\h{1,4}:){4}\g<ls32>|(?:(?:\h{1,4}:){,1}\h{1,4})?::(?:\h{1,4}:){3}\g<ls32>|(?:(?:\h{1,4}:){,2}\h{1,4})?::(?:\h{1,4}:){2}\g<ls32>|(?:(?:\h{1,4}:){,3}\h{1,4})?::\h{1,4}:\g<ls32>|(?:(?:\h{1,4}:){,4}\h{1,4})?::\g<ls32>|(?:(?:\h{1,4}:){,5}\h{1,4})?::\h{1,4}|(?:(?:\h{1,4}:){,6}\h{1,4})?::)|(?<IPvFuture>v\h++\.[!$&-.0-;=A-Z_a-z~]++))\])|\g<IPv4address>|(?<reg-name>(?:%\h\h|[!$&-.0-9;=A-Z_a-z~])++))?(?::(?<port>\d*+))?)(?<path-abempty>(?:\/(?<segment>(?:%\h\h|[!$&-.0-;=@-Z_a-z~])*+))*+)|(?<path-absolute>\/(?:(?<segment-nz>(?:%\h\h|[!$&-.0-;=@-Z_a-z~])++)(?:\/\g<segment>)*+)?)|(?<path-noscheme>(?<segment-nz-nc>(?:%\h\h|[!$&-.0-9;=@-Z_a-z~])++)(?:\/\g<segment>)*+)|(?<path-empty>))(?:\?(?<query>[^#]*+))?(?:\#(?<fragment>(?:%\h\h|[!$&-.0-;=@-Z_a-z~\/?])*+))?)\z/
|
||||||
|
attr_reader :regexp
|
||||||
|
|
||||||
|
def initialize
|
||||||
|
diff --git a/test/uri/test_parser.rb b/test/uri/test_parser.rb
|
||||||
|
index 757ac86..2f70559 100644
|
||||||
|
--- a/test/uri/test_parser.rb
|
||||||
|
+++ b/test/uri/test_parser.rb
|
||||||
|
@@ -45,4 +45,11 @@ class URI::TestParser < Test::Unit::TestCase
|
||||||
|
URI.parse(1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
+
|
||||||
|
+ def test_split
|
||||||
|
+ assert_equal(["http", nil, "example.com", nil, nil, "", nil, nil, nil], URI.split("http://example.com"))
|
||||||
|
+ assert_equal(["http", nil, "[0::0]", nil, nil, "", nil, nil, nil], URI.split("http://[0::0]"))
|
||||||
|
+ assert_equal([nil, nil, "example.com", nil, nil, "", nil, nil, nil], URI.split("//example.com"))
|
||||||
|
+ assert_equal([nil, nil, "[0::0]", nil, nil, "", nil, nil, nil], URI.split("//[0::0]"))
|
||||||
|
+ end
|
||||||
|
end
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
From 71c37c29defeab2c98ad4291807efe12427a209f Mon Sep 17 00:00:00 2001
|
||||||
|
From: Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
Date: Tue, 29 Nov 2022 16:22:15 +0900
|
||||||
|
Subject: [PATCH] Fix CVE-2023-28756 ReDoS vulnerability in Time.
|
||||||
|
|
||||||
|
Backported from: Ruby 2.7.8
|
||||||
|
Backported from the following commits:
|
||||||
|
https://github.com/ruby/ruby/commit/2cb830602f52e7e76c6781115e7938b21f881c4f
|
||||||
|
https://github.com/ruby/ruby/commit/e3f18f7d2e034f20053d7bf2fc7a50f8b7e1a27a
|
||||||
|
|
||||||
|
Do not include the test case, as assert_linear_time was introduced in Ruby 2.7.
|
||||||
|
|
||||||
|
==== Original commit message(s)
|
||||||
|
|
||||||
|
Fix quadratic backtracking on invalid time
|
||||||
|
|
||||||
|
Make RFC2822 regexp linear
|
||||||
|
|
||||||
|
https://hackerone.com/reports/1485501
|
||||||
|
---
|
||||||
|
lib/time.rb | 4 ++--
|
||||||
|
1 file changed, 2 insertions(+), 2 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/time.rb b/lib/time.rb
|
||||||
|
index eb46a03..cb6f1e4 100644
|
||||||
|
--- a/lib/time.rb
|
||||||
|
+++ b/lib/time.rb
|
||||||
|
@@ -474,8 +474,8 @@ class Time
|
||||||
|
(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+
|
||||||
|
(\d{2,})\s+
|
||||||
|
(\d{2})\s*
|
||||||
|
- :\s*(\d{2})\s*
|
||||||
|
- (?::\s*(\d{2}))?\s+
|
||||||
|
+ :\s*(\d{2})
|
||||||
|
+ (?:\s*:\s*(\d\d))?\s+
|
||||||
|
([+-]\d{4}|
|
||||||
|
UT|GMT|EST|EDT|CST|CDT|MST|MDT|PST|PDT|[A-IK-Z])/ix =~ date
|
||||||
|
# Since RFC 2822 permit comments, the regexp has no right anchor.
|
||||||
|
--
|
||||||
|
2.41.0
|
||||||
|
|
|
@ -16,7 +16,7 @@ diff --git a/lib/resolv.rb b/lib/resolv.rb
|
||||||
index e7b45e785a85..d78531e174fd 100644
|
index e7b45e785a85..d78531e174fd 100644
|
||||||
--- a/lib/resolv.rb
|
--- a/lib/resolv.rb
|
||||||
+++ b/lib/resolv.rb
|
+++ b/lib/resolv.rb
|
||||||
@@ -762,6 +762,7 @@ def recv_reply(readable_socks)
|
@@ -774,6 +774,7 @@ def recv_reply(readable_socks)
|
||||||
end
|
end
|
||||||
|
|
||||||
def sender(msg, data, host, port=Port)
|
def sender(msg, data, host, port=Port)
|
||||||
|
|
|
@ -0,0 +1,70 @@
|
||||||
|
From a1124dc162810f86cb0bff58cde24064cfc561bc Mon Sep 17 00:00:00 2001
|
||||||
|
From: nagachika <nagachika@ruby-lang.org>
|
||||||
|
Date: Fri, 9 Dec 2022 21:11:47 +0900
|
||||||
|
Subject: [PATCH] merge revision(s) 58cc3c9f387dcf8f820b43e043b540fa06248da3:
|
||||||
|
[Backport #19187]
|
||||||
|
|
||||||
|
[Bug #19187] Fix for tzdata-2022g
|
||||||
|
|
||||||
|
---
|
||||||
|
test/ruby/test_time_tz.rb | 21 +++++++++++++++------
|
||||||
|
1 file changed, 15 insertions(+), 6 deletions(-)
|
||||||
|
---
|
||||||
|
test/ruby/test_time_tz.rb | 21 +++++++++++++++------
|
||||||
|
1 files changed, 15 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/test/ruby/test_time_tz.rb b/test/ruby/test_time_tz.rb
|
||||||
|
index b6785f336028d..939f218ed4d10 100644
|
||||||
|
--- a/test/ruby/test_time_tz.rb
|
||||||
|
+++ b/test/ruby/test_time_tz.rb
|
||||||
|
@@ -6,9 +6,9 @@ class TestTimeTZ < Test::Unit::TestCase
|
||||||
|
has_lisbon_tz = true
|
||||||
|
force_tz_test = ENV["RUBY_FORCE_TIME_TZ_TEST"] == "yes"
|
||||||
|
case RUBY_PLATFORM
|
||||||
|
- when /linux/
|
||||||
|
+ when /darwin|linux/
|
||||||
|
force_tz_test = true
|
||||||
|
- when /darwin|freebsd/
|
||||||
|
+ when /freebsd|openbsd/
|
||||||
|
has_lisbon_tz = false
|
||||||
|
force_tz_test = true
|
||||||
|
end
|
||||||
|
@@ -94,6 +94,9 @@ def group_by(e, &block)
|
||||||
|
CORRECT_KIRITIMATI_SKIP_1994 = with_tz("Pacific/Kiritimati") {
|
||||||
|
Time.local(1994, 12, 31, 0, 0, 0).year == 1995
|
||||||
|
}
|
||||||
|
+ CORRECT_SINGAPORE_1982 = with_tz("Asia/Singapore") {
|
||||||
|
+ "2022g" if Time.local(1981, 12, 31, 23, 59, 59).utc_offset == 8*3600
|
||||||
|
+ }
|
||||||
|
|
||||||
|
def time_to_s(t)
|
||||||
|
t.to_s
|
||||||
|
@@ -139,9 +142,12 @@ def test_america_managua
|
||||||
|
|
||||||
|
def test_asia_singapore
|
||||||
|
with_tz(tz="Asia/Singapore") {
|
||||||
|
- assert_time_constructor(tz, "1981-12-31 23:59:59 +0730", :local, [1981,12,31,23,59,59])
|
||||||
|
- assert_time_constructor(tz, "1982-01-01 00:30:00 +0800", :local, [1982,1,1,0,0,0])
|
||||||
|
- assert_time_constructor(tz, "1982-01-01 00:59:59 +0800", :local, [1982,1,1,0,29,59])
|
||||||
|
+ assert_time_constructor(tz, "1981-12-31 23:29:59 +0730", :local, [1981,12,31,23,29,59])
|
||||||
|
+ if CORRECT_SINGAPORE_1982
|
||||||
|
+ assert_time_constructor(tz, "1982-01-01 00:00:00 +0800", :local, [1981,12,31,23,30,00])
|
||||||
|
+ assert_time_constructor(tz, "1982-01-01 00:00:00 +0800", :local, [1982,1,1,0,0,0])
|
||||||
|
+ assert_time_constructor(tz, "1982-01-01 00:29:59 +0800", :local, [1982,1,1,0,29,59])
|
||||||
|
+ end
|
||||||
|
assert_time_constructor(tz, "1982-01-01 00:30:00 +0800", :local, [1982,1,1,0,30,0])
|
||||||
|
}
|
||||||
|
end
|
||||||
|
@@ -364,8 +370,11 @@ def self.gen_zdump_test(data)
|
||||||
|
America/Managua Wed Jan 1 04:59:59 1997 UTC = Tue Dec 31 23:59:59 1996 EST isdst=0 gmtoff=-18000
|
||||||
|
America/Managua Wed Jan 1 05:00:00 1997 UTC = Tue Dec 31 23:00:00 1996 CST isdst=0 gmtoff=-21600
|
||||||
|
Asia/Singapore Sun Aug 8 16:30:00 1965 UTC = Mon Aug 9 00:00:00 1965 SGT isdst=0 gmtoff=27000
|
||||||
|
-Asia/Singapore Thu Dec 31 16:29:59 1981 UTC = Thu Dec 31 23:59:59 1981 SGT isdst=0 gmtoff=27000
|
||||||
|
+Asia/Singapore Thu Dec 31 15:59:59 1981 UTC = Thu Dec 31 23:29:59 1981 SGT isdst=0 gmtoff=27000
|
||||||
|
Asia/Singapore Thu Dec 31 16:30:00 1981 UTC = Fri Jan 1 00:30:00 1982 SGT isdst=0 gmtoff=28800
|
||||||
|
+End
|
||||||
|
+ gen_zdump_test <<'End' if CORRECT_SINGAPORE_1982
|
||||||
|
+Asia/Singapore Thu Dec 31 16:00:00 1981 UTC = Fri Jan 1 00:00:00 1982 SGT isdst=0 gmtoff=28800
|
||||||
|
End
|
||||||
|
gen_zdump_test CORRECT_TOKYO_DST_1951 ? <<'End' + (CORRECT_TOKYO_DST_1951 < "2018f" ? <<'2018e' : <<'2018f') : <<'End'
|
||||||
|
Asia/Tokyo Sat May 5 14:59:59 1951 UTC = Sat May 5 23:59:59 1951 JST isdst=0 gmtoff=32400
|
|
@ -0,0 +1,27 @@
|
||||||
|
From dae843f6b7502f921a7e66f39e3714a39d860181 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Hiroshi SHIBATA <hsbt@ruby-lang.org>
|
||||||
|
Date: Wed, 19 Oct 2022 19:40:00 +0900
|
||||||
|
Subject: [PATCH] Bypass git submodule add/update with git config
|
||||||
|
protocol.file.allow=always option.
|
||||||
|
|
||||||
|
Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
---
|
||||||
|
test/rubygems/test_gem_source_git.rb | 5 +++++
|
||||||
|
1 file changed, 5 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/test/rubygems/test_gem_source_git.rb b/test/rubygems/test_gem_source_git.rb
|
||||||
|
index 5702da05974b6..c3b324771fa4d 100644
|
||||||
|
--- a/test/rubygems/test_gem_source_git.rb
|
||||||
|
+++ b/test/rubygems/test_gem_source_git.rb
|
||||||
|
@@ -64,6 +64,11 @@ def test_checkout_local_cached
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_checkout_submodules
|
||||||
|
+ # We need to allow to checkout submodules with file:// protocol
|
||||||
|
+ # CVE-2022-39253
|
||||||
|
+ # https://lore.kernel.org/lkml/xmqq4jw1uku5.fsf@gitster.g/
|
||||||
|
+ system(@git, *%W"config --global protocol.file.allow always")
|
||||||
|
+
|
||||||
|
source = Gem::Source::Git.new @name, @repository, 'master', true
|
||||||
|
|
||||||
|
git_gem 'b'
|
|
@ -1,422 +0,0 @@
|
||||||
diff --git a/lib/bundler/definition.rb b/lib/bundler/definition.rb
|
|
||||||
index 8e56d4a9bc..c37946b46c 100644
|
|
||||||
--- a/lib/bundler/definition.rb
|
|
||||||
+++ b/lib/bundler/definition.rb
|
|
||||||
@@ -910,6 +910,8 @@ def source_requirements
|
|
||||||
# Load all specs from remote sources
|
|
||||||
index
|
|
||||||
|
|
||||||
+ validate_dependency_confusion! unless disable_dependency_confusion_check?
|
|
||||||
+
|
|
||||||
# Record the specs available in each gem's source, so that those
|
|
||||||
# specs will be available later when the resolver knows where to
|
|
||||||
# look for that gemspec (or its dependencies)
|
|
||||||
@@ -989,5 +991,112 @@ def equivalent_rubygems_remotes?(source)
|
|
||||||
|
|
||||||
Bundler.settings[:allow_deployment_source_credential_changes] && source.equivalent_remotes?(sources.rubygems_remotes)
|
|
||||||
end
|
|
||||||
+
|
|
||||||
+ def validate_dependency_confusion!
|
|
||||||
+ # Continue if there is a scoped repository in the remote case.
|
|
||||||
+ return unless @remote && sources.non_global_rubygems_sources.size > 0
|
|
||||||
+
|
|
||||||
+ # Raise an error unless all the scope repositories implement the dependency API.
|
|
||||||
+ # When there is a non-dependency API scoped repository, we cannot get
|
|
||||||
+ # indirect dependencies used in a `Gemfile`.
|
|
||||||
+ unless sources.non_global_rubygems_sources.all?(&:dependency_api_available?)
|
|
||||||
+ non_api_sources = sources.non_global_rubygems_sources.reject(&:dependency_api_available?)
|
|
||||||
+ non_api_source_names_str = non_api_sources.map {|d| " * #{d}" }.join("\n")
|
|
||||||
+
|
|
||||||
+ msg = String.new
|
|
||||||
+ msg << "Your Gemfile contains scoped sources that don't implement a dependency API, namely:\n\n"
|
|
||||||
+ msg << non_api_source_names_str
|
|
||||||
+ msg << "\n\nUsing the above gem servers may result in installing unexpected gems. " \
|
|
||||||
+ "To resolve this warning, make sure you use gem servers that implement dependency APIs, " \
|
|
||||||
+ "such as gemstash or geminabox gem servers."
|
|
||||||
+ raise_error_or_warn_dependency_confusion(msg)
|
|
||||||
+ return
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ indirect_dep_names = indirect_dependency_names_in_non_global_rubygems_soruces
|
|
||||||
+ # Get all the gem names from the index made from the default source.
|
|
||||||
+ # default_source_dep_names = @index.sources.select(&:default_source_used?).map(&:spec_names).flatten
|
|
||||||
+ # Get all the gem names from each source.
|
|
||||||
+ all_spec_names_list = @index.sources.map(&:spec_names)
|
|
||||||
+
|
|
||||||
+ # Only include the indirect dependency gems on the scoped sources that
|
|
||||||
+ # also exist on another source. The gems are included in more than 2
|
|
||||||
+ # sources (the own source + another source). If the gems don't exist on
|
|
||||||
+ # the another source, the dependency confusion doesn't happen.
|
|
||||||
+ indirect_dep_names.select! do |name|
|
|
||||||
+ source_num = all_spec_names_list.select {|all_names| all_names.include?(name) }
|
|
||||||
+ source_num.size >= 2
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ # Raise an error if there is an indirect dependency.
|
|
||||||
+ if indirect_dep_names.size > 0
|
|
||||||
+ dep_names_str = indirect_dep_names.join(", ")
|
|
||||||
+ source_names_str = sources.non_global_rubygems_sources.map {|d| " * #{d}" }.join("\n")
|
|
||||||
+
|
|
||||||
+ msg = String.new
|
|
||||||
+ msg << "Your Gemfile contains implicit dependency gems #{dep_names_str} on the scoped sources, namely:\n\n"
|
|
||||||
+ msg << source_names_str
|
|
||||||
+ msg << "\n\nUsing implicit dependency gems on the above sources may result in installing unexpected gems. "
|
|
||||||
+ msg << "To suppress this message, make sure you set the gems explicitly in the Gemfile."
|
|
||||||
+ raise_error_or_warn_dependency_confusion(msg)
|
|
||||||
+ return
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ def raise_error_or_warn_dependency_confusion(msg)
|
|
||||||
+ if warn_on_dependnecy_confusion?
|
|
||||||
+ Bundler.ui.warn msg
|
|
||||||
+ else
|
|
||||||
+ msg = "#{msg} Or set the environment variable BUNDLE_WARN_ON_DEPENDENCY_CONFUSION."
|
|
||||||
+ raise SecurityError, msg
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ def indirect_dependency_names_in_non_global_rubygems_soruces
|
|
||||||
+ # Indirect dependency gem names
|
|
||||||
+ indirect_dep_names = []
|
|
||||||
+ # Direct dependency gem names
|
|
||||||
+ direct_dep_names = @dependencies.map(&:name)
|
|
||||||
+
|
|
||||||
+ sources.non_global_rubygems_sources.each do |s|
|
|
||||||
+ # If the non dependency API source is used, the `dependency_names`
|
|
||||||
+ # returns gems not only used in the `Gemfile`, but also returns ones
|
|
||||||
+ # existing in the scoped source too. This method shouldn't be used with
|
|
||||||
+ # the non dependency API sources.
|
|
||||||
+ s.specs.dependency_names.each do |dep_name|
|
|
||||||
+ # Exclude direct dependency gems.
|
|
||||||
+ next if direct_dep_names.include?(dep_name)
|
|
||||||
+
|
|
||||||
+ s.specs.local_search(dep_name).each do |spec|
|
|
||||||
+ # Debug gems with unexpected `spec.class`.
|
|
||||||
+ Bundler.ui.debug "Found dependency gem #{dep_name} (#{spec.class}) in scoped sources."
|
|
||||||
+ # StubSpecification extending RemoteSpecification: the gems by
|
|
||||||
+ # `gem list`. Exclude the gems.
|
|
||||||
+ # EndpointSpecification: gems returned by dependency API such as
|
|
||||||
+ # geminabox
|
|
||||||
+ # RemoteSpecification: gems returned by non dependency API such as
|
|
||||||
+ # gem server. This method cannot be executed with the non
|
|
||||||
+ # dependency API sources.
|
|
||||||
+ indirect_dep_names << dep_name if spec.class == EndpointSpecification
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ indirect_dep_names.sort.uniq
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ # Print a warning instead of raising an error when this option is enabled.
|
|
||||||
+ # Don't use Bundler.settings to minimize the difference to backport easily
|
|
||||||
+ # and avoid additional tests.
|
|
||||||
+ def warn_on_dependnecy_confusion?
|
|
||||||
+ @warn_on_dependnecy_confusion ||= ENV["BUNDLE_WARN_ON_DEPENDENCY_CONFUSION"]
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ # Disable the dependency confusion check when this option is enabled.
|
|
||||||
+ # The option can be used as a workaround if the check logic is problematic
|
|
||||||
+ # in a case such as a performance issue.
|
|
||||||
+ def disable_dependency_confusion_check?
|
|
||||||
+ @disable_dependnecy_confusion_check ||= ENV["BUNDLE_DISABLE_DEPENDENCY_CONFUSION_CHECK"]
|
|
||||||
+ end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
diff --git a/lib/bundler/source/rubygems.rb b/lib/bundler/source/rubygems.rb
|
|
||||||
index 485b388a32..48a2ab736b 100644
|
|
||||||
--- a/lib/bundler/source/rubygems.rb
|
|
||||||
+++ b/lib/bundler/source/rubygems.rb
|
|
||||||
@@ -289,6 +289,10 @@ def dependency_names_to_double_check
|
|
||||||
names
|
|
||||||
end
|
|
||||||
|
|
||||||
+ def dependency_api_available?
|
|
||||||
+ api_fetchers.any?
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
protected
|
|
||||||
|
|
||||||
def credless_remotes
|
|
||||||
diff --git a/lib/bundler/source_list.rb b/lib/bundler/source_list.rb
|
|
||||||
index ac2adacb3d..37869878ce 100644
|
|
||||||
--- a/lib/bundler/source_list.rb
|
|
||||||
+++ b/lib/bundler/source_list.rb
|
|
||||||
@@ -64,6 +64,10 @@ def rubygems_sources
|
|
||||||
@rubygems_sources + [default_source]
|
|
||||||
end
|
|
||||||
|
|
||||||
+ def non_global_rubygems_sources
|
|
||||||
+ @rubygems_sources
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
def rubygems_remotes
|
|
||||||
rubygems_sources.map(&:remotes).flatten.uniq
|
|
||||||
end
|
|
||||||
diff --git a/spec/bundler/bundler/definition_dep_confusion_spec.rb b/spec/bundler/bundler/definition_dep_confusion_spec.rb
|
|
||||||
new file mode 100644
|
|
||||||
index 0000000000..9fee464960
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/spec/bundler/bundler/definition_dep_confusion_spec.rb
|
|
||||||
@@ -0,0 +1,257 @@
|
|
||||||
+# frozen_string_literal: true
|
|
||||||
+
|
|
||||||
+require "bundler/definition"
|
|
||||||
+
|
|
||||||
+RSpec.describe Bundler::Definition do
|
|
||||||
+ before do
|
|
||||||
+ allow(Bundler::SharedHelpers).to receive(:find_gemfile) { Pathname.new("Gemfile") }
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ let(:sources) { Bundler::SourceList.new }
|
|
||||||
+ subject { Bundler::Definition.new(nil, [], sources, []) }
|
|
||||||
+
|
|
||||||
+ describe "#validate_dependency_confusion!" do
|
|
||||||
+ before do
|
|
||||||
+ subject.instance_variable_set(:@remote, remote)
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ context "when it's not remote" do
|
|
||||||
+ let(:remote) { false }
|
|
||||||
+
|
|
||||||
+ it "should neither raise an error nor warn" do
|
|
||||||
+ expect(subject).not_to receive(:raise_error_or_warn_dependency_confusion)
|
|
||||||
+ subject.send(:validate_dependency_confusion!)
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ context "when it's remote" do
|
|
||||||
+ before do
|
|
||||||
+ allow(sources).to receive(:non_global_rubygems_sources).and_return(non_global_rubygems_sources)
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ let(:remote) { true }
|
|
||||||
+
|
|
||||||
+ context "when the number of non-global source is zero" do
|
|
||||||
+ let(:non_global_rubygems_sources) { [] }
|
|
||||||
+
|
|
||||||
+ it "should neither raise an error nor warn" do
|
|
||||||
+ expect(subject).not_to receive(:raise_error_or_warn_dependency_confusion)
|
|
||||||
+ subject.send(:validate_dependency_confusion!)
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ context "when there are any non dependency API non global sources" do
|
|
||||||
+ let(:non_global_rubygems_sources) do
|
|
||||||
+ [
|
|
||||||
+ double("non-global-source-0", :dependency_api_available? => true, :to_s => "a"),
|
|
||||||
+ double("non-global-source-1", :dependency_api_available? => false, :to_s => "b"),
|
|
||||||
+ double("non-global-source-2", :dependency_api_available? => false, :to_s => "c"),
|
|
||||||
+ ]
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ it "should raise an error or warn" do
|
|
||||||
+ expect(subject).to receive(:raise_error_or_warn_dependency_confusion).with(<<-M.strip)
|
|
||||||
+Your Gemfile contains scoped sources that don't implement a dependency API, namely:
|
|
||||||
+
|
|
||||||
+ * b
|
|
||||||
+ * c
|
|
||||||
+
|
|
||||||
+Using the above gem servers may result in installing unexpected gems. To resolve this warning, make sure you use gem servers that implement dependency APIs, such as gemstash or geminabox gem servers.
|
|
||||||
+ M
|
|
||||||
+ subject.send(:validate_dependency_confusion!)
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ context "when all the non global sources implement dependency API" do
|
|
||||||
+ before do
|
|
||||||
+ allow(subject).to receive(:indirect_dependency_names_in_non_global_rubygems_soruces).and_return(indirect_dependency_names)
|
|
||||||
+ subject.instance_variable_set(:@index, index)
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ let(:non_global_rubygems_sources) do
|
|
||||||
+ [
|
|
||||||
+ double("non-global-source-0", :dependency_api_available? => true, :to_s => "a"),
|
|
||||||
+ double("non-global-source-1", :dependency_api_available? => true, :to_s => "b"),
|
|
||||||
+ ]
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ let(:index) { double("index", :sources => index_sources) }
|
|
||||||
+ let(:index_sources) do
|
|
||||||
+ [
|
|
||||||
+ double("index-source-1", :spec_names => ["a1", "a2"]),
|
|
||||||
+ double("index-source-2", :spec_names => ["a2", "b1", "b2"]),
|
|
||||||
+ double("index-source-3", :spec_names => ["b2"])
|
|
||||||
+ ]
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ context "when there is not an indirect dependency in the non global sources" do
|
|
||||||
+ let(:indirect_dependency_names) {[]}
|
|
||||||
+
|
|
||||||
+ it "should neither raise an error nor warn" do
|
|
||||||
+ expect(subject).not_to receive(:raise_error_or_warn_dependency_confusion)
|
|
||||||
+ subject.send(:validate_dependency_confusion!)
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ context "when there is an indirect dependency in the non global sources" do
|
|
||||||
+
|
|
||||||
+ context "when the indirect dependency doesn't exist in another source" do
|
|
||||||
+ let(:indirect_dependency_names) {["a1", "b1"]}
|
|
||||||
+
|
|
||||||
+ it "should neither raise an error nor warn" do
|
|
||||||
+ expect(subject).not_to receive(:raise_error_or_warn_dependency_confusion)
|
|
||||||
+ subject.send(:validate_dependency_confusion!)
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ context "when the indirect dependency also exists in anotehr source" do
|
|
||||||
+ let(:indirect_dependency_names) {["a1", "a2", "b2"]}
|
|
||||||
+
|
|
||||||
+ it "should raise an error or warn" do
|
|
||||||
+ expect(subject).to receive(:raise_error_or_warn_dependency_confusion).with(<<-M.strip)
|
|
||||||
+Your Gemfile contains implicit dependency gems a2, b2 on the scoped sources, namely:
|
|
||||||
+
|
|
||||||
+ * a
|
|
||||||
+ * b
|
|
||||||
+
|
|
||||||
+Using implicit dependency gems on the above sources may result in installing unexpected gems. To suppress this message, make sure you set the gems explicitly in the Gemfile.
|
|
||||||
+ M
|
|
||||||
+ subject.send(:validate_dependency_confusion!)
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ describe "#indirect_dependency_names_in_non_global_rubygems_soruces" do
|
|
||||||
+ before do
|
|
||||||
+ subject.instance_variable_set(:@dependencies, dependencies)
|
|
||||||
+ allow(sources).to receive(:non_global_rubygems_sources).and_return(non_global_rubygems_sources)
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ # Direct dependencies
|
|
||||||
+ let(:dependencies) do
|
|
||||||
+ [
|
|
||||||
+ double("dependency-0", :name => "g0"),
|
|
||||||
+ double("dependency-1", :name => "g3")
|
|
||||||
+ ]
|
|
||||||
+ end
|
|
||||||
+ let(:non_global_rubygems_sources) do
|
|
||||||
+ [
|
|
||||||
+ double("non-global-source-0", :specs => index_0, :to_s => "s0"),
|
|
||||||
+ double("non-global-source-1", :specs => index_1, :to_s => "s1"),
|
|
||||||
+ ]
|
|
||||||
+ end
|
|
||||||
+ let(:index_0) do
|
|
||||||
+ # All the dependencies in the source-0.
|
|
||||||
+ index = double("index-0", :dependency_names => ["g0", "g1", "g2", "g5"])
|
|
||||||
+ allow(index).to receive(:local_search) do |query|
|
|
||||||
+ return_map = {
|
|
||||||
+ "g1" => [double("spec", :class => Bundler::StubSpecification, :to_s => "g1")],
|
|
||||||
+ "g2" => [double("spec", :class => Bundler::EndpointSpecification, :to_s => "g2")],
|
|
||||||
+ "g5" => [double("spec", :class => Bundler::EndpointSpecification, :to_s => "g5")]
|
|
||||||
+ }
|
|
||||||
+ return_map[query]
|
|
||||||
+ end
|
|
||||||
+ index
|
|
||||||
+ end
|
|
||||||
+ let(:index_1) do
|
|
||||||
+ # All the dependencies in the source-1.
|
|
||||||
+ index = double("index-1", :dependency_names => ["g3", "g4", "g5"])
|
|
||||||
+ allow(index).to receive(:local_search) do |query|
|
|
||||||
+ return_map = {
|
|
||||||
+ "g4" => [double("spec", :class => Bundler::EndpointSpecification, :to_s => "g4")],
|
|
||||||
+ "g5" => [double("spec", :class => Bundler::EndpointSpecification, :to_s => "g5")]
|
|
||||||
+ }
|
|
||||||
+ return_map[query]
|
|
||||||
+ end
|
|
||||||
+ index
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ it "should return only indirect dependencies of endpoint specification" do
|
|
||||||
+ expect(subject.send(:indirect_dependency_names_in_non_global_rubygems_soruces)).to eq(["g2", "g4", "g5"])
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ describe "#raise_error_or_warn_dependency_confusion" do
|
|
||||||
+ before do
|
|
||||||
+ allow(subject).to receive(:warn_on_dependnecy_confusion?).and_return(warn_on_dependnecy_confusion)
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ context "when #warn_on_dependnecy_confusion? returns false" do
|
|
||||||
+ let(:warn_on_dependnecy_confusion) { false }
|
|
||||||
+
|
|
||||||
+ it "should raise an error" do
|
|
||||||
+ expect(Bundler.ui).not_to receive(:warn)
|
|
||||||
+ expect do
|
|
||||||
+ subject.send(:raise_error_or_warn_dependency_confusion, "This is a message.")
|
|
||||||
+ end.to raise_error(Bundler::SecurityError, "This is a message. " \
|
|
||||||
+ "Or set the environment variable BUNDLE_WARN_ON_DEPENDENCY_CONFUSION.")
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ context "when #warn_on_dependnecy_confusion? returns true" do
|
|
||||||
+ let(:warn_on_dependnecy_confusion) { true }
|
|
||||||
+
|
|
||||||
+ it "should warn" do
|
|
||||||
+ expect(Bundler.ui).to receive(:warn).with(<<-W.strip)
|
|
||||||
+This is a message.
|
|
||||||
+W
|
|
||||||
+ subject.send(:raise_error_or_warn_dependency_confusion, "This is a message.")
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ describe "#warn_on_dependnecy_confusion?" do
|
|
||||||
+ context "when BUNDLE_WARN_ON_DEPENDENCY_CONFUSION is set" do
|
|
||||||
+ it "should return true" do
|
|
||||||
+ with_env({"BUNDLE_WARN_ON_DEPENDENCY_CONFUSION" => "1"}) do
|
|
||||||
+ expect(subject.send(:warn_on_dependnecy_confusion?)).to be_truthy
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ context "when BUNDLE_WARN_ON_DEPENDENCY_CONFUSION is not set" do
|
|
||||||
+ it "should return false" do
|
|
||||||
+ with_env({"BUNDLE_WARN_ON_DEPENDENCY_CONFUSION" => nil}) do
|
|
||||||
+ expect(subject.send(:warn_on_dependnecy_confusion?)).to be_falsy
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ describe "#disable_dependency_confusion_check?" do
|
|
||||||
+ context "when BUNDLE_DISABLE_DEPENDENCY_CONFUSION_CHECK is set" do
|
|
||||||
+ it "should return true" do
|
|
||||||
+ with_env({"BUNDLE_DISABLE_DEPENDENCY_CONFUSION_CHECK" => "1"}) do
|
|
||||||
+ expect(subject.send(:disable_dependency_confusion_check?)).to be_truthy
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ context "when BUNDLE_DISABLE_DEPENDENCY_CONFUSION_CHECK is not set" do
|
|
||||||
+ it "should return false" do
|
|
||||||
+ with_env({"BUNDLE_DISABLE_DEPENDENCY_CONFUSION_CHECK" => nil}) do
|
|
||||||
+ expect(subject.send(:disable_dependency_confusion_check?)).to be_falsy
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ def with_env(env={})
|
|
||||||
+ begin
|
|
||||||
+ tmp_env = {}
|
|
||||||
+ env.each do |key, value|
|
|
||||||
+ tmp_env[key] = ENV.delete key
|
|
||||||
+ ENV[key] = value
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ yield
|
|
||||||
+ ensure
|
|
||||||
+ tmp_env.each do |key, value|
|
|
||||||
+ ENV[key] = value
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+end
|
|
||||||
--
|
|
||||||
2.31.1
|
|
||||||
|
|
|
@ -1,157 +0,0 @@
|
||||||
From 65cfebb041c454c246aaf32a177b0243915a9998 Mon Sep 17 00:00:00 2001
|
|
||||||
From: fatkodima <fatkodima123@gmail.com>
|
|
||||||
Date: Fri, 1 Nov 2019 23:06:10 +0200
|
|
||||||
Subject: [PATCH] Don't use insecure temporary directory as home directory
|
|
||||||
|
|
||||||
---
|
|
||||||
lib/bundler.rb | 29 +++++++++++---------------
|
|
||||||
spec/bundler/bundler_spec.rb | 38 +++++++++--------------------------
|
|
||||||
spec/bundler/settings_spec.rb | 2 +-
|
|
||||||
3 files changed, 22 insertions(+), 47 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/bundler.rb b/lib/bundler.rb
|
|
||||||
index 2ada6fe7891..b184f7e69c6 100644
|
|
||||||
--- a/lib/bundler.rb
|
|
||||||
+++ b/lib/bundler.rb
|
|
||||||
@@ -170,8 +170,7 @@ def user_home
|
|
||||||
end
|
|
||||||
|
|
||||||
if warning
|
|
||||||
- Kernel.send(:require, "etc")
|
|
||||||
- user_home = tmp_home_path(Etc.getlogin, warning)
|
|
||||||
+ user_home = tmp_home_path(warning)
|
|
||||||
Bundler.ui.warn "#{warning}\nBundler will use `#{user_home}' as your home directory temporarily.\n"
|
|
||||||
user_home
|
|
||||||
else
|
|
||||||
@@ -180,21 +180,6 @@ def user_home
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
- def tmp_home_path(login, warning)
|
|
||||||
- login ||= "unknown"
|
|
||||||
- Kernel.send(:require, "tmpdir")
|
|
||||||
- path = Pathname.new(Dir.tmpdir).join("bundler", "home")
|
|
||||||
- SharedHelpers.filesystem_access(path) do |tmp_home_path|
|
|
||||||
- unless tmp_home_path.exist?
|
|
||||||
- tmp_home_path.mkpath
|
|
||||||
- tmp_home_path.chmod(0o777)
|
|
||||||
- end
|
|
||||||
- tmp_home_path.join(login).tap(&:mkpath)
|
|
||||||
- end
|
|
||||||
- rescue RuntimeError => e
|
|
||||||
- raise e.exception("#{warning}\nBundler also failed to create a temporary home directory at `#{path}':\n#{e}")
|
|
||||||
- end
|
|
||||||
-
|
|
||||||
def user_bundle_path(dir = "home")
|
|
||||||
env_var, fallback = case dir
|
|
||||||
when "home"
|
|
||||||
@@ -555,6 +555,17 @@ def configure_gem_home
|
|
||||||
Bundler.rubygems.clear_paths
|
|
||||||
end
|
|
||||||
|
|
||||||
+ def tmp_home_path(warning)
|
|
||||||
+ Kernel.send(:require, "tmpdir")
|
|
||||||
+ SharedHelpers.filesystem_access(Dir.tmpdir) do
|
|
||||||
+ path = Bundler.tmp
|
|
||||||
+ at_exit { Bundler.rm_rf(path) }
|
|
||||||
+ path
|
|
||||||
+ end
|
|
||||||
+ rescue RuntimeError => e
|
|
||||||
+ raise e.exception("#{warning}\nBundler also failed to create a temporary home directory':\n#{e}")
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
# @param env [Hash]
|
|
||||||
def with_env(env)
|
|
||||||
backup = ENV.to_hash
|
|
||||||
diff --git a/spec/bundler/bundler/bundler_spec.rb b/spec/bundler/bundler/bundler_spec.rb
|
|
||||||
index 74cf7ae05d3..247838600bf 100644
|
|
||||||
--- a/spec/bundler/bundler/bundler_spec.rb
|
|
||||||
+++ b/spec/bundler/bundler/bundler_spec.rb
|
|
||||||
@@ -233,16 +233,13 @@
|
|
||||||
path = "/home/oggy"
|
|
||||||
allow(Bundler.rubygems).to receive(:user_home).and_return(path)
|
|
||||||
allow(File).to receive(:directory?).with(path).and_return false
|
|
||||||
- allow(Etc).to receive(:getlogin).and_return("USER")
|
|
||||||
- allow(Dir).to receive(:tmpdir).and_return("/TMP")
|
|
||||||
- allow(FileTest).to receive(:exist?).with("/TMP/bundler/home").and_return(true)
|
|
||||||
- expect(FileUtils).to receive(:mkpath).with("/TMP/bundler/home/USER")
|
|
||||||
+ allow(Bundler).to receive(:tmp).and_return(Pathname.new("/tmp/trulyrandom"))
|
|
||||||
message = <<EOF
|
|
||||||
`/home/oggy` is not a directory.
|
|
||||||
-Bundler will use `/TMP/bundler/home/USER' as your home directory temporarily.
|
|
||||||
+Bundler will use `/tmp/trulyrandom' as your home directory temporarily.
|
|
||||||
EOF
|
|
||||||
expect(Bundler.ui).to receive(:warn).with(message)
|
|
||||||
- expect(Bundler.user_home).to eq(Pathname("/TMP/bundler/home/USER"))
|
|
||||||
+ expect(Bundler.user_home).to eq(Pathname("/tmp/trulyrandom"))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
@@ -255,16 +252,13 @@
|
|
||||||
allow(File).to receive(:directory?).with(path).and_return true
|
|
||||||
allow(File).to receive(:writable?).with(path).and_return false
|
|
||||||
allow(File).to receive(:directory?).with(dotbundle).and_return false
|
|
||||||
- allow(Etc).to receive(:getlogin).and_return("USER")
|
|
||||||
- allow(Dir).to receive(:tmpdir).and_return("/TMP")
|
|
||||||
- allow(FileTest).to receive(:exist?).with("/TMP/bundler/home").and_return(true)
|
|
||||||
- expect(FileUtils).to receive(:mkpath).with("/TMP/bundler/home/USER")
|
|
||||||
+ allow(Bundler).to receive(:tmp).and_return(Pathname.new("/tmp/trulyrandom"))
|
|
||||||
message = <<EOF
|
|
||||||
`/home/oggy` is not writable.
|
|
||||||
-Bundler will use `/TMP/bundler/home/USER' as your home directory temporarily.
|
|
||||||
+Bundler will use `/tmp/trulyrandom' as your home directory temporarily.
|
|
||||||
EOF
|
|
||||||
expect(Bundler.ui).to receive(:warn).with(message)
|
|
||||||
- expect(Bundler.user_home).to eq(Pathname("/TMP/bundler/home/USER"))
|
|
||||||
+ expect(Bundler.user_home).to eq(Pathname("/tmp/trulyrandom"))
|
|
||||||
end
|
|
||||||
|
|
||||||
context ".bundle exists and have correct permissions" do
|
|
||||||
@@ -283,31 +277,17 @@
|
|
||||||
context "home directory is not set" do
|
|
||||||
it "should issue warning and return a temporary user home" do
|
|
||||||
allow(Bundler.rubygems).to receive(:user_home).and_return(nil)
|
|
||||||
- allow(Etc).to receive(:getlogin).and_return("USER")
|
|
||||||
- allow(Dir).to receive(:tmpdir).and_return("/TMP")
|
|
||||||
- allow(FileTest).to receive(:exist?).with("/TMP/bundler/home").and_return(true)
|
|
||||||
- expect(FileUtils).to receive(:mkpath).with("/TMP/bundler/home/USER")
|
|
||||||
+ allow(Bundler).to receive(:tmp).and_return(Pathname.new("/tmp/trulyrandom"))
|
|
||||||
message = <<EOF
|
|
||||||
Your home directory is not set.
|
|
||||||
-Bundler will use `/TMP/bundler/home/USER' as your home directory temporarily.
|
|
||||||
+Bundler will use `/tmp/trulyrandom' as your home directory temporarily.
|
|
||||||
EOF
|
|
||||||
expect(Bundler.ui).to receive(:warn).with(message)
|
|
||||||
- expect(Bundler.user_home).to eq(Pathname("/TMP/bundler/home/USER"))
|
|
||||||
+ expect(Bundler.user_home).to eq(Pathname("/tmp/trulyrandom"))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
- describe "#tmp_home_path" do
|
|
||||||
- it "should create temporary user home" do
|
|
||||||
- allow(Dir).to receive(:tmpdir).and_return("/TMP")
|
|
||||||
- allow(FileTest).to receive(:exist?).with("/TMP/bundler/home").and_return(false)
|
|
||||||
- expect(FileUtils).to receive(:mkpath).once.ordered.with("/TMP/bundler/home")
|
|
||||||
- expect(FileUtils).to receive(:mkpath).once.ordered.with("/TMP/bundler/home/USER")
|
|
||||||
- expect(File).to receive(:chmod).with(0o777, "/TMP/bundler/home")
|
|
||||||
- expect(Bundler.tmp_home_path("USER", "")).to eq(Pathname("/TMP/bundler/home/USER"))
|
|
||||||
- end
|
|
||||||
- end
|
|
||||||
-
|
|
||||||
describe "#requires_sudo?" do
|
|
||||||
let!(:tmpdir) { Dir.mktmpdir }
|
|
||||||
let(:bundle_path) { Pathname("#{tmpdir}/bundle") }
|
|
||||||
diff --git a/spec/bundler/bundler/settings_spec.rb b/spec/bundler/bundler/settings_spec.rb
|
|
||||||
index 7e1dadded76..2a285fdcf37 100644
|
|
||||||
--- a/spec/bundler/bundler/settings_spec.rb
|
|
||||||
+++ b/spec/bundler/bundler/settings_spec.rb
|
|
||||||
@@ -67,7 +67,7 @@
|
|
||||||
context "when $TMPDIR is not writable" do
|
|
||||||
it "does not raise" do
|
|
||||||
expect(Bundler.rubygems).to receive(:user_home).twice.and_return(nil)
|
|
||||||
- expect(FileUtils).to receive(:mkpath).twice.with(File.join(Dir.tmpdir, "bundler", "home")).and_raise(Errno::EROFS, "Read-only file system @ dir_s_mkdir - /tmp/bundler")
|
|
||||||
+ expect(Bundler).to receive(:tmp).twice.and_raise(Errno::EROFS, "Read-only file system @ dir_s_mkdir - /tmp/bundler")
|
|
||||||
|
|
||||||
expect(subject.send(:global_config_file)).to be_nil
|
|
||||||
end
|
|
|
@ -0,0 +1,41 @@
|
||||||
|
From 5e09d632f3b56d85b2659ab47d5571ae9e270e10 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Xenor Chang <tubaxenor@gmail.com>
|
||||||
|
Date: Mon, 28 Nov 2022 12:34:06 +0800
|
||||||
|
Subject: [PATCH] Loosen the domain regex to accept '.' (#29)
|
||||||
|
|
||||||
|
* Loosen the domain regex to accept '.'
|
||||||
|
|
||||||
|
Co-authored-by: Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
Co-authored-by: Hiroshi SHIBATA <hsbt@ruby-lang.org>
|
||||||
|
---
|
||||||
|
lib/cgi/cookie.rb | 2 +-
|
||||||
|
test/cgi/test_cgi_cookie.rb | 3 +++
|
||||||
|
2 files changed, 4 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/lib/cgi/cookie.rb b/lib/cgi/cookie.rb
|
||||||
|
index 1a9c1a8..9498e2f 100644
|
||||||
|
--- a/lib/cgi/cookie.rb
|
||||||
|
+++ b/lib/cgi/cookie.rb
|
||||||
|
@@ -42,7 +42,7 @@ class Cookie < Array
|
||||||
|
|
||||||
|
TOKEN_RE = %r"\A[[!-~]&&[^()<>@,;:\\\"/?=\[\]{}]]+\z"
|
||||||
|
PATH_VALUE_RE = %r"\A[[ -~]&&[^;]]*\z"
|
||||||
|
- DOMAIN_VALUE_RE = %r"\A(?<label>(?!-)[-A-Za-z0-9]+(?<!-))(?:\.\g<label>)*\z"
|
||||||
|
+ DOMAIN_VALUE_RE = %r"\A\.?(?<label>(?!-)[-A-Za-z0-9]+(?<!-))(?:\.\g<label>)*\z"
|
||||||
|
|
||||||
|
# Create a new CGI::Cookie object.
|
||||||
|
#
|
||||||
|
diff --git a/test/cgi/test_cgi_cookie.rb b/test/cgi/test_cgi_cookie.rb
|
||||||
|
index 6d31932..eadae45 100644
|
||||||
|
--- a/test/cgi/test_cgi_cookie.rb
|
||||||
|
+++ b/test/cgi/test_cgi_cookie.rb
|
||||||
|
@@ -65,6 +65,9 @@ class CGICookieTest < Test::Unit::TestCase
|
||||||
|
cookie = CGI::Cookie.new({'domain' => 'a.example.com'}.merge(h))
|
||||||
|
assert_equal('a.example.com', cookie.domain)
|
||||||
|
|
||||||
|
+ cookie = CGI::Cookie.new(h.merge('domain'=>'.example.com'))
|
||||||
|
+ assert_equal('.example.com', cookie.domain)
|
||||||
|
+
|
||||||
|
cookie = CGI::Cookie.new({'domain'=>'1.example.com'}.merge(h))
|
||||||
|
assert_equal('1.example.com', cookie.domain, 'enhanced by RFC 1123')
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
From c16675582a68800ef17b6056110e0a8bcdb38b55 Mon Sep 17 00:00:00 2001
|
|
||||||
From: SHIBATA Hiroshi <hsbt@ruby-lang.org>
|
|
||||||
Date: Tue, 22 Jan 2019 09:37:23 +0900
|
|
||||||
Subject: [PATCH] Avoid rdoc hook when it's failed to load rdoc library.
|
|
||||||
|
|
||||||
Fixed #2483
|
|
||||||
---
|
|
||||||
lib/rubygems/rdoc.rb | 4 ++--
|
|
||||||
1 file changed, 2 insertions(+), 2 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/rubygems/rdoc.rb b/lib/rubygems/rdoc.rb
|
|
||||||
index dfaf7c55bf..4e16fbb86f 100644
|
|
||||||
--- a/lib/rubygems/rdoc.rb
|
|
||||||
+++ b/lib/rubygems/rdoc.rb
|
|
||||||
@@ -18,7 +18,7 @@
|
|
||||||
module Gem
|
|
||||||
RDoc = ::RDoc::RubygemsHook
|
|
||||||
end
|
|
||||||
+
|
|
||||||
+ Gem.done_installing(&Gem::RDoc.method(:generation_hook))
|
|
||||||
rescue LoadError
|
|
||||||
end
|
|
||||||
-
|
|
||||||
-Gem.done_installing(&Gem::RDoc.method(:generation_hook))
|
|
|
@ -1,88 +0,0 @@
|
||||||
From f4061357d812e9033f07ae3f8f44c4e26839f1e5 Mon Sep 17 00:00:00 2001
|
|
||||||
From: bronzdoc <lsagastume1990@gmail.com>
|
|
||||||
Date: Mon, 14 Jan 2019 09:46:29 -0600
|
|
||||||
Subject: [PATCH] Restore gem build behavior and introdcue the "-C" flag to gem
|
|
||||||
build
|
|
||||||
|
|
||||||
---
|
|
||||||
lib/rubygems/commands/build_command.rb | 41 +++++++++++++------
|
|
||||||
.../test_gem_commands_build_command.rb | 1 +
|
|
||||||
2 files changed, 29 insertions(+), 13 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/lib/rubygems/commands/build_command.rb b/lib/rubygems/commands/build_command.rb
|
|
||||||
index e59471e976..761b80ee94 100644
|
|
||||||
--- a/lib/rubygems/commands/build_command.rb
|
|
||||||
+++ b/lib/rubygems/commands/build_command.rb
|
|
||||||
@@ -18,6 +18,10 @@ def initialize
|
|
||||||
add_option '-o', '--output FILE', 'output gem with the given filename' do |value, options|
|
|
||||||
options[:output] = value
|
|
||||||
end
|
|
||||||
+
|
|
||||||
+ add_option '-C PATH', '', 'Run as if gem build was started in <PATH> instead of the current working directory.' do |value, options|
|
|
||||||
+ options[:build_path] = value
|
|
||||||
+ end
|
|
||||||
end
|
|
||||||
|
|
||||||
def arguments # :nodoc:
|
|
||||||
@@ -60,25 +64,36 @@ def execute
|
|
||||||
end
|
|
||||||
|
|
||||||
if File.exist? gemspec
|
|
||||||
- Dir.chdir(File.dirname(gemspec)) do
|
|
||||||
- spec = Gem::Specification.load File.basename(gemspec)
|
|
||||||
-
|
|
||||||
- if spec
|
|
||||||
- Gem::Package.build(
|
|
||||||
- spec,
|
|
||||||
- options[:force],
|
|
||||||
- options[:strict],
|
|
||||||
- options[:output]
|
|
||||||
- )
|
|
||||||
- else
|
|
||||||
- alert_error "Error loading gemspec. Aborting."
|
|
||||||
- terminate_interaction 1
|
|
||||||
+ spec = Gem::Specification.load(gemspec)
|
|
||||||
+
|
|
||||||
+ if options[:build_path]
|
|
||||||
+ Dir.chdir(File.dirname(gemspec)) do
|
|
||||||
+ spec = Gem::Specification.load File.basename(gemspec)
|
|
||||||
+ build_package(spec)
|
|
||||||
end
|
|
||||||
+ else
|
|
||||||
+ build_package(spec)
|
|
||||||
end
|
|
||||||
+
|
|
||||||
else
|
|
||||||
alert_error "Gemspec file not found: #{gemspec}"
|
|
||||||
terminate_interaction 1
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
+ private
|
|
||||||
+
|
|
||||||
+ def build_package(spec)
|
|
||||||
+ if spec
|
|
||||||
+ Gem::Package.build(
|
|
||||||
+ spec,
|
|
||||||
+ options[:force],
|
|
||||||
+ options[:strict],
|
|
||||||
+ options[:output]
|
|
||||||
+ )
|
|
||||||
+ else
|
|
||||||
+ alert_error "Error loading gemspec. Aborting."
|
|
||||||
+ terminate_interaction 1
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
end
|
|
||||||
diff --git a/test/rubygems/test_gem_commands_build_command.rb b/test/rubygems/test_gem_commands_build_command.rb
|
|
||||||
index ac82a408c7..02d1b98e8f 100644
|
|
||||||
--- a/test/rubygems/test_gem_commands_build_command.rb
|
|
||||||
+++ b/test/rubygems/test_gem_commands_build_command.rb
|
|
||||||
@@ -207,6 +207,7 @@ def test_execute_outside_dir
|
|
||||||
gs.write @gem.to_ruby
|
|
||||||
end
|
|
||||||
|
|
||||||
+ @cmd.options[:build_path] = gemspec_dir
|
|
||||||
@cmd.options[:args] = [gemspec_file]
|
|
||||||
|
|
||||||
use_ui @ui do
|
|
|
@ -9,9 +9,9 @@ module RubyGemsProv
|
||||||
def self.normalize_prerelease(version)
|
def self.normalize_prerelease(version)
|
||||||
if version.prerelease?
|
if version.prerelease?
|
||||||
prerelease = version.version.sub /^#{version.release}\./, ''
|
prerelease = version.version.sub /^#{version.release}\./, ''
|
||||||
"#{version.release}~#{prerelease}"
|
"#{version.release}-0.1.#{prerelease}"
|
||||||
else
|
else
|
||||||
version.release
|
"#{version.release}-1"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -38,32 +38,28 @@ module RubyGemsReq
|
||||||
version == Gem::Version.new(0) ? "" : "#{op} #{version}"
|
version == Gem::Version.new(0) ? "" : "#{op} #{version}"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Compose dependency together with its requirements in RPM rich dependency
|
|
||||||
# string.
|
|
||||||
def self.compose_dependency_string(name, requirements)
|
|
||||||
dependency_strings = requirements.map { |requirement| name + requirement }
|
|
||||||
dependency_string = dependency_strings.join(' with ')
|
|
||||||
dependency_string.prepend('(').concat(')') if dependency_strings.length > 1
|
|
||||||
dependency_string
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
# Report RubyGems dependency, versioned if required.
|
# Report RubyGems dependency, versioned if required.
|
||||||
def self.rubygems_dependency(specification)
|
def self.rubygems_dependency(specification)
|
||||||
dependency_name = "ruby(rubygems)"
|
Helpers::requirement_versions_to_rpm(specification.required_rubygems_version).each do |requirement|
|
||||||
requirements = Helpers::requirement_versions_to_rpm(specification.required_rubygems_version)
|
dependency_string = "ruby(rubygems)"
|
||||||
|
dependency_string += " #{specification.required_rubygems_version}" if requirement&.length > 0
|
||||||
puts Helpers::compose_dependency_string(dependency_name, requirements)
|
puts dependency_string
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Report all gem dependencies including their version.
|
# Report all gem dependencies including their version.
|
||||||
def self.gem_depenencies(specification)
|
def self.gem_depenencies(specification)
|
||||||
specification.runtime_dependencies.each do |dependency|
|
specification.runtime_dependencies.each do |dependency|
|
||||||
dependency_name = "rubygem(#{dependency.name})"
|
dependency_strings = Helpers::requirement_versions_to_rpm(dependency.requirement).map do |requirement|
|
||||||
requirements = Helpers::requirement_versions_to_rpm(dependency.requirement)
|
requirement_string = "rubygem(#{dependency.name})"
|
||||||
|
requirement_string += " #{requirement}" if requirement&.length > 0
|
||||||
puts Helpers::compose_dependency_string(dependency_name, requirements)
|
requirement_string
|
||||||
|
end
|
||||||
|
dependency_string = dependency_strings.join(' with ')
|
||||||
|
dependency_string.prepend('(').concat(')') if dependency_strings.length > 1
|
||||||
|
puts dependency_string
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
498
SPECS/ruby.spec
498
SPECS/ruby.spec
|
@ -1,16 +1,16 @@
|
||||||
%global major_version 2
|
%global major_version 2
|
||||||
%global minor_version 6
|
%global minor_version 5
|
||||||
%global teeny_version 10
|
%global teeny_version 9
|
||||||
%global major_minor_version %{major_version}.%{minor_version}
|
%global major_minor_version %{major_version}.%{minor_version}
|
||||||
|
|
||||||
%global ruby_version %{major_minor_version}.%{teeny_version}
|
%global ruby_version %{major_minor_version}.%{teeny_version}
|
||||||
%global ruby_release %{ruby_version}
|
%global ruby_release %{ruby_version}
|
||||||
|
|
||||||
# Specify the named version. It has precedense to revision.
|
# Specify the named version. It has precedense to revision.
|
||||||
#%%global milestone rc2
|
#%%global milestone rc1
|
||||||
|
|
||||||
# Keep the revision enabled for pre-releases from SVN.
|
# Keep the revision enabled for pre-releases from SVN.
|
||||||
#%%global revision 66252
|
#%%global revision 61414
|
||||||
|
|
||||||
%global ruby_archive %{name}-%{ruby_version}
|
%global ruby_archive %{name}-%{ruby_version}
|
||||||
|
|
||||||
|
@ -21,7 +21,8 @@
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
|
||||||
%global release 109
|
%global release 111
|
||||||
|
|
||||||
%{!?release_string:%global release_string %{?development_release:0.}%{release}%{?development_release:.%{development_release}}%{?dist}}
|
%{!?release_string:%global release_string %{?development_release:0.}%{release}%{?development_release:.%{development_release}}%{?dist}}
|
||||||
|
|
||||||
# The RubyGems library has to stay out of Ruby directory tree, since the
|
# The RubyGems library has to stay out of Ruby directory tree, since the
|
||||||
|
@ -29,28 +30,25 @@
|
||||||
%global rubygems_dir %{_datadir}/rubygems
|
%global rubygems_dir %{_datadir}/rubygems
|
||||||
|
|
||||||
# Bundled libraries versions
|
# Bundled libraries versions
|
||||||
%global rubygems_version 3.0.3.1
|
%global rubygems_version 2.7.6.3
|
||||||
%global rubygems_molinillo_version 0.5.7
|
%global molinillo_version 0.5.7
|
||||||
|
|
||||||
%global bundler_version 1.17.2
|
# TODO: The IRB has strange versioning. Keep the Ruby's versioning ATM.
|
||||||
%global bundler_fileutils_version 1.1.0
|
# http://redmine.ruby-lang.org/issues/5313
|
||||||
%global bundler_molinillo_version 0.6.6
|
%global irb_version %{ruby_version}
|
||||||
%global bundler_net_http_persistent_version 2.9.4
|
|
||||||
%global bundler_thor_version 0.20.0
|
|
||||||
|
|
||||||
%global bigdecimal_version 1.4.1
|
%global bigdecimal_version 1.3.4
|
||||||
%global did_you_mean_version 1.3.0
|
%global did_you_mean_version 1.2.0
|
||||||
%global io_console_version 0.4.7
|
%global io_console_version 0.4.6
|
||||||
%global irb_version 1.0.0
|
|
||||||
%global json_version 2.1.0
|
%global json_version 2.1.0
|
||||||
%global minitest_version 5.11.3
|
%global minitest_version 5.10.3
|
||||||
%global net_telnet_version 0.2.0
|
%global net_telnet_version 0.1.1
|
||||||
%global openssl_version 2.1.2
|
%global openssl_version 2.1.2
|
||||||
%global power_assert_version 1.1.3
|
%global power_assert_version 1.1.1
|
||||||
%global psych_version 3.1.0
|
%global psych_version 3.0.2
|
||||||
%global rake_version 12.3.3
|
%global rake_version 12.3.3
|
||||||
%global rdoc_version 6.1.2.1
|
%global rdoc_version 6.0.1.1
|
||||||
%global test_unit_version 3.2.9
|
%global test_unit_version 3.2.7
|
||||||
%global xmlrpc_version 0.3.0
|
%global xmlrpc_version 0.3.0
|
||||||
|
|
||||||
# Might not be needed in the future, if we are lucky enough.
|
# Might not be needed in the future, if we are lucky enough.
|
||||||
|
@ -65,13 +63,10 @@
|
||||||
%bcond_without rubypick
|
%bcond_without rubypick
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%bcond_without cmake
|
|
||||||
%bcond_without git
|
|
||||||
%bcond_without gmp
|
|
||||||
%bcond_without hostname
|
|
||||||
%bcond_without systemtap
|
%bcond_without systemtap
|
||||||
# Enable the tests requiring internet when building on local.
|
%bcond_without git
|
||||||
%bcond_with bundler_tests
|
%bcond_without cmake
|
||||||
|
%bcond_without gmp
|
||||||
|
|
||||||
%if 0%{?fedora}
|
%if 0%{?fedora}
|
||||||
%bcond_without hardening_test
|
%bcond_without hardening_test
|
||||||
|
@ -81,6 +76,7 @@ Summary: An interpreter of object-oriented scripting language
|
||||||
Name: ruby
|
Name: ruby
|
||||||
Version: %{ruby_version}
|
Version: %{ruby_version}
|
||||||
Release: %{release_string}
|
Release: %{release_string}
|
||||||
|
Group: Development/Languages
|
||||||
# Public Domain for example for: include/ruby/st.h, strftime.c, missing/*, ...
|
# Public Domain for example for: include/ruby/st.h, strftime.c, missing/*, ...
|
||||||
# MIT and CCO: ccan/*
|
# MIT and CCO: ccan/*
|
||||||
# zlib: ext/digest/md5/md5.*, ext/nkf/nkf-utf8/nkf.c
|
# zlib: ext/digest/md5/md5.*, ext/nkf/nkf-utf8/nkf.c
|
||||||
|
@ -132,52 +128,109 @@ Patch5: ruby-1.9.3-mkmf-verbose.patch
|
||||||
# http://bugs.ruby-lang.org/issues/8566
|
# http://bugs.ruby-lang.org/issues/8566
|
||||||
Patch6: ruby-2.1.0-Allow-to-specify-additional-preludes-by-configuratio.patch
|
Patch6: ruby-2.1.0-Allow-to-specify-additional-preludes-by-configuratio.patch
|
||||||
# Use miniruby to regenerate prelude.c.
|
# Use miniruby to regenerate prelude.c.
|
||||||
# https://bugs.ruby-lang.org/issues/15306
|
# https://bugs.ruby-lang.org/issues/10554
|
||||||
Patch7: ruby-2.2.3-Generate-preludes-using-miniruby.patch
|
Patch7: ruby-2.2.3-Generate-preludes-using-miniruby.patch
|
||||||
# Fix a fiddle import test on an optimized glibc on Power 9.
|
# Fix a fiddle import test on an optimized glibc on Power 9.
|
||||||
# https://bugs.ruby-lang.org/issues/12666#note-13
|
# https://bugs.ruby-lang.org/issues/12666#note-13
|
||||||
Patch9: ruby-3.0.3-fiddle-1.0.8-Rely-on-hard-coded-lib-name-to-detect-glibc.patch
|
Patch9: ruby-3.0.3-fiddle-1.0.8-Rely-on-hard-coded-lib-name-to-detect-glibc.patch
|
||||||
# `gem build ../foo.gemspec` changes directory, which does not play well with
|
# Add Gem.operating_system_defaults to allow packagers to override defaults.
|
||||||
# gems unpacked by setup macro.
|
# https://github.com/rubygems/rubygems/pull/2116
|
||||||
# https://github.com/rubygems/rubygems/issues/2587
|
Patch10: ruby-2.5.0-Add-Gem.operating_system_defaults.patch
|
||||||
Patch11: rubygems-3.0.3-Restore-gem-build-behavior-and-introdcue-the-C-flag-to-gem-build.patch
|
# Don't force libraries used to build Ruby to its dependencies.
|
||||||
# This allows to loosen the RDoc dependency again.
|
# https://bugs.ruby-lang.org/issues/14422
|
||||||
# https://github.com/rubygems/rubygems/pull/2604
|
Patch15: ruby-2.6.0-library-options-to-MAINLIBS.patch
|
||||||
Patch12: rubygems-3.0.3-Avoid-rdoc-hook-when-its-failed-to-load-rdoc-library.patch
|
# Do not require C++ compiler.
|
||||||
|
# https://github.com/rubygems/rubygems/pull/2367
|
||||||
|
Patch16: ruby-2.5.1-Avoid-need-of-C++-compiler-to-pass-the-test-suite.patch
|
||||||
|
# Properly harden package using -fstack-protector-strong.
|
||||||
|
# https://bugs.ruby-lang.org/issues/15053
|
||||||
|
Patch24: ruby-2.6.0-configure-fstack-protector-strong.patch
|
||||||
|
# Fix CovScan issues.
|
||||||
|
# https://bugzilla.redhat.com/show_bug.cgi?id=1628592
|
||||||
|
# https://bugs.ruby-lang.org/issues/15116
|
||||||
|
# https://github.com/ruby/ruby/commit/893949167bdb911c7db9fd59de85f288c09741e1
|
||||||
|
Patch25: ruby-2.6.0-Fix-issues-detected-by-code-analysis-tool.patch
|
||||||
|
|
||||||
# Add support for .include directive used by OpenSSL config files.
|
# Add support for .include directive used by OpenSSL config files.
|
||||||
# https://github.com/ruby/openssl/pull/216
|
# https://github.com/ruby/openssl/pull/216
|
||||||
Patch22: ruby-2.6.0-config-support-include-directive.patch
|
Patch22: ruby-2.6.0-config-support-include-directive.patch
|
||||||
|
# Use larger keys to prevent test failures.
|
||||||
|
# https://github.com/ruby/openssl/pull/217
|
||||||
|
Patch23: ruby-2.6.0-use-larger-keys-for-SSL-tests.patch
|
||||||
|
|
||||||
# IO.select on all platforms to wait for input with recvfrom_nonblock
|
|
||||||
# and accept_nonblock
|
|
||||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1719743
|
|
||||||
# https://github.com/ruby/ruby/commit/920b924e5652884064a9529ffbd80d458a46fbc6
|
|
||||||
# https://github.com/ruby/ruby/commit/c1f0daeb6ac5c5414c9a4a58bb778a118006ae1f
|
|
||||||
Patch24: ruby-2.7.0-preview1-IO.select-on-all-platforms-to-wait-for-input-with-recvfr.patch
|
|
||||||
# Use ffi_closure_alloc to avoid segmentation fault by libffi on aarch64.
|
# Use ffi_closure_alloc to avoid segmentation fault by libffi on aarch64.
|
||||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1727832
|
# https://bugzilla.redhat.com/show_bug.cgi?id=1727832
|
||||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1721569
|
# https://bugzilla.redhat.com/show_bug.cgi?id=1721569
|
||||||
# https://github.com/ruby/fiddle/pull/20
|
# https://github.com/ruby/fiddle/pull/20
|
||||||
Patch25: ruby-2.6.3-fiddle-1.0.0-ffi-closure-alloc-default.patch
|
Patch26: ruby-2.6.3-fiddle-1.0.0-ffi-closure-alloc-default.patch
|
||||||
|
# Fix rdoc gzipped javascript pages are not the same across multilib.
|
||||||
|
# https://github.com/ruby/ruby/commit/98c7058bf7b3eab91c62a77cb10b09f6c8ed368e
|
||||||
|
# https://github.com/ruby/rdoc/commit/524a8ffc7efbc10b09234f7ac3f81d30a3f9f65c
|
||||||
|
# https://github.com/ruby/rdoc/commit/2df261bb8a9336438508bba94e22e0f968f88983
|
||||||
|
# https://github.com/ruby/rdoc/commit/8e1916b89ef1d50930c2c863119ddb6ce6c796ed
|
||||||
|
# https://github.com/ruby/rdoc/commit/5a8dc7ce883b24539918c75a460a740943c46970
|
||||||
|
Patch27: ruby-2.6.0-rdoc-6.0.2-fix-different-js-gz-pages-across-multilib.patch
|
||||||
|
# Revert: Stop the error due to openssl 1.1.1h, which causes an error in Ruby 2.5.
|
||||||
|
# https://github.com/ruby/ruby/commit/93e6364a848f00b34647b13063dceb854dfaa11e.
|
||||||
|
Patch28: ruby-2.5.9-revert-stop-the-error-due-to-openssl-1-1-1h.patch
|
||||||
# Resolv::DNS: timeouts if multiple IPv6 name servers are given and address
|
# Resolv::DNS: timeouts if multiple IPv6 name servers are given and address
|
||||||
# contains leading zero
|
# contains leading zero
|
||||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1944227
|
# https://bugzilla.redhat.com/show_bug.cgi?id=1950308
|
||||||
Patch26: ruby-3.0.0-Convert-ip-addresses-to-canonical-form.patch
|
Patch29: ruby-3.0.0-Convert-ip-addresses-to-canonical-form.patch
|
||||||
# rubygem-bundler: Insecure permissions on directory in /tmp/ allows for execution of malicious code
|
# Fix CVE-2021-31799 rdoc: Command injection vulnerability in RDoc.
|
||||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1651826
|
# https://bugzilla.redhat.com/show_bug.cgi?id=1980839
|
||||||
# https://github.com/rubygems/bundler/pull/7416
|
Patch30: ruby-2.6.8-rdoc-6.1.2.1-command-injection-vulnerability.patch
|
||||||
Patch27: rubygem-bundler-2.1.0-dont-use-insecure-temporary-directory-as-home-directory.patch
|
# Fix CVE-2021-32066 StartTLS stripping vulnerability in Net::IMAP.
|
||||||
# Update the location of bundler gemspec to fix `make test-bundler`.
|
# https://bugzilla.redhat.com/show_bug.cgi?id=1980830
|
||||||
# https://github.com/ruby/ruby/commit/8cca079d3be8d07c261baea72529628469938245
|
Patch31: ruby-2.6.8-net-imap-startls-stripping-vulnerability.patch
|
||||||
Patch28: ruby-2.7.0-update-location-of-bundler-gemspec.patch
|
# Fix CVE-2021-31810 FTP PASV command response can cause Net::FTP to connect
|
||||||
# Use ENV["BUNDLE_GEM"] instead of gem command to fix `make test-bundler`.
|
# to arbitrary host.
|
||||||
# https://github.com/rubygems/rubygems/commit/a30484bc3103d0f7eb048d2536436a0424c1d695
|
# https://bugzilla.redhat.com/show_bug.cgi?id=1980825
|
||||||
# https://github.com/ruby/ruby/commit/68ddd4d300e9a88737c4f37af74e1a0312949b2f
|
Patch32: ruby-2.6.8-net-ftp-pasv-can-connect-to-arbitrary-host.patch
|
||||||
Patch29: ruby-2.7.0-bundler-use-bundle-gem-instead-of-gem-command.patch
|
# CVE-2021-41817: Fix by adding a length limit option for methods that parses
|
||||||
# Raise an error or print a warning in dependency confusion cases.
|
# date strings.
|
||||||
# https://github.com/rubygems/rubygems/pull/5029
|
# https://bugzilla.redhat.com/show_bug.cgi?id=2025104
|
||||||
Patch30: ruby-bundler-raise-error-in-dependency-confusion.patch
|
# https://github.com/ruby/date/commit/4f9b8e946ba98f0a1774f8e677baa4a45637ebb3
|
||||||
|
Patch33: ruby-2.6.9-date-2.0.1-parse-length-limit.patch
|
||||||
|
# CVE-2021-41819: CGI::Cookie.parse that no longer decodes cookie names to
|
||||||
|
# prevent spoofing security prefixes in cookie names.
|
||||||
|
# https://bugzilla.redhat.com/show_bug.cgi?id=2026757
|
||||||
|
# https://github.com/ruby/ruby/commit/02c341c9bc5879eae568ed2ba02cf227ed948199
|
||||||
|
# https://github.com/ruby/cgi/commit/84dedc6fbb2a210ec070c35bc607b89003701fa2
|
||||||
|
Patch34: ruby-2.6.9-cgi-0.1.1-cookie-parse-not-decode-names.patch
|
||||||
|
# Fix rdoc nil token parsing
|
||||||
|
# https://github.com/ruby/rdoc/commit/a1631aa98a67112d96ac101c72909fdeec6f84f9
|
||||||
|
Patch35: ruby-2.6.0-rdoc-6.0.2-check-nil-text-token.patch
|
||||||
|
# Fix Time Zone Database 2022g.
|
||||||
|
# https://bugs.ruby-lang.org/issues/19187
|
||||||
|
# https://github.com/ruby/ruby/commit/a1124dc162810f86cb0bff58cde24064cfc561bc
|
||||||
|
Patch36: ruby-3.1.3-Fix-for-tzdata-2022g.patch
|
||||||
|
# Bypass git submodule test failure on Git >= 2.38.1.
|
||||||
|
# https://github.com/ruby/ruby/pull/6587
|
||||||
|
Patch37: ruby-3.2.0-git-2.38.1-fix-rubygems-test.patch
|
||||||
|
# CVE-2021-33621: HTTP response splitting in CGI.
|
||||||
|
# Backported from:
|
||||||
|
# https://github.com/ruby/ruby/commit/7cf697179dab52b0d024543304f4d3ab5fa5e847
|
||||||
|
Patch38: ruby-2.7.7-Fix-CVE-2021-33621-HTTP-response-splitting-in-CGI.patch
|
||||||
|
# Let cookies use leading dot in the domain after fixing CVE-2021-33621
|
||||||
|
# to retain compatibility.
|
||||||
|
# https://github.com/ruby/cgi/commit/5e09d632f3b56d85b2659ab47d5571ae9e270e10
|
||||||
|
Patch39: rubygem-cgi-0.3.6-Loosen-the-domain-regex-to-accept-dot.patch
|
||||||
|
# CVE-2022-28739: Buffer overrun in String-to-Float conversion.
|
||||||
|
# Backported from:
|
||||||
|
# https://github.com/ruby/ruby/commit/69f9992ed41920389d4185141a14f02f89a4d306
|
||||||
|
Patch40: ruby-2.6.10-Fix-CVE-2022-28739-Buffer-overrun-in-str2float.patch
|
||||||
|
# CVE-2023-28755 ReDoS vulnerability in URI.
|
||||||
|
# Backported from:
|
||||||
|
# https://github.com/ruby/ruby/commit/6855779d580358a6a0b4c9ee06f20e7cae72955a
|
||||||
|
Patch41: ruby-2.7.8-Fix-CVE-2023-28755-ReDos-vulnerability-in-URI.patch
|
||||||
|
# CVE-2023-28756 ReDoS vulnerability in Time.
|
||||||
|
# Tests not included as assert_linear_time was introduced in Ruby 2.7.
|
||||||
|
# Backported from:
|
||||||
|
# https://github.com/ruby/ruby/commit/2cb830602f52e7e76c6781115e7938b21f881c4f
|
||||||
|
# https://github.com/ruby/ruby/commit/e3f18f7d2e034f20053d7bf2fc7a50f8b7e1a27a
|
||||||
|
Patch42: ruby-2.7.8-Fix-CVE-2023-28756-ReDoS-vulnerability-in-Time.patch
|
||||||
|
|
||||||
|
|
||||||
Requires: %{name}-libs%{?_isa} = %{version}-%{release}
|
Requires: %{name}-libs%{?_isa} = %{version}-%{release}
|
||||||
Suggests: rubypick
|
Suggests: rubypick
|
||||||
|
@ -201,7 +254,6 @@ BuildRequires: procps
|
||||||
%{?with_cmake:BuildRequires: %{_bindir}/cmake}
|
%{?with_cmake:BuildRequires: %{_bindir}/cmake}
|
||||||
# Required to test hardening.
|
# Required to test hardening.
|
||||||
%{?with_hardening_test:BuildRequires: %{_bindir}/checksec}
|
%{?with_hardening_test:BuildRequires: %{_bindir}/checksec}
|
||||||
%{?with_hostname:BuildRequires: %{_bindir}/hostname}
|
|
||||||
BuildRequires: multilib-rpm-config
|
BuildRequires: multilib-rpm-config
|
||||||
BuildRequires: gcc
|
BuildRequires: gcc
|
||||||
BuildRequires: zlib-devel
|
BuildRequires: zlib-devel
|
||||||
|
@ -219,6 +271,7 @@ straight-forward, and extensible.
|
||||||
|
|
||||||
%package devel
|
%package devel
|
||||||
Summary: A Ruby development environment
|
Summary: A Ruby development environment
|
||||||
|
Group: Development/Languages
|
||||||
Requires: %{name}%{?_isa} = %{version}-%{release}
|
Requires: %{name}%{?_isa} = %{version}-%{release}
|
||||||
# This would not be needed if ~50 packages depending on -devel used
|
# This would not be needed if ~50 packages depending on -devel used
|
||||||
# --disable-gems
|
# --disable-gems
|
||||||
|
@ -230,6 +283,7 @@ Ruby or an application embedding Ruby.
|
||||||
|
|
||||||
%package libs
|
%package libs
|
||||||
Summary: Libraries necessary to run Ruby
|
Summary: Libraries necessary to run Ruby
|
||||||
|
Group: Development/Libraries
|
||||||
License: Ruby or BSD
|
License: Ruby or BSD
|
||||||
Provides: ruby(release) = %{ruby_release}
|
Provides: ruby(release) = %{ruby_release}
|
||||||
|
|
||||||
|
@ -255,6 +309,7 @@ This package includes the libruby, necessary to run Ruby.
|
||||||
%package -n rubygems
|
%package -n rubygems
|
||||||
Summary: The Ruby standard for packaging ruby libraries
|
Summary: The Ruby standard for packaging ruby libraries
|
||||||
Version: %{rubygems_version}
|
Version: %{rubygems_version}
|
||||||
|
Group: Development/Libraries
|
||||||
License: Ruby or MIT
|
License: Ruby or MIT
|
||||||
Requires: ruby(release)
|
Requires: ruby(release)
|
||||||
Recommends: rubygem(rdoc) >= %{rdoc_version}
|
Recommends: rubygem(rdoc) >= %{rdoc_version}
|
||||||
|
@ -264,7 +319,7 @@ Requires: rubygem(psych) >= %{psych_version}
|
||||||
Provides: gem = %{version}-%{release}
|
Provides: gem = %{version}-%{release}
|
||||||
Provides: ruby(rubygems) = %{version}-%{release}
|
Provides: ruby(rubygems) = %{version}-%{release}
|
||||||
# https://github.com/rubygems/rubygems/pull/1189#issuecomment-121600910
|
# https://github.com/rubygems/rubygems/pull/1189#issuecomment-121600910
|
||||||
Provides: bundled(rubygem-molinillo) = %{rubygems_molinillo_version}
|
Provides: bundled(rubygem-molinillo) = %{molinillo_version}
|
||||||
BuildArch: noarch
|
BuildArch: noarch
|
||||||
|
|
||||||
%description -n rubygems
|
%description -n rubygems
|
||||||
|
@ -275,6 +330,7 @@ libraries.
|
||||||
%package -n rubygems-devel
|
%package -n rubygems-devel
|
||||||
Summary: Macros and development tools for packaging RubyGems
|
Summary: Macros and development tools for packaging RubyGems
|
||||||
Version: %{rubygems_version}
|
Version: %{rubygems_version}
|
||||||
|
Group: Development/Libraries
|
||||||
License: Ruby or MIT
|
License: Ruby or MIT
|
||||||
Requires: ruby(rubygems) = %{version}-%{release}
|
Requires: ruby(rubygems) = %{version}-%{release}
|
||||||
# Needed for RDoc documentation format generation.
|
# Needed for RDoc documentation format generation.
|
||||||
|
@ -289,6 +345,7 @@ Macros and development tools for packaging RubyGems.
|
||||||
%package -n rubygem-rake
|
%package -n rubygem-rake
|
||||||
Summary: Ruby based make-like utility
|
Summary: Ruby based make-like utility
|
||||||
Version: %{rake_version}
|
Version: %{rake_version}
|
||||||
|
Group: Development/Libraries
|
||||||
License: MIT
|
License: MIT
|
||||||
Requires: ruby(release)
|
Requires: ruby(release)
|
||||||
Requires: ruby(rubygems) >= %{rubygems_version}
|
Requires: ruby(rubygems) >= %{rubygems_version}
|
||||||
|
@ -301,20 +358,16 @@ Rake is a Make-like program implemented in Ruby. Tasks and dependencies are
|
||||||
specified in standard Ruby syntax.
|
specified in standard Ruby syntax.
|
||||||
|
|
||||||
|
|
||||||
%package -n rubygem-irb
|
%package irb
|
||||||
Summary: The Interactive Ruby
|
Summary: The Interactive Ruby
|
||||||
Version: %{irb_version}
|
Version: %{irb_version}
|
||||||
Requires: ruby(release)
|
Group: Development/Libraries
|
||||||
Requires: ruby(rubygems) >= %{rubygems_version}
|
Requires: %{name}-libs = %{ruby_version}
|
||||||
Provides: irb = %{version}-%{release}
|
Provides: irb = %{version}-%{release}
|
||||||
Provides: rubygem(irb) = %{version}-%{release}
|
Provides: ruby(irb) = %{version}-%{release}
|
||||||
# Obsoleted by Ruby 2.6 in F30 timeframe.
|
|
||||||
Provides: ruby(irb) = %{ruby_version}-%{release}
|
|
||||||
Provides: ruby-irb = %{ruby_version}-%{release}
|
|
||||||
Obsoletes: ruby-irb < %{ruby_version}-%{release}
|
|
||||||
BuildArch: noarch
|
BuildArch: noarch
|
||||||
|
|
||||||
%description -n rubygem-irb
|
%description irb
|
||||||
The irb is acronym for Interactive Ruby. It evaluates ruby expression
|
The irb is acronym for Interactive Ruby. It evaluates ruby expression
|
||||||
from the terminal.
|
from the terminal.
|
||||||
|
|
||||||
|
@ -322,11 +375,12 @@ from the terminal.
|
||||||
%package -n rubygem-rdoc
|
%package -n rubygem-rdoc
|
||||||
Summary: A tool to generate HTML and command-line documentation for Ruby projects
|
Summary: A tool to generate HTML and command-line documentation for Ruby projects
|
||||||
Version: %{rdoc_version}
|
Version: %{rdoc_version}
|
||||||
|
Group: Development/Libraries
|
||||||
# SIL: lib/rdoc/generator/template/darkfish/css/fonts.css
|
# SIL: lib/rdoc/generator/template/darkfish/css/fonts.css
|
||||||
License: GPLv2 and Ruby and MIT and OFL
|
License: GPLv2 and Ruby and MIT and OFL
|
||||||
Requires: ruby(release)
|
Requires: ruby(release)
|
||||||
Requires: ruby(rubygems) >= %{rubygems_version}
|
Requires: ruby(rubygems) >= %{rubygems_version}
|
||||||
Requires: rubygem(irb) >= %{irb_version}
|
Requires: ruby(irb) = %{irb_version}
|
||||||
Requires: rubygem(io-console) >= %{io_console_version}
|
Requires: rubygem(io-console) >= %{io_console_version}
|
||||||
Requires: rubygem(json) >= %{json_version}
|
Requires: rubygem(json) >= %{json_version}
|
||||||
Provides: rdoc = %{version}-%{release}
|
Provides: rdoc = %{version}-%{release}
|
||||||
|
@ -342,6 +396,7 @@ documentation.
|
||||||
|
|
||||||
%package doc
|
%package doc
|
||||||
Summary: Documentation for %{name}
|
Summary: Documentation for %{name}
|
||||||
|
Group: Documentation
|
||||||
Requires: %{_bindir}/ri
|
Requires: %{_bindir}/ri
|
||||||
BuildArch: noarch
|
BuildArch: noarch
|
||||||
|
|
||||||
|
@ -352,6 +407,7 @@ This package contains documentation for %{name}.
|
||||||
%package -n rubygem-bigdecimal
|
%package -n rubygem-bigdecimal
|
||||||
Summary: BigDecimal provides arbitrary-precision floating point decimal arithmetic
|
Summary: BigDecimal provides arbitrary-precision floating point decimal arithmetic
|
||||||
Version: %{bigdecimal_version}
|
Version: %{bigdecimal_version}
|
||||||
|
Group: Development/Libraries
|
||||||
License: Ruby or BSD
|
License: Ruby or BSD
|
||||||
Requires: ruby(release)
|
Requires: ruby(release)
|
||||||
Requires: ruby(rubygems) >= %{rubygems_version}
|
Requires: ruby(rubygems) >= %{rubygems_version}
|
||||||
|
@ -373,6 +429,7 @@ conversion between base 10 and base 2.
|
||||||
%package -n rubygem-did_you_mean
|
%package -n rubygem-did_you_mean
|
||||||
Summary: "Did you mean?" experience in Ruby
|
Summary: "Did you mean?" experience in Ruby
|
||||||
Version: %{did_you_mean_version}
|
Version: %{did_you_mean_version}
|
||||||
|
Group: Development/Libraries
|
||||||
License: MIT
|
License: MIT
|
||||||
Requires: ruby(release)
|
Requires: ruby(release)
|
||||||
Requires: ruby(rubygems) >= %{rubygems_version}
|
Requires: ruby(rubygems) >= %{rubygems_version}
|
||||||
|
@ -387,6 +444,7 @@ one when you misspelled something.
|
||||||
%package -n rubygem-io-console
|
%package -n rubygem-io-console
|
||||||
Summary: IO/Console is a simple console utilizing library
|
Summary: IO/Console is a simple console utilizing library
|
||||||
Version: %{io_console_version}
|
Version: %{io_console_version}
|
||||||
|
Group: Development/Libraries
|
||||||
Requires: ruby(release)
|
Requires: ruby(release)
|
||||||
Requires: ruby(rubygems) >= %{rubygems_version}
|
Requires: ruby(rubygems) >= %{rubygems_version}
|
||||||
Provides: rubygem(io-console) = %{version}-%{release}
|
Provides: rubygem(io-console) = %{version}-%{release}
|
||||||
|
@ -399,6 +457,7 @@ provide higher layer features, such like curses and readline.
|
||||||
%package -n rubygem-json
|
%package -n rubygem-json
|
||||||
Summary: This is a JSON implementation as a Ruby extension in C
|
Summary: This is a JSON implementation as a Ruby extension in C
|
||||||
Version: %{json_version}
|
Version: %{json_version}
|
||||||
|
Group: Development/Libraries
|
||||||
# UCD: ext/json/generator/generator.c
|
# UCD: ext/json/generator/generator.c
|
||||||
License: (Ruby or GPLv2) and UCD
|
License: (Ruby or GPLv2) and UCD
|
||||||
Requires: ruby(release)
|
Requires: ruby(release)
|
||||||
|
@ -415,6 +474,7 @@ markup language.
|
||||||
%package -n rubygem-minitest
|
%package -n rubygem-minitest
|
||||||
Summary: Minitest provides a complete suite of testing facilities
|
Summary: Minitest provides a complete suite of testing facilities
|
||||||
Version: %{minitest_version}
|
Version: %{minitest_version}
|
||||||
|
Group: Development/Libraries
|
||||||
License: MIT
|
License: MIT
|
||||||
Requires: ruby(release)
|
Requires: ruby(release)
|
||||||
Requires: ruby(rubygems) >= %{rubygems_version}
|
Requires: ruby(rubygems) >= %{rubygems_version}
|
||||||
|
@ -439,6 +499,7 @@ output.
|
||||||
%package -n rubygem-openssl
|
%package -n rubygem-openssl
|
||||||
Summary: OpenSSL provides SSL, TLS and general purpose cryptography
|
Summary: OpenSSL provides SSL, TLS and general purpose cryptography
|
||||||
Version: %{openssl_version}
|
Version: %{openssl_version}
|
||||||
|
Group: Development/Libraries
|
||||||
License: Ruby or BSD
|
License: Ruby or BSD
|
||||||
Requires: ruby(release)
|
Requires: ruby(release)
|
||||||
Requires: ruby(rubygems) >= %{rubygems_version}
|
Requires: ruby(rubygems) >= %{rubygems_version}
|
||||||
|
@ -452,6 +513,7 @@ OpenSSL library.
|
||||||
%package -n rubygem-power_assert
|
%package -n rubygem-power_assert
|
||||||
Summary: Power Assert for Ruby
|
Summary: Power Assert for Ruby
|
||||||
Version: %{power_assert_version}
|
Version: %{power_assert_version}
|
||||||
|
Group: Development/Libraries
|
||||||
License: Ruby or BSD
|
License: Ruby or BSD
|
||||||
Requires: ruby(release)
|
Requires: ruby(release)
|
||||||
Requires: ruby(rubygems) >= %{rubygems_version}
|
Requires: ruby(rubygems) >= %{rubygems_version}
|
||||||
|
@ -467,6 +529,7 @@ condition is not satisfied.
|
||||||
%package -n rubygem-psych
|
%package -n rubygem-psych
|
||||||
Summary: A libyaml wrapper for Ruby
|
Summary: A libyaml wrapper for Ruby
|
||||||
Version: %{psych_version}
|
Version: %{psych_version}
|
||||||
|
Group: Development/Libraries
|
||||||
License: MIT
|
License: MIT
|
||||||
Requires: ruby(release)
|
Requires: ruby(release)
|
||||||
Requires: ruby(rubygems) >= %{rubygems_version}
|
Requires: ruby(rubygems) >= %{rubygems_version}
|
||||||
|
@ -482,6 +545,7 @@ serialize and de-serialize most Ruby objects to and from the YAML format.
|
||||||
%package -n rubygem-net-telnet
|
%package -n rubygem-net-telnet
|
||||||
Summary: Provides telnet client functionality
|
Summary: Provides telnet client functionality
|
||||||
Version: %{net_telnet_version}
|
Version: %{net_telnet_version}
|
||||||
|
Group: Development/Libraries
|
||||||
Requires: ruby(release)
|
Requires: ruby(release)
|
||||||
Requires: ruby(rubygems) >= %{rubygems_version}
|
Requires: ruby(rubygems) >= %{rubygems_version}
|
||||||
Provides: rubygem(net-telnet) = %{version}-%{release}
|
Provides: rubygem(net-telnet) = %{version}-%{release}
|
||||||
|
@ -501,6 +565,7 @@ the output through preprocess() to extract telnet command sequences.
|
||||||
%package -n rubygem-test-unit
|
%package -n rubygem-test-unit
|
||||||
Summary: An xUnit family unit testing framework for Ruby
|
Summary: An xUnit family unit testing framework for Ruby
|
||||||
Version: %{test_unit_version}
|
Version: %{test_unit_version}
|
||||||
|
Group: Development/Libraries
|
||||||
# lib/test/unit/diff.rb is a double license of the Ruby license and PSF license.
|
# lib/test/unit/diff.rb is a double license of the Ruby license and PSF license.
|
||||||
# lib/test-unit.rb is a dual license of the Ruby license and LGPLv2.1 or later.
|
# lib/test-unit.rb is a dual license of the Ruby license and LGPLv2.1 or later.
|
||||||
License: (Ruby or BSD) and (Ruby or BSD or Python) and (Ruby or BSD or LGPLv2+)
|
License: (Ruby or BSD) and (Ruby or BSD or Python) and (Ruby or BSD or LGPLv2+)
|
||||||
|
@ -520,6 +585,7 @@ writing tests, checking results and automated testing in Ruby.
|
||||||
%package -n rubygem-xmlrpc
|
%package -n rubygem-xmlrpc
|
||||||
Summary: XMLRPC is a lightweight protocol that enables remote procedure calls over HTTP
|
Summary: XMLRPC is a lightweight protocol that enables remote procedure calls over HTTP
|
||||||
Version: %{xmlrpc_version}
|
Version: %{xmlrpc_version}
|
||||||
|
Group: Development/Libraries
|
||||||
License: Ruby or BSD
|
License: Ruby or BSD
|
||||||
Requires: ruby(release)
|
Requires: ruby(release)
|
||||||
Requires: ruby(rubygems) >= %{rubygems_version}
|
Requires: ruby(rubygems) >= %{rubygems_version}
|
||||||
|
@ -531,26 +597,6 @@ XMLRPC is a lightweight protocol that enables remote procedure calls over
|
||||||
HTTP.
|
HTTP.
|
||||||
|
|
||||||
|
|
||||||
%package -n rubygem-bundler
|
|
||||||
Summary: Library and utilities to manage a Ruby application's gem dependencies
|
|
||||||
Version: %{bundler_version}
|
|
||||||
License: MIT
|
|
||||||
Requires: ruby(release)
|
|
||||||
Requires: ruby(rubygems) >= %{rubygems_version}
|
|
||||||
Requires: rubygem(io-console)
|
|
||||||
Provides: rubygem(bundler) = %{version}-%{release}
|
|
||||||
# https://github.com/bundler/bundler/issues/3647
|
|
||||||
Provides: bundled(rubygem-fileutils) = %{bundler_fileutils_version}
|
|
||||||
Provides: bundled(rubygem-molinillo) = %{bundler_molinillo_version}
|
|
||||||
Provides: bundled(rubygem-net-http-persisntent) = %{bundler_net_http_persistent_version}
|
|
||||||
Provides: bundled(rubygem-thor) = %{bundler_thor_version}
|
|
||||||
BuildArch: noarch
|
|
||||||
|
|
||||||
%description -n rubygem-bundler
|
|
||||||
Bundler manages an application's dependencies through its entire life, across
|
|
||||||
many machines, systematically and repeatably.
|
|
||||||
|
|
||||||
|
|
||||||
%prep
|
%prep
|
||||||
%setup -q -n %{ruby_archive}
|
%setup -q -n %{ruby_archive}
|
||||||
|
|
||||||
|
@ -558,6 +604,12 @@ many machines, systematically and repeatably.
|
||||||
rm -rf ext/psych/yaml
|
rm -rf ext/psych/yaml
|
||||||
rm -rf ext/fiddle/libffi*
|
rm -rf ext/fiddle/libffi*
|
||||||
|
|
||||||
|
# Remove file with non-commercial license
|
||||||
|
# https://bugzilla.redhat.com/show_bug.cgi?id=1846113
|
||||||
|
sed -i 's/"evaluation\/incorrect_words.yaml"\.freeze, //' \
|
||||||
|
gems/did_you_mean-1.2.0/did_you_mean.gemspec
|
||||||
|
|
||||||
|
|
||||||
%patch0 -p1
|
%patch0 -p1
|
||||||
%patch1 -p1
|
%patch1 -p1
|
||||||
%patch2 -p1
|
%patch2 -p1
|
||||||
|
@ -567,14 +619,30 @@ rm -rf ext/fiddle/libffi*
|
||||||
%patch6 -p1
|
%patch6 -p1
|
||||||
%patch7 -p1
|
%patch7 -p1
|
||||||
%patch9 -p1
|
%patch9 -p1
|
||||||
%patch11 -p1
|
%patch10 -p1
|
||||||
%patch12 -p1
|
%patch15 -p1
|
||||||
|
%patch16 -p1
|
||||||
%patch22 -p1
|
%patch22 -p1
|
||||||
|
%patch23 -p1
|
||||||
%patch24 -p1
|
%patch24 -p1
|
||||||
%patch25 -p1
|
%patch25 -p1
|
||||||
%patch26 -p1
|
%patch26 -p1
|
||||||
%patch27 -p1
|
%patch27 -p1
|
||||||
|
%patch28 -p1 -R
|
||||||
|
%patch29 -p1
|
||||||
%patch30 -p1
|
%patch30 -p1
|
||||||
|
%patch31 -p1
|
||||||
|
%patch32 -p1
|
||||||
|
%patch33 -p1
|
||||||
|
%patch34 -p1
|
||||||
|
%patch35 -p1
|
||||||
|
%patch36 -p1
|
||||||
|
%patch37 -p1
|
||||||
|
%patch38 -p1
|
||||||
|
%patch39 -p1
|
||||||
|
%patch40 -p1
|
||||||
|
%patch41 -p1
|
||||||
|
%patch42 -p1
|
||||||
|
|
||||||
# Provide an example of usage of the tapset:
|
# Provide an example of usage of the tapset:
|
||||||
cp -a %{SOURCE3} .
|
cp -a %{SOURCE3} .
|
||||||
|
@ -619,9 +687,6 @@ make install DESTDIR=%{buildroot}
|
||||||
# Rename ruby/config.h to ruby/config-<arch>.h to avoid file conflicts on
|
# Rename ruby/config.h to ruby/config-<arch>.h to avoid file conflicts on
|
||||||
# multilib systems and install config.h wrapper
|
# multilib systems and install config.h wrapper
|
||||||
%multilib_fix_c_header --file %{_includedir}/%{name}/config.h
|
%multilib_fix_c_header --file %{_includedir}/%{name}/config.h
|
||||||
# TODO: The correct patch should be %%{_includedir}/%%{name}/rb_mjit_min_header-%{ruby_version}.h
|
|
||||||
# https://bugs.ruby-lang.org/issues/15425
|
|
||||||
%multilib_fix_c_header --file %{_includedir}/rb_mjit_min_header-%{ruby_version}.h
|
|
||||||
|
|
||||||
# Rename the ruby executable. It is replaced by RubyPick.
|
# Rename the ruby executable. It is replaced by RubyPick.
|
||||||
%{?with_rubypick:mv %{buildroot}%{_bindir}/%{name}{,-mri}}
|
%{?with_rubypick:mv %{buildroot}%{_bindir}/%{name}{,-mri}}
|
||||||
|
@ -631,26 +696,16 @@ make install DESTDIR=%{buildroot}
|
||||||
sed -i 's/Version: \${ruby_version}/Version: %{ruby_version}/' %{buildroot}%{_libdir}/pkgconfig/%{name}.pc
|
sed -i 's/Version: \${ruby_version}/Version: %{ruby_version}/' %{buildroot}%{_libdir}/pkgconfig/%{name}.pc
|
||||||
|
|
||||||
# Kill bundled certificates, as they should be part of ca-certificates.
|
# Kill bundled certificates, as they should be part of ca-certificates.
|
||||||
# bundler
|
# This can fail because certificates can be in the same directory.
|
||||||
for cert in \
|
for cert in \
|
||||||
rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem \
|
rubygems.org/GlobalSignRootCA.pem \
|
||||||
rubygems.org/AddTrustExternalCARoot.pem \
|
rubygems.org/GlobalSignRootCA_R3.pem
|
||||||
index.rubygems.org/GlobalSignRootCA.pem
|
|
||||||
do
|
do
|
||||||
rm %{buildroot}%{ruby_libdir}/bundler/ssl_certs/$cert
|
rm %{buildroot}%{rubygems_dir}/rubygems/ssl_certs/$cert ||:
|
||||||
rm -r $(dirname %{buildroot}%{ruby_libdir}/bundler/ssl_certs/$cert)
|
rm -r $(dirname %{buildroot}%{rubygems_dir}/rubygems/ssl_certs/$cert) ||:
|
||||||
done
|
|
||||||
|
|
||||||
for cert in \
|
|
||||||
rubygems.org/GlobalSignRootCA.pem
|
|
||||||
do
|
|
||||||
rm %{buildroot}%{rubygems_dir}/rubygems/ssl_certs/$cert
|
|
||||||
rm -r $(dirname %{buildroot}%{rubygems_dir}/rubygems/ssl_certs/$cert)
|
|
||||||
done
|
done
|
||||||
# Ensure there is not forgotten any certificate.
|
# Ensure there is not forgotten any certificate.
|
||||||
test ! "$(ls -A %{buildroot}%{rubygems_dir}/rubygems/ssl_certs/ 2>/dev/null)"
|
test ! "$(ls -A %{buildroot}%{rubygems_dir}/rubygems/ssl_certs/ 2>/dev/null)"
|
||||||
test "$(ls -A %{buildroot}%{ruby_libdir}/bundler/ssl_certs/ 2>/dev/null)" \
|
|
||||||
= "certificate_manager.rb"
|
|
||||||
|
|
||||||
# Move macros file into proper place and replace the %%{name} macro, since it
|
# Move macros file into proper place and replace the %%{name} macro, since it
|
||||||
# would be wrongly evaluated during build of other packages.
|
# would be wrongly evaluated during build of other packages.
|
||||||
|
@ -682,38 +737,17 @@ mkdir -p %{buildroot}%{_exec_prefix}/lib{,64}/gems/%{name}
|
||||||
|
|
||||||
# Move bundled rubygems to %%gem_dir and %%gem_extdir_mri
|
# Move bundled rubygems to %%gem_dir and %%gem_extdir_mri
|
||||||
# make symlinks for io-console and bigdecimal, which are considered to be part of stdlib by other Gems
|
# make symlinks for io-console and bigdecimal, which are considered to be part of stdlib by other Gems
|
||||||
mkdir -p %{buildroot}%{gem_dir}/gems/irb-%{irb_version}/lib
|
|
||||||
mv %{buildroot}%{ruby_libdir}/irb* %{buildroot}%{gem_dir}/gems/irb-%{irb_version}/lib
|
|
||||||
mv %{buildroot}%{gem_dir}/specifications/default/irb-%{irb_version}.gemspec %{buildroot}%{gem_dir}/specifications
|
|
||||||
ln -s %{gem_dir}/gems/irb-%{irb_version}/lib/irb.rb %{buildroot}%{ruby_libdir}/irb.rb
|
|
||||||
# TODO: This should be possible to replaced by simple directory symlink
|
|
||||||
# after ~ F31 EOL (rhbz#1691039).
|
|
||||||
mkdir -p %{buildroot}%{ruby_libdir}/irb
|
|
||||||
pushd %{buildroot}%{gem_dir}/gems/irb-%{irb_version}/lib
|
|
||||||
find irb -type d -mindepth 1 -exec mkdir %{buildroot}%{ruby_libdir}/'{}' \;
|
|
||||||
find irb -type f -exec ln -s %{gem_dir}/gems/irb-%{irb_version}/lib/'{}' %{buildroot}%{ruby_libdir}/'{}' \;
|
|
||||||
popd
|
|
||||||
|
|
||||||
mkdir -p %{buildroot}%{gem_dir}/gems/rdoc-%{rdoc_version}/lib
|
mkdir -p %{buildroot}%{gem_dir}/gems/rdoc-%{rdoc_version}/lib
|
||||||
mv %{buildroot}%{ruby_libdir}/rdoc* %{buildroot}%{gem_dir}/gems/rdoc-%{rdoc_version}/lib
|
mv %{buildroot}%{ruby_libdir}/rdoc* %{buildroot}%{gem_dir}/gems/rdoc-%{rdoc_version}/lib
|
||||||
mv %{buildroot}%{gem_dir}/specifications/default/rdoc-%{rdoc_version}.gemspec %{buildroot}%{gem_dir}/specifications
|
mv %{buildroot}%{gem_dir}/specifications/default/rdoc-%{rdoc_version}.gemspec %{buildroot}%{gem_dir}/specifications
|
||||||
|
|
||||||
mkdir -p %{buildroot}%{gem_dir}/gems/bigdecimal-%{bigdecimal_version}/lib
|
mkdir -p %{buildroot}%{gem_dir}/gems/bigdecimal-%{bigdecimal_version}/lib
|
||||||
mkdir -p %{buildroot}%{_libdir}/gems/%{name}/bigdecimal-%{bigdecimal_version}/bigdecimal
|
mkdir -p %{buildroot}%{_libdir}/gems/%{name}/bigdecimal-%{bigdecimal_version}
|
||||||
mv %{buildroot}%{ruby_libdir}/bigdecimal %{buildroot}%{gem_dir}/gems/bigdecimal-%{bigdecimal_version}/lib
|
mv %{buildroot}%{ruby_libdir}/bigdecimal %{buildroot}%{gem_dir}/gems/bigdecimal-%{bigdecimal_version}/lib
|
||||||
mv %{buildroot}%{ruby_libarchdir}/bigdecimal.so %{buildroot}%{_libdir}/gems/%{name}/bigdecimal-%{bigdecimal_version}
|
mv %{buildroot}%{ruby_libarchdir}/bigdecimal.so %{buildroot}%{_libdir}/gems/%{name}/bigdecimal-%{bigdecimal_version}
|
||||||
mv %{buildroot}%{ruby_libarchdir}/bigdecimal/util.so %{buildroot}%{_libdir}/gems/%{name}/bigdecimal-%{bigdecimal_version}/bigdecimal
|
|
||||||
mv %{buildroot}%{gem_dir}/specifications/default/bigdecimal-%{bigdecimal_version}.gemspec %{buildroot}%{gem_dir}/specifications
|
mv %{buildroot}%{gem_dir}/specifications/default/bigdecimal-%{bigdecimal_version}.gemspec %{buildroot}%{gem_dir}/specifications
|
||||||
ln -s %{gem_dir}/gems/bigdecimal-%{bigdecimal_version}/lib/bigdecimal %{buildroot}%{ruby_libdir}/bigdecimal
|
ln -s %{gem_dir}/gems/bigdecimal-%{bigdecimal_version}/lib/bigdecimal %{buildroot}%{ruby_libdir}/bigdecimal
|
||||||
ln -s %{_libdir}/gems/%{name}/bigdecimal-%{bigdecimal_version}/bigdecimal.so %{buildroot}%{ruby_libarchdir}/bigdecimal.so
|
ln -s %{_libdir}/gems/%{name}/bigdecimal-%{bigdecimal_version}/bigdecimal.so %{buildroot}%{ruby_libarchdir}/bigdecimal.so
|
||||||
ln -s %{_libdir}/gems/%{name}/bigdecimal-%{bigdecimal_version}/bigdecimal/util.so %{buildroot}%{ruby_libarchdir}/bigdecimal/util.so
|
|
||||||
|
|
||||||
# TODO: Put help files into proper location.
|
|
||||||
# https://bugs.ruby-lang.org/issues/15359
|
|
||||||
mkdir -p %{buildroot}%{gem_dir}/gems/bundler-%{bundler_version}/lib
|
|
||||||
mv %{buildroot}%{ruby_libdir}/bundler.rb %{buildroot}%{gem_dir}/gems/bundler-%{bundler_version}/lib
|
|
||||||
mv %{buildroot}%{ruby_libdir}/bundler %{buildroot}%{gem_dir}/gems/bundler-%{bundler_version}/lib
|
|
||||||
mv %{buildroot}%{gem_dir}/specifications/default/bundler-%{bundler_version}.gemspec %{buildroot}%{gem_dir}/specifications
|
|
||||||
|
|
||||||
mkdir -p %{buildroot}%{gem_dir}/gems/io-console-%{io_console_version}/lib
|
mkdir -p %{buildroot}%{gem_dir}/gems/io-console-%{io_console_version}/lib
|
||||||
mkdir -p %{buildroot}%{_libdir}/gems/%{name}/io-console-%{io_console_version}/io
|
mkdir -p %{buildroot}%{_libdir}/gems/%{name}/io-console-%{io_console_version}/io
|
||||||
|
@ -789,16 +823,10 @@ echo 'doc/pty' >> .ruby-doc.ja
|
||||||
sed -i 's/^/%doc /' .ruby-doc.*
|
sed -i 's/^/%doc /' .ruby-doc.*
|
||||||
sed -i 's/^/%lang(ja) /' .ruby-doc.ja
|
sed -i 's/^/%lang(ja) /' .ruby-doc.ja
|
||||||
|
|
||||||
# https://github.com/yuki24/did_you_mean/issues/122
|
|
||||||
rm -rf %{buildroot}%{gem_dir}/gems/did_you_mean-%{did_you_mean_version}/tmp/
|
|
||||||
|
|
||||||
# https://github.com/ruby/rake/issues/316
|
|
||||||
rm -f %{buildroot}%{gem_dir}/gems/rake-%{rake_version}/.gitignore
|
|
||||||
|
|
||||||
%check
|
%check
|
||||||
%if 0%{?with_hardening_test}
|
%if 0%{?with_hardening_test}
|
||||||
# Check Ruby hardening.
|
# Check Ruby hardening.
|
||||||
checksec --file=libruby.so.%{ruby_version} | \
|
checksec -f libruby.so.%{ruby_version} | \
|
||||||
grep "Full RELRO.*Canary found.*NX enabled.*DSO.*No RPATH.*No RUNPATH.*Yes.*\d*.*\d*.*libruby.so.%{ruby_version}"
|
grep "Full RELRO.*Canary found.*NX enabled.*DSO.*No RPATH.*No RUNPATH.*Yes.*\d*.*\d*.*libruby.so.%{ruby_version}"
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
@ -812,35 +840,7 @@ checksec --file=libruby.so.%{ruby_version} | \
|
||||||
module Gem; module Resolver; end; end; \
|
module Gem; module Resolver; end; end; \
|
||||||
require 'rubygems/resolver/molinillo/lib/molinillo/gem_metadata'; \
|
require 'rubygems/resolver/molinillo/lib/molinillo/gem_metadata'; \
|
||||||
puts Gem::Resolver::Molinillo::VERSION\\\"\" | tail -1`" \
|
puts Gem::Resolver::Molinillo::VERSION\\\"\" | tail -1`" \
|
||||||
== '%{rubygems_molinillo_version}' ]
|
== '%{molinillo_version}' ]
|
||||||
|
|
||||||
# Check Bundler bundled dependencies versions.
|
|
||||||
|
|
||||||
# FileUtils.
|
|
||||||
# TODO: There is no version in bundled FileUtils yet.
|
|
||||||
#%%{global bundler_fileutils_version}
|
|
||||||
|
|
||||||
# Molinillo.
|
|
||||||
[ "`make runruby TESTRUN_SCRIPT=\"-e \\\" \
|
|
||||||
module Bundler; end; \
|
|
||||||
require 'bundler/vendor/molinillo/lib/molinillo/gem_metadata'; \
|
|
||||||
puts Bundler::Molinillo::VERSION\\\"\" | tail -1`" \
|
|
||||||
== '%{bundler_molinillo_version}' ]
|
|
||||||
|
|
||||||
# Net::HTTP::Persistent.
|
|
||||||
[ "`make runruby TESTRUN_SCRIPT=\"-e \\\" \
|
|
||||||
module Bundler; module Persistent; module Net; module HTTP; \
|
|
||||||
end; end; end; end; \
|
|
||||||
require 'bundler/vendor/net-http-persistent/lib/net/http/persistent'; \
|
|
||||||
puts Bundler::Persistent::Net::HTTP::Persistent::VERSION\\\"\" | tail -1`" \
|
|
||||||
== '%{bundler_net_http_persistent_version}' ]
|
|
||||||
|
|
||||||
# Thor.
|
|
||||||
[ "`make runruby TESTRUN_SCRIPT=\"-e \\\" \
|
|
||||||
module Bundler; end; \
|
|
||||||
require 'bundler/vendor/thor/lib/thor/version'; \
|
|
||||||
puts Bundler::Thor::VERSION\\\"\" | tail -1`" \
|
|
||||||
== '%{bundler_thor_version}' ]
|
|
||||||
|
|
||||||
|
|
||||||
# test_debug(TestRubyOptions) fails due to LoadError reported in debug mode,
|
# test_debug(TestRubyOptions) fails due to LoadError reported in debug mode,
|
||||||
|
@ -856,10 +856,6 @@ make runruby TESTRUN_SCRIPT="--enable-gems %{SOURCE13}"
|
||||||
%{?with_systemtap:make runruby TESTRUN_SCRIPT=%{SOURCE14}}
|
%{?with_systemtap:make runruby TESTRUN_SCRIPT=%{SOURCE14}}
|
||||||
|
|
||||||
DISABLE_TESTS=""
|
DISABLE_TESTS=""
|
||||||
MSPECOPTS=""
|
|
||||||
|
|
||||||
# Avoid `hostname' dependency.
|
|
||||||
%{!?with_hostname:MSPECOPTS="-P 'Socket.gethostname returns the host name'"}
|
|
||||||
|
|
||||||
# SIGSEV handler does not provide correct output on AArch64.
|
# SIGSEV handler does not provide correct output on AArch64.
|
||||||
# https://bugs.ruby-lang.org/issues/13758
|
# https://bugs.ruby-lang.org/issues/13758
|
||||||
|
@ -871,35 +867,16 @@ DISABLE_TESTS="$DISABLE_TESTS -n !/test_segv_\(setproctitle\|test\|loaded_featur
|
||||||
# which fails on Koji.
|
# which fails on Koji.
|
||||||
# https://bugs.ruby-lang.org/issues/14175
|
# https://bugs.ruby-lang.org/issues/14175
|
||||||
sed -i '/def test_mdns_each_address$/,/^ end$/ s/^/#/' test/resolv/test_mdns.rb
|
sed -i '/def test_mdns_each_address$/,/^ end$/ s/^/#/' test/resolv/test_mdns.rb
|
||||||
# Disable Timeouting test_queue_with_trap
|
|
||||||
# https://github.com/ruby/ruby/pull/3101/
|
|
||||||
sed -i '/^ def test_queue_with_trap$/,/^ end$/ s/^/#/g' \
|
|
||||||
test/ruby/test_thread_queue.rb
|
|
||||||
# Disable "File.utime allows Time instances in the far future to set
|
|
||||||
# mtime and atime".
|
|
||||||
# https://bugs.ruby-lang.org/issues/16410
|
|
||||||
MSPECOPTS="$MSPECOPTS -P 'File.utime allows Time instances in the far future to set mtime and atime'"
|
|
||||||
|
|
||||||
# For now, disable JIT tests in RHEL 8.
|
# For now, disable test incompatible with OpenSSL 1.1.1:
|
||||||
# https://bugzilla.redhat.com/show_bug.cgi?id=1721553
|
# https://github.com/rubygems/rubygems/issues/2388
|
||||||
mv test/ruby/test_jit.rb{,.disabled}
|
DISABLE_TESTS="$DISABLE_TESTS -n !/test_do_not_allow_invalid_client_cert_auth_connection/"
|
||||||
sed \
|
|
||||||
-e '/^ def test_pause$/,/^ end$/ s/^/#/' \
|
|
||||||
-e '/^ def test_pause_waits_until_compaction$/,/^ end$/ s/^/#/' \
|
|
||||||
-i test/ruby/test_rubyvm_mjit.rb
|
|
||||||
|
|
||||||
# RHEL8 is using stronger crypto policies then Fedora ATM and upstream does
|
# RHEL8 is using stronger crypto policies then Fedora ATM and upstream does
|
||||||
# not support them yet. Disable the RHEL8 configuration for the moment.
|
# not support them yet. Disable the RHEL8 configuration for the moment.
|
||||||
# https://github.com/ruby/openssl/issues/215
|
# https://github.com/ruby/openssl/issues/215
|
||||||
OPENSSL_SYSTEM_CIPHERS_OVERRIDE=xyz_nonexistent_file OPENSSL_CONF='' \
|
OPENSSL_SYSTEM_CIPHERS_OVERRIDE=xyz_nonexistent_file OPENSSL_CONF='' \
|
||||||
make check TESTS="-v $DISABLE_TESTS" MSPECOPT="-fs $MSPECOPTS"
|
make check TESTS="-v $DISABLE_TESTS"
|
||||||
|
|
||||||
%if %{with bundler_tests}
|
|
||||||
cat "%{PATCH28}" | patch -p1
|
|
||||||
cat "%{PATCH29}" | patch -p1
|
|
||||||
# Only run specific tests, as there are some failures in other tests.
|
|
||||||
make test-bundler V=1 RSPECOPTS="--format d" BUNDLER_SPECS=bundler/definition_dep_confusion_spec.rb
|
|
||||||
%endif
|
|
||||||
|
|
||||||
%files
|
%files
|
||||||
%license BSDL
|
%license BSDL
|
||||||
|
@ -948,13 +925,11 @@ make test-bundler V=1 RSPECOPTS="--format d" BUNDLER_SPECS=bundler/definition_de
|
||||||
%exclude %{ruby_libdir}/openssl.rb
|
%exclude %{ruby_libdir}/openssl.rb
|
||||||
%exclude %{ruby_libdir}/psych.rb
|
%exclude %{ruby_libdir}/psych.rb
|
||||||
%{ruby_libdir}/cgi
|
%{ruby_libdir}/cgi
|
||||||
%{ruby_libdir}/csv
|
|
||||||
%{ruby_libdir}/digest
|
%{ruby_libdir}/digest
|
||||||
%{ruby_libdir}/drb
|
%{ruby_libdir}/drb
|
||||||
%{ruby_libdir}/e2mmap
|
|
||||||
%{ruby_libdir}/fiddle
|
%{ruby_libdir}/fiddle
|
||||||
%{ruby_libdir}/fileutils
|
|
||||||
%{ruby_libdir}/forwardable
|
%{ruby_libdir}/forwardable
|
||||||
|
%exclude %{ruby_libdir}/irb
|
||||||
%{ruby_libdir}/matrix
|
%{ruby_libdir}/matrix
|
||||||
%{ruby_libdir}/net
|
%{ruby_libdir}/net
|
||||||
%{ruby_libdir}/optparse
|
%{ruby_libdir}/optparse
|
||||||
|
@ -965,8 +940,6 @@ make test-bundler V=1 RSPECOPTS="--format d" BUNDLER_SPECS=bundler/definition_de
|
||||||
%{ruby_libdir}/rss
|
%{ruby_libdir}/rss
|
||||||
%{ruby_libdir}/shell
|
%{ruby_libdir}/shell
|
||||||
%{ruby_libdir}/syslog
|
%{ruby_libdir}/syslog
|
||||||
%{ruby_libdir}/thwait
|
|
||||||
%{ruby_libdir}/tracer
|
|
||||||
%{ruby_libdir}/unicode_normalize
|
%{ruby_libdir}/unicode_normalize
|
||||||
%{ruby_libdir}/uri
|
%{ruby_libdir}/uri
|
||||||
%{ruby_libdir}/webrick
|
%{ruby_libdir}/webrick
|
||||||
|
@ -1100,33 +1073,20 @@ make test-bundler V=1 RSPECOPTS="--format d" BUNDLER_SPECS=bundler/definition_de
|
||||||
|
|
||||||
# TODO: Gemify these libraries
|
# TODO: Gemify these libraries
|
||||||
%{gem_dir}/specifications/default/cmath-1.0.0.gemspec
|
%{gem_dir}/specifications/default/cmath-1.0.0.gemspec
|
||||||
%{gem_dir}/specifications/default/csv-3.0.9.gemspec
|
%{gem_dir}/specifications/default/csv-1.0.0.gemspec
|
||||||
%{gem_dir}/specifications/default/date-2.0.3.gemspec
|
%{gem_dir}/specifications/default/date-1.0.0.gemspec
|
||||||
%{gem_dir}/specifications/default/dbm-1.0.0.gemspec
|
%{gem_dir}/specifications/default/dbm-1.0.0.gemspec
|
||||||
%{gem_dir}/specifications/default/e2mmap-0.1.0.gemspec
|
%{gem_dir}/specifications/default/etc-1.0.0.gemspec
|
||||||
%{gem_dir}/specifications/default/etc-1.0.1.gemspec
|
|
||||||
%{gem_dir}/specifications/default/fcntl-1.0.0.gemspec
|
%{gem_dir}/specifications/default/fcntl-1.0.0.gemspec
|
||||||
%{gem_dir}/specifications/default/fiddle-1.0.0.gemspec
|
%{gem_dir}/specifications/default/fiddle-1.0.0.gemspec
|
||||||
%{gem_dir}/specifications/default/fileutils-1.1.0.gemspec
|
%{gem_dir}/specifications/default/fileutils-1.0.2.gemspec
|
||||||
%{gem_dir}/specifications/default/forwardable-1.2.0.gemspec
|
|
||||||
%{gem_dir}/specifications/default/gdbm-2.0.0.gemspec
|
%{gem_dir}/specifications/default/gdbm-2.0.0.gemspec
|
||||||
%{gem_dir}/specifications/default/ipaddr-1.2.2.gemspec
|
%{gem_dir}/specifications/default/ipaddr-1.2.0.gemspec
|
||||||
%{gem_dir}/specifications/default/logger-1.3.0.gemspec
|
|
||||||
%{gem_dir}/specifications/default/matrix-0.1.0.gemspec
|
|
||||||
%{gem_dir}/specifications/default/mutex_m-0.1.0.gemspec
|
|
||||||
%{gem_dir}/specifications/default/ostruct-0.1.0.gemspec
|
|
||||||
%{gem_dir}/specifications/default/prime-0.1.0.gemspec
|
|
||||||
%{gem_dir}/specifications/default/rexml-3.1.9.1.gemspec
|
|
||||||
%{gem_dir}/specifications/default/rss-0.2.7.gemspec
|
|
||||||
%{gem_dir}/specifications/default/scanf-1.0.0.gemspec
|
%{gem_dir}/specifications/default/scanf-1.0.0.gemspec
|
||||||
%{gem_dir}/specifications/default/sdbm-1.0.0.gemspec
|
%{gem_dir}/specifications/default/sdbm-1.0.0.gemspec
|
||||||
%{gem_dir}/specifications/default/shell-0.7.gemspec
|
%{gem_dir}/specifications/default/stringio-0.0.1.gemspec
|
||||||
%{gem_dir}/specifications/default/stringio-0.0.2.gemspec
|
|
||||||
%{gem_dir}/specifications/default/strscan-1.0.0.gemspec
|
%{gem_dir}/specifications/default/strscan-1.0.0.gemspec
|
||||||
%{gem_dir}/specifications/default/sync-0.5.0.gemspec
|
%{gem_dir}/specifications/default/webrick-1.4.2.1.gemspec
|
||||||
%{gem_dir}/specifications/default/thwait-0.1.0.gemspec
|
|
||||||
%{gem_dir}/specifications/default/tracer-0.1.0.gemspec
|
|
||||||
%{gem_dir}/specifications/default/webrick-1.4.4.gemspec
|
|
||||||
%{gem_dir}/specifications/default/zlib-1.0.0.gemspec
|
%{gem_dir}/specifications/default/zlib-1.0.0.gemspec
|
||||||
|
|
||||||
%files -n rubygems-devel
|
%files -n rubygems-devel
|
||||||
|
@ -1142,11 +1102,10 @@ make test-bundler V=1 RSPECOPTS="--format d" BUNDLER_SPECS=bundler/definition_de
|
||||||
%{gem_dir}/specifications/rake-%{rake_version}.gemspec
|
%{gem_dir}/specifications/rake-%{rake_version}.gemspec
|
||||||
%{_mandir}/man1/rake.1*
|
%{_mandir}/man1/rake.1*
|
||||||
|
|
||||||
%files -n rubygem-irb
|
%files irb
|
||||||
%{_bindir}/irb
|
%{_bindir}/irb
|
||||||
%{ruby_libdir}/irb*
|
%{ruby_libdir}/irb.rb
|
||||||
%{gem_dir}/gems/irb-%{irb_version}
|
%{ruby_libdir}/irb
|
||||||
%{gem_dir}/specifications/irb-%{irb_version}.gemspec
|
|
||||||
%{_mandir}/man1/irb.1*
|
%{_mandir}/man1/irb.1*
|
||||||
|
|
||||||
%files -n rubygem-rdoc
|
%files -n rubygem-rdoc
|
||||||
|
@ -1164,7 +1123,7 @@ make test-bundler V=1 RSPECOPTS="--format d" BUNDLER_SPECS=bundler/definition_de
|
||||||
|
|
||||||
%files -n rubygem-bigdecimal
|
%files -n rubygem-bigdecimal
|
||||||
%{ruby_libdir}/bigdecimal
|
%{ruby_libdir}/bigdecimal
|
||||||
%{ruby_libarchdir}/bigdecimal*
|
%{ruby_libarchdir}/bigdecimal.so
|
||||||
%{_libdir}/gems/%{name}/bigdecimal-%{bigdecimal_version}
|
%{_libdir}/gems/%{name}/bigdecimal-%{bigdecimal_version}
|
||||||
%{gem_dir}/gems/bigdecimal-%{bigdecimal_version}
|
%{gem_dir}/gems/bigdecimal-%{bigdecimal_version}
|
||||||
%{gem_dir}/specifications/bigdecimal-%{bigdecimal_version}.gemspec
|
%{gem_dir}/specifications/bigdecimal-%{bigdecimal_version}.gemspec
|
||||||
|
@ -1235,58 +1194,61 @@ make test-bundler V=1 RSPECOPTS="--format d" BUNDLER_SPECS=bundler/definition_de
|
||||||
%{gem_dir}/gems/xmlrpc-%{xmlrpc_version}/xmlrpc.gemspec
|
%{gem_dir}/gems/xmlrpc-%{xmlrpc_version}/xmlrpc.gemspec
|
||||||
%{gem_dir}/specifications/xmlrpc-%{xmlrpc_version}.gemspec
|
%{gem_dir}/specifications/xmlrpc-%{xmlrpc_version}.gemspec
|
||||||
|
|
||||||
%files -n rubygem-bundler
|
|
||||||
%{_bindir}/bundle
|
|
||||||
%{_bindir}/bundler
|
|
||||||
%{gem_dir}/gems/bundler-%{bundler_version}
|
|
||||||
%{gem_dir}/specifications/bundler-%{bundler_version}.gemspec
|
|
||||||
%{_mandir}/man1/bundle*.1*
|
|
||||||
%{_mandir}/man5/gemfile.5*
|
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
* Thu May 19 2022 Vít Ondruch <vondruch@redhat.com> - 2.6.10-109
|
* Mon Jun 12 2023 Jarek Prokop <jprokop@redhat.com> - 2.5.9-111
|
||||||
- Upgrade to Ruby 2.6.10.
|
- Fix HTTP response splitting in CGI.
|
||||||
Resolves: rhbz#2088415
|
Resolves: CVE-2021-33621
|
||||||
- Fix buffer overrun in String-to-Float conversion.
|
- Fix Buffer overrun in String-to-Float conversion.
|
||||||
Resolves: CVE-2022-28739
|
Resolves: CVE-2022-28739
|
||||||
|
- Fix ReDoS vulnerability in URI.
|
||||||
|
Resolves: CVE-2023-28755
|
||||||
|
- Fix ReDoS vulnerability in Time.
|
||||||
|
Resolves: CVE-2023-28756
|
||||||
|
|
||||||
|
* Thu May 25 2023 Todd Zullinger <tmz@pobox.com> - 2.5.9-111
|
||||||
|
- Fix rdoc parsing of nil text tokens.
|
||||||
|
Resolves: rhbz#2210326
|
||||||
|
|
||||||
|
* Fri Jul 08 2022 Jun Aruga <jaruga@redhat.com> - 2.5.9-110
|
||||||
- Fix FTBFS due to an incompatible load directive.
|
- Fix FTBFS due to an incompatible load directive.
|
||||||
- Fix a fiddle import test on an optimized glibc on Power 9.
|
- Fix a fiddle import test on an optimized glibc on Power 9.
|
||||||
|
- Fix by adding length limit option for methods that parses date strings.
|
||||||
|
Resolves: CVE-2021-41817
|
||||||
|
- CGI::Cookie.parse no longer decodes cookie names to prevent spoofing security
|
||||||
|
prefixes in cookie names.
|
||||||
|
Resolves: CVE-2021-41819
|
||||||
|
|
||||||
* Wed Dec 08 2021 Jun Aruga <jaruga@redhat.com> - 2.6.9-108
|
* Wed Feb 16 2022 Jarek Prokop <jprokop@redhat.com> - 2.5.9-109
|
||||||
- Upgrade to Ruby 2.6.9.
|
- Properly fix command injection vulnerability in Rdoc.
|
||||||
- Skip JIT tests in RHEL 8.
|
Related: CVE-2021-31799
|
||||||
- Fix the issues required to start the "make test-bundler" itself.
|
|
||||||
- Fix Bundler dependency confusion.
|
|
||||||
Resolves: CVE-2020-36327
|
|
||||||
|
|
||||||
* Wed Apr 14 2021 Jarek Prokop <jprokop@redhat.com> - 2.6.7-107
|
* Wed Feb 09 2022 Jarek Prokop <jprokop@redhat.com> - 2.5.9-108
|
||||||
- Upgrade to Ruby 2.6.7.
|
- Fix command injection vulnerability in RDoc.
|
||||||
Resolves: rhbz#1757846
|
Resolves: CVE-2021-31799
|
||||||
- Resolv::DNS: timeouts if multiple IPv6 name servers are given an address
|
- Fix StartTLS stripping vulnerability in Net::IMAP
|
||||||
containing leading zero
|
Resolves: CVE-2021-32066
|
||||||
Resolves: rhbz#1950307
|
- Fix FTP PASV command response can cause Net::FTP to connect to arbitrary host.
|
||||||
- Fix: Rubygem-bundler: Don't use insecure tmp directory as home
|
Resolves: CVE-2021-31810
|
||||||
allows for execution of malicious code.
|
|
||||||
Resolves: CVE-2019-3881
|
|
||||||
|
|
||||||
* Thu Jul 04 2019 Jun Aruga <jaruga@redhat.com> - 2.6.3-106
|
* Mon Apr 19 2021 Pavel Valena <pvalena@redhat.com> - 2.5.9-107
|
||||||
|
- Update to Ruby 2.5.9.
|
||||||
|
* Remove Patch20: ruby-2.6.0-rdoc-6.0.1-fix-template-typo.patch; subsumed
|
||||||
|
Resolves: rhbz#1757844
|
||||||
|
- Resolv::DNS: timeouts if multiple IPv6 name servers are given and address
|
||||||
|
contains leading zero
|
||||||
|
Resolves: rhbz#1950308
|
||||||
|
|
||||||
|
* Mon Jun 22 2020 Pavel Valena <pvalena@redhat.com> - 2.5.5-106
|
||||||
|
- Remove file with non-commercial license from did_you_mean gem.
|
||||||
|
Resolves: rhbz#1846113
|
||||||
|
|
||||||
|
* Thu Jul 04 2019 Jun Aruga <jaruga@redhat.com> - 2.5.5-105
|
||||||
- Use ffi_closure_alloc to avoid segmentation fault by libffi on aarch64.
|
- Use ffi_closure_alloc to avoid segmentation fault by libffi on aarch64.
|
||||||
Resolves: rhbz#1727832
|
Resolves: rhbz#1727832
|
||||||
- Properly support %%prerelease in %%gemspec_ macros.
|
- Properly support %%prerelease in %%gemspec_ macros.
|
||||||
Related: rhbz#1672575
|
Related: rhbz#1688758
|
||||||
|
- Fix rdoc gzipped javascript pages are not the same across multilib.
|
||||||
* Tue Jun 11 2019 Jun Aruga <jaruga@redhat.com> - 2.6.3-105
|
Resolves: rhbz#1719647
|
||||||
- Update to Ruby 2.6.3 by merging Fedora master branch (commit: 1cc2a49)
|
|
||||||
* Properly generate "ruby(rubygems)" versioned dependencies.
|
|
||||||
* Extract composition of dependecy strings into helper.
|
|
||||||
* Loosen RDoc dependency.
|
|
||||||
* Upstream fix adding -C flag instead of changing directory for gem build.
|
|
||||||
* Remove obsolete Group tag
|
|
||||||
* Fix ".include =" support in openssl.cnf.
|
|
||||||
* Link IRB back to StdLib.
|
|
||||||
* Link IRB files instead of directories.
|
|
||||||
* Exclude irb.rb from ruby-libs.
|
|
||||||
Resolves: rhbz#1672575
|
|
||||||
|
|
||||||
* Wed Apr 17 2019 Vít Ondruch <vondruch@redhat.com> - 2.5.5-104
|
* Wed Apr 17 2019 Vít Ondruch <vondruch@redhat.com> - 2.5.5-104
|
||||||
- Update to Ruby 2.5.5.
|
- Update to Ruby 2.5.5.
|
||||||
|
|
Loading…
Reference in New Issue