Compare commits
11 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c70ccde3d9 | ||
|
|
3158daef37 | ||
|
|
ea5807830d | ||
|
|
9e54766673 | ||
|
|
4ff0d0bfbc | ||
|
|
c9c9cfa72a | ||
|
|
e6de7f079a | ||
|
|
d4706ff294 | ||
|
|
2d4d07d064 | ||
|
|
768686e250 | ||
|
|
52dc50e942 |
15 changed files with 998 additions and 222 deletions
3
.cvsignore → .gitignore
vendored
3
.cvsignore → .gitignore
vendored
|
|
@ -2,3 +2,6 @@ ruby-1.8.6-p388.tar.bz2
|
||||||
ruby-refm-rdp-1.8.2-ja-html.tar.gz
|
ruby-refm-rdp-1.8.2-ja-html.tar.gz
|
||||||
rubyfaq-990927.tar.gz
|
rubyfaq-990927.tar.gz
|
||||||
rubyfaq-jp-990927.tar.gz
|
rubyfaq-jp-990927.tar.gz
|
||||||
|
ruby-1.8.6-p399.tar.bz2
|
||||||
|
ruby-1.8-rev27738_trunk-ext_tk.tar.gz
|
||||||
|
/ruby-1.8.6-p420.tar.bz2
|
||||||
21
Makefile
21
Makefile
|
|
@ -1,21 +0,0 @@
|
||||||
# Makefile for source rpm: ruby
|
|
||||||
# $Id: Makefile,v 1.2 2007/10/15 19:21:20 notting Exp $
|
|
||||||
NAME := ruby
|
|
||||||
SPECFILE = $(firstword $(wildcard *.spec))
|
|
||||||
|
|
||||||
define find-makefile-common
|
|
||||||
for d in common ../common ../../common ; do if [ -f $$d/Makefile.common ] ; then if [ -f $$d/CVS/Root -a -w $$d/Makefile.common ] ; then cd $$d ; cvs -Q update ; fi ; echo "$$d/Makefile.common" ; break ; fi ; done
|
|
||||||
endef
|
|
||||||
|
|
||||||
MAKEFILE_COMMON := $(shell $(find-makefile-common))
|
|
||||||
|
|
||||||
ifeq ($(MAKEFILE_COMMON),)
|
|
||||||
# attempt a checkout
|
|
||||||
define checkout-makefile-common
|
|
||||||
test -f CVS/Root && { cvs -Q -d $$(cat CVS/Root) checkout common && echo "common/Makefile.common" ; } || { echo "ERROR: I can't figure out how to checkout the 'common' module." ; exit -1 ; } >&2
|
|
||||||
endef
|
|
||||||
|
|
||||||
MAKEFILE_COMMON := $(shell $(checkout-makefile-common))
|
|
||||||
endif
|
|
||||||
|
|
||||||
include $(MAKEFILE_COMMON)
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
ruby-1_8_6_287-4_fc10:HEAD:ruby-1.8.6.287-4.fc10.src.rpm:1237096558
|
|
||||||
ruby-1_8_6_287-5_fc10:HEAD:ruby-1.8.6.287-5.fc10.src.rpm:1237096677
|
|
||||||
ruby-1_8_6_287-7_fc11:HEAD:ruby-1.8.6.287-7.fc11.src.rpm:1237351812
|
|
||||||
ruby-1_8_6_368-1_fc11:HEAD:ruby-1.8.6.368-1.fc11.src.rpm:1243759307
|
|
||||||
ruby-1_8_6_368-2_fc11:HEAD:ruby-1.8.6.368-2.fc11.src.rpm:1245520186
|
|
||||||
ruby-1_8_6_369-1_fc11:HEAD:ruby-1.8.6.369-1.fc11.src.rpm:1245760717
|
|
||||||
ruby-1_8_6_388-6_fc12:HEAD:ruby-1.8.6.388-6.fc12.src.rpm:1264032880
|
|
||||||
ruby-1_8_6_388-7_fc12:HEAD:ruby-1.8.6.388-7.fc12.src.rpm:1264596030
|
|
||||||
ruby-1_8_6_388-8_fc12:HEAD:ruby-1.8.6.388-8.fc12.src.rpm:1264601829
|
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
Index: ruby_1_8_6/ext/openssl/ossl_digest.c
|
||||||
|
===================================================================
|
||||||
|
--- ruby_1_8_6/ext/openssl/ossl_digest.c (revision 12042)
|
||||||
|
+++ ruby_1_8_6/ext/openssl/ossl_digest.c (revision 12043)
|
||||||
|
@@ -264,6 +264,10 @@
|
||||||
|
void
|
||||||
|
Init_ossl_digest()
|
||||||
|
{
|
||||||
|
+#if 0 /* let rdoc know about mOSSL */
|
||||||
|
+ mOSSL = rb_define_module("OpenSSL");
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
mDigest = rb_define_module_under(mOSSL, "Digest");
|
||||||
|
|
||||||
|
eDigestError = rb_define_class_under(mDigest, "DigestError", eOSSLError);
|
||||||
|
|
@ -1,35 +1,130 @@
|
||||||
--- ruby-1.8.6-p369/lib/rdoc/ri/ri_options.rb.gemmulti 2007-02-13 08:01:19.000000000 +0900
|
Mon Dec 24 16:18:57 2007 Eric Hodel <drbrain@segment7.net>
|
||||||
+++ ruby-1.8.6-p369/lib/rdoc/ri/ri_options.rb 2009-10-14 23:51:09.000000000 +0900
|
|
||||||
@@ -63,7 +63,7 @@
|
* lib/rdoc/ri/ri_options.rb: Fix ri --help listing of gem ri paths.
|
||||||
|
Merge of r14567 and r14569 from trunk.
|
||||||
|
|
||||||
|
* lib/rdoc/ri/ri_paths.rb: Fix duplication of ri data for multiple
|
||||||
|
gems. Merge of r14567 from trunk
|
||||||
|
|
||||||
|
Index: ruby_1_8/lib/rdoc/ri/ri_options.rb
|
||||||
|
===================================================================
|
||||||
|
--- ruby_1_8/lib/rdoc/ri/ri_options.rb (revision 14581)
|
||||||
|
+++ ruby_1_8/lib/rdoc/ri/ri_options.rb (revision 14582)
|
||||||
|
@@ -62,10 +62,11 @@
|
||||||
|
(RI::Paths::HOMEDIR || "No ~/.rdoc found") ],
|
||||||
|
|
||||||
[ "--gems", nil, nil,
|
[ "--gems", nil, nil,
|
||||||
"Include documentation from Rubygems:\n " +
|
- "Include documentation from Rubygems:\n " +
|
||||||
- (RI::Paths::GEMDIRS ? "#{Gem.path}/doc/*/ri" :
|
- (RI::Paths::GEMDIRS ? "#{Gem.path}/doc/*/ri" :
|
||||||
+ (RI::Paths::GEMDIRS ? Gem.path.map {|path| "#{path}/doc/*/ri" }.join(', ') :
|
- "No Rubygems ri found.") ],
|
||||||
"No Rubygems ri found.") ],
|
-
|
||||||
|
+ "Include documentation from RubyGems:\n" +
|
||||||
|
+ (RI::Paths::GEMDIRS ?
|
||||||
|
+ Gem.path.map { |dir| " #{dir}/doc/*/ri" }.join("\n") :
|
||||||
|
+ "No Rubygems ri found.") ],
|
||||||
|
+
|
||||||
[ "--format", "-f", "<name>",
|
[ "--format", "-f", "<name>",
|
||||||
@@ -136,7 +136,11 @@
|
"Format to use when displaying output:\n" +
|
||||||
|
" " + RI::TextFormatter.list + "\n" +
|
||||||
|
@@ -116,7 +117,8 @@
|
||||||
|
def OptionList.error(msg)
|
||||||
|
$stderr.puts
|
||||||
|
$stderr.puts msg
|
||||||
|
- $stderr.puts "\nFor help on options, try 'ri --help'\n\n"
|
||||||
|
+ name = File.basename $PROGRAM_NAME
|
||||||
|
+ $stderr.puts "\nFor help on options, try '#{name} --help'\n\n"
|
||||||
|
exit 1
|
||||||
|
end
|
||||||
|
|
||||||
|
@@ -136,7 +138,11 @@
|
||||||
RI::Paths::HOMEDIR
|
RI::Paths::HOMEDIR
|
||||||
]
|
]
|
||||||
|
|
||||||
- directories << "#{Gem.path}/doc/*/ri" if RI::Paths::GEMDIRS
|
- directories << "#{Gem.path}/doc/*/ri" if RI::Paths::GEMDIRS
|
||||||
+ if RI::Paths::GEMDIRS
|
+ if RI::Paths::GEMDIRS then
|
||||||
+ Gem.path.each {|gempath|
|
+ Gem.path.each do |dir|
|
||||||
+ directories << "#{gempath}/doc/*/ri"
|
+ directories << "#{dir}/doc/*/ri"
|
||||||
+ }
|
+ end
|
||||||
+ end
|
+ end
|
||||||
|
|
||||||
directories = directories.join("\n ")
|
directories = directories.join("\n ")
|
||||||
|
|
||||||
--- ruby-1.8.6-p369/lib/rdoc/ri/ri_paths.rb.gemmulti 2007-02-13 08:01:19.000000000 +0900
|
@@ -157,16 +163,16 @@
|
||||||
+++ ruby-1.8.6-p369/lib/rdoc/ri/ri_paths.rb 2009-10-15 00:02:05.000000000 +0900
|
|
||||||
@@ -44,7 +44,7 @@
|
For example:
|
||||||
|
|
||||||
|
- ri File
|
||||||
|
- ri File.new
|
||||||
|
- ri F.n
|
||||||
|
- ri zip
|
||||||
|
+ #{name} File
|
||||||
|
+ #{name} File.new
|
||||||
|
+ #{name} F.n
|
||||||
|
+ #{name} zip
|
||||||
|
|
||||||
|
Note that shell quoting may be required for method names
|
||||||
|
containing punctuation:
|
||||||
|
|
||||||
|
- ri 'Array.[]'
|
||||||
|
- ri compact\\!
|
||||||
|
+ #{name} 'Array.[]'
|
||||||
|
+ #{name} compact\\!
|
||||||
|
|
||||||
|
By default ri searches for documentation in the following
|
||||||
|
directories:
|
||||||
|
@@ -180,8 +186,8 @@
|
||||||
|
EOT
|
||||||
|
|
||||||
|
if short_form
|
||||||
|
- puts "For help on options, type 'ri -h'"
|
||||||
|
- puts "For a list of classes I know about, type 'ri -c'"
|
||||||
|
+ puts "For help on options, type '#{name} -h'"
|
||||||
|
+ puts "For a list of classes I know about, type '#{name} -c'"
|
||||||
|
else
|
||||||
|
puts "Options:\n\n"
|
||||||
|
OPTION_LIST.each do|long, short, arg, desc|
|
||||||
|
Index: ruby_1_8/lib/rdoc/ri/ri_paths.rb
|
||||||
|
===================================================================
|
||||||
|
--- ruby_1_8/lib/rdoc/ri/ri_paths.rb (revision 14581)
|
||||||
|
+++ ruby_1_8/lib/rdoc/ri/ri_paths.rb (revision 14582)
|
||||||
|
@@ -44,8 +44,29 @@
|
||||||
|
|
||||||
begin
|
begin
|
||||||
require 'rubygems'
|
require 'rubygems'
|
||||||
- GEMDIRS = Dir["#{Gem.path}/doc/*/ri"]
|
- GEMDIRS = Dir["#{Gem.path}/doc/*/ri"]
|
||||||
+ GEMDIRS = Gem.path.map {|path| Dir["#{path}/doc/*/ri"]}.flatten
|
- GEMDIRS.each { |path| RI::Paths::PATH << path }
|
||||||
GEMDIRS.each { |path| RI::Paths::PATH << path }
|
+
|
||||||
|
+ # HACK dup'd from Gem.latest_partials and friends
|
||||||
|
+ all_paths = []
|
||||||
|
+
|
||||||
|
+ all_paths = Gem.path.map do |dir|
|
||||||
|
+ Dir[File.join(dir, 'doc', '*', 'ri')]
|
||||||
|
+ end.flatten
|
||||||
|
+
|
||||||
|
+ ri_paths = {}
|
||||||
|
+
|
||||||
|
+ all_paths.each do |dir|
|
||||||
|
+ base = File.basename File.dirname(dir)
|
||||||
|
+ if base =~ /(.*)-((\d+\.)*\d+)/ then
|
||||||
|
+ name, version = $1, $2
|
||||||
|
+ ver = Gem::Version.new version
|
||||||
|
+ if ri_paths[name].nil? or ver > ri_paths[name][0] then
|
||||||
|
+ ri_paths[name] = [ver, dir]
|
||||||
|
+ end
|
||||||
|
+ end
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
+ GEMDIRS = ri_paths.map { |k,v| v.last }.sort
|
||||||
|
+ GEMDIRS.each { |dir| RI::Paths::PATH << dir }
|
||||||
rescue LoadError
|
rescue LoadError
|
||||||
GEMDIRS = nil
|
GEMDIRS = nil
|
||||||
|
end
|
||||||
|
@@ -55,7 +76,7 @@
|
||||||
|
|
||||||
|
def self.path(use_system, use_site, use_home, use_gems, *extra_dirs)
|
||||||
|
path = raw_path(use_system, use_site, use_home, use_gems, *extra_dirs)
|
||||||
|
- return path.select { |path| File.directory? path }
|
||||||
|
+ return path.select { |directory| File.directory? directory }
|
||||||
|
end
|
||||||
|
|
||||||
|
# Returns the selected documentation directories including nonexistent
|
||||||
|
|
|
||||||
|
|
@ -1,96 +0,0 @@
|
||||||
diff -pruN ruby-1.8.6-p287.orig/lib/rexml/document.rb ruby-1.8.6-p287/lib/rexml/document.rb
|
|
||||||
--- ruby-1.8.6-p287.orig/lib/rexml/document.rb 2007-11-04 13:50:15.000000000 +0900
|
|
||||||
+++ ruby-1.8.6-p287/lib/rexml/document.rb 2008-10-08 22:25:14.000000000 +0900
|
|
||||||
@@ -32,6 +32,7 @@ module REXML
|
|
||||||
# @param context if supplied, contains the context of the document;
|
|
||||||
# this should be a Hash.
|
|
||||||
def initialize( source = nil, context = {} )
|
|
||||||
+ @entity_expansion_count = 0
|
|
||||||
super()
|
|
||||||
@context = context
|
|
||||||
return if source.nil?
|
|
||||||
@@ -200,6 +201,27 @@ module REXML
|
|
||||||
Parsers::StreamParser.new( source, listener ).parse
|
|
||||||
end
|
|
||||||
|
|
||||||
+ @@entity_expansion_limit = 10_000
|
|
||||||
+
|
|
||||||
+ # Set the entity expansion limit. By defualt the limit is set to 10000.
|
|
||||||
+ def Document::entity_expansion_limit=( val )
|
|
||||||
+ @@entity_expansion_limit = val
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ # Get the entity expansion limit. By defualt the limit is set to 10000.
|
|
||||||
+ def Document::entity_expansion_limit
|
|
||||||
+ return @@entity_expansion_limit
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ attr_reader :entity_expansion_count
|
|
||||||
+
|
|
||||||
+ def record_entity_expansion
|
|
||||||
+ @entity_expansion_count += 1
|
|
||||||
+ if @entity_expansion_count > @@entity_expansion_limit
|
|
||||||
+ raise "number of entity expansions exceeded, processing aborted."
|
|
||||||
+ end
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
private
|
|
||||||
def build( source )
|
|
||||||
Parsers::TreeParser.new( source, self ).parse
|
|
||||||
diff -pruN ruby-1.8.6-p287.orig/lib/rexml/entity.rb ruby-1.8.6-p287/lib/rexml/entity.rb
|
|
||||||
--- ruby-1.8.6-p287.orig/lib/rexml/entity.rb 2007-07-28 11:46:08.000000000 +0900
|
|
||||||
+++ ruby-1.8.6-p287/lib/rexml/entity.rb 2008-10-08 22:25:14.000000000 +0900
|
|
||||||
@@ -73,6 +73,7 @@ module REXML
|
|
||||||
# all entities -- both %ent; and &ent; entities. This differs from
|
|
||||||
# +value()+ in that +value+ only replaces %ent; entities.
|
|
||||||
def unnormalized
|
|
||||||
+ document.record_entity_expansion unless document.nil?
|
|
||||||
v = value()
|
|
||||||
return nil if v.nil?
|
|
||||||
@unnormalized = Text::unnormalize(v, parent)
|
|
||||||
diff -pruN ruby-1.8.6-p287.orig/test/rexml/test_document.rb ruby-1.8.6-p287/test/rexml/test_document.rb
|
|
||||||
--- ruby-1.8.6-p287.orig/test/rexml/test_document.rb 1970-01-01 09:00:00.000000000 +0900
|
|
||||||
+++ ruby-1.8.6-p287/test/rexml/test_document.rb 2008-10-08 22:25:14.000000000 +0900
|
|
||||||
@@ -0,0 +1,42 @@
|
|
||||||
+require "rexml/document"
|
|
||||||
+require "test/unit"
|
|
||||||
+
|
|
||||||
+class REXML::TestDocument < Test::Unit::TestCase
|
|
||||||
+ def test_new
|
|
||||||
+ doc = REXML::Document.new(<<EOF)
|
|
||||||
+<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
+<message>Hello world!</message>
|
|
||||||
+EOF
|
|
||||||
+ assert_equal("Hello world!", doc.root.children.first.value)
|
|
||||||
+ end
|
|
||||||
+
|
|
||||||
+ XML_WITH_NESTED_ENTITY = <<EOF
|
|
||||||
+<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
+<!DOCTYPE member [
|
|
||||||
+ <!ENTITY a "&b;&b;&b;&b;&b;&b;&b;&b;&b;&b;">
|
|
||||||
+ <!ENTITY b "&c;&c;&c;&c;&c;&c;&c;&c;&c;&c;">
|
|
||||||
+ <!ENTITY c "&d;&d;&d;&d;&d;&d;&d;&d;&d;&d;">
|
|
||||||
+ <!ENTITY d "&e;&e;&e;&e;&e;&e;&e;&e;&e;&e;">
|
|
||||||
+ <!ENTITY e "&f;&f;&f;&f;&f;&f;&f;&f;&f;&f;">
|
|
||||||
+ <!ENTITY f "&g;&g;&g;&g;&g;&g;&g;&g;&g;&g;">
|
|
||||||
+ <!ENTITY g "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx">
|
|
||||||
+]>
|
|
||||||
+<member>
|
|
||||||
+&a;
|
|
||||||
+</member>
|
|
||||||
+EOF
|
|
||||||
+
|
|
||||||
+ def test_entity_expansion_limit
|
|
||||||
+ doc = REXML::Document.new(XML_WITH_NESTED_ENTITY)
|
|
||||||
+ assert_raise(RuntimeError) do
|
|
||||||
+ doc.root.children.first.value
|
|
||||||
+ end
|
|
||||||
+ REXML::Document.entity_expansion_limit = 100
|
|
||||||
+ assert_equal(100, REXML::Document.entity_expansion_limit)
|
|
||||||
+ doc = REXML::Document.new(XML_WITH_NESTED_ENTITY)
|
|
||||||
+ assert_raise(RuntimeError) do
|
|
||||||
+ doc.root.children.first.value
|
|
||||||
+ end
|
|
||||||
+ assert_equal(101, doc.entity_expansion_count)
|
|
||||||
+ end
|
|
||||||
+end
|
|
||||||
|
|
@ -1,7 +1,25 @@
|
||||||
diff --git a/ext/openssl/lib/openssl/digest.rb b/ext/openssl/lib/openssl/digest.rb
|
Mon Feb 25 17:30:29 2008 Technorama Ltd. <oss-ruby@technorama.net>
|
||||||
index b3e4484..4810f01 100644
|
* ext/openssl/digest.c ext/openssl/lib/openssl/digest.rb:
|
||||||
--- a/ext/openssl/lib/openssl/digest.rb
|
Commit patch #9280 from Akinori MUSHA.
|
||||||
+++ b/ext/openssl/lib/openssl/digest.rb
|
Simplify the OpenSSL::Digest class and make use of the
|
||||||
|
existing Digest framework.
|
||||||
|
Enhance performance.
|
||||||
|
|
||||||
|
Thu Apr 5 14:58:49 2007 Technorama Ltd. <oss-ruby@technorama.net>
|
||||||
|
* ext/openssl/ossl_pkcs5.c: New module.
|
||||||
|
|
||||||
|
* ext/openssl/ossl_{cipher,digest,pkcs7,pkcs12}.c:
|
||||||
|
Remove redundant module namespace.
|
||||||
|
|
||||||
|
* ext/openssl/lib/openssl/{cipher,digest}.rb
|
||||||
|
Add backwards compatibile classes for rearranged classes.
|
||||||
|
|
||||||
|
* ext/openssl/ossl_{pkcs7,pkcs12}.c: Add documentation.
|
||||||
|
|
||||||
|
Index: ruby_1_8/ext/openssl/lib/openssl/digest.rb
|
||||||
|
===================================================================
|
||||||
|
--- ruby_1_8/ext/openssl/lib/openssl/digest.rb (revision 11708)
|
||||||
|
+++ ruby_1_8/ext/openssl/lib/openssl/digest.rb (revision 15600)
|
||||||
@@ -19,13 +19,17 @@
|
@@ -19,13 +19,17 @@
|
||||||
#require 'openssl'
|
#require 'openssl'
|
||||||
|
|
||||||
|
|
@ -21,7 +39,7 @@ index b3e4484..4810f01 100644
|
||||||
alg.each{|name|
|
alg.each{|name|
|
||||||
klass = Class.new(Digest){
|
klass = Class.new(Digest){
|
||||||
define_method(:initialize){|*data|
|
define_method(:initialize){|*data|
|
||||||
@@ -44,6 +48,14 @@ module OpenSSL
|
@@ -44,6 +48,14 @@
|
||||||
const_set(name, klass)
|
const_set(name, klass)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -36,20 +54,46 @@ index b3e4484..4810f01 100644
|
||||||
end # Digest
|
end # Digest
|
||||||
end # OpenSSL
|
end # OpenSSL
|
||||||
|
|
||||||
diff --git a/ext/openssl/ossl_digest.c b/ext/openssl/ossl_digest.c
|
Index: ruby_1_8/ext/openssl/ossl_digest.c
|
||||||
index 4096b09..b0308f0 100644
|
===================================================================
|
||||||
--- a/ext/openssl/ossl_digest.c
|
--- ruby_1_8/ext/openssl/ossl_digest.c (revision 11708)
|
||||||
+++ b/ext/openssl/ossl_digest.c
|
+++ ruby_1_8/ext/openssl/ossl_digest.c (revision 15600)
|
||||||
@@ -40,7 +40,7 @@ GetDigestPtr(VALUE obj)
|
@@ -24,7 +24,6 @@
|
||||||
|
/*
|
||||||
|
* Classes
|
||||||
|
*/
|
||||||
|
-VALUE mDigest;
|
||||||
|
VALUE cDigest;
|
||||||
|
VALUE eDigestError;
|
||||||
|
|
||||||
SafeGetDigest(obj, ctx);
|
@@ -36,11 +35,23 @@
|
||||||
|
const EVP_MD *
|
||||||
|
GetDigestPtr(VALUE obj)
|
||||||
|
{
|
||||||
|
- EVP_MD_CTX *ctx;
|
||||||
|
+ const EVP_MD *md;
|
||||||
|
|
||||||
|
- SafeGetDigest(obj, ctx);
|
||||||
|
+ if (TYPE(obj) == T_STRING) {
|
||||||
|
+ const char *name = STR2CSTR(obj);
|
||||||
|
|
||||||
- return EVP_MD_CTX_md(ctx); /*== ctx->digest*/
|
- return EVP_MD_CTX_md(ctx); /*== ctx->digest*/
|
||||||
+ return EVP_MD_CTX_md(ctx);
|
+ md = EVP_get_digestbyname(name);
|
||||||
|
+ if (!md)
|
||||||
|
+ ossl_raise(rb_eRuntimeError, "Unsupported digest algorithm (%s).", name);
|
||||||
|
+ } else {
|
||||||
|
+ EVP_MD_CTX *ctx;
|
||||||
|
+
|
||||||
|
+ SafeGetDigest(obj, ctx);
|
||||||
|
+
|
||||||
|
+ md = EVP_MD_CTX_md(ctx);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return md;
|
||||||
}
|
}
|
||||||
|
|
||||||
VALUE
|
VALUE
|
||||||
@@ -51,7 +51,6 @@ ossl_digest_new(const EVP_MD *md)
|
@@ -51,7 +62,6 @@
|
||||||
|
|
||||||
ret = ossl_digest_alloc(cDigest);
|
ret = ossl_digest_alloc(cDigest);
|
||||||
GetDigest(ret, ctx);
|
GetDigest(ret, ctx);
|
||||||
|
|
@ -57,7 +101,7 @@ index 4096b09..b0308f0 100644
|
||||||
EVP_DigestInit_ex(ctx, md, NULL);
|
EVP_DigestInit_ex(ctx, md, NULL);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -69,9 +68,8 @@ ossl_digest_alloc(VALUE klass)
|
@@ -69,14 +79,18 @@
|
||||||
ctx = EVP_MD_CTX_create();
|
ctx = EVP_MD_CTX_create();
|
||||||
if (ctx == NULL)
|
if (ctx == NULL)
|
||||||
ossl_raise(rb_eRuntimeError, "EVP_MD_CTX_create() failed");
|
ossl_raise(rb_eRuntimeError, "EVP_MD_CTX_create() failed");
|
||||||
|
|
@ -68,7 +112,17 @@ index 4096b09..b0308f0 100644
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,14 +84,9 @@ ossl_digest_initialize(int argc, VALUE *argv, VALUE self)
|
VALUE ossl_digest_update(VALUE, VALUE);
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * call-seq:
|
||||||
|
+ * Digest.new(string) -> digest
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
static VALUE
|
||||||
|
ossl_digest_initialize(int argc, VALUE *argv, VALUE self)
|
||||||
|
{
|
||||||
|
@@ -86,14 +100,9 @@
|
||||||
VALUE type, data;
|
VALUE type, data;
|
||||||
|
|
||||||
rb_scan_args(argc, argv, "11", &type, &data);
|
rb_scan_args(argc, argv, "11", &type, &data);
|
||||||
|
|
@ -85,7 +139,37 @@ index 4096b09..b0308f0 100644
|
||||||
GetDigest(self, ctx);
|
GetDigest(self, ctx);
|
||||||
EVP_DigestInit_ex(ctx, md, NULL);
|
EVP_DigestInit_ex(ctx, md, NULL);
|
||||||
|
|
||||||
@@ -141,75 +134,25 @@ ossl_digest_update(VALUE self, VALUE data)
|
@@ -118,6 +127,11 @@
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * call-seq:
|
||||||
|
+ * digest.reset -> self
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
static VALUE
|
||||||
|
ossl_digest_reset(VALUE self)
|
||||||
|
{
|
||||||
|
@@ -129,6 +143,11 @@
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * call-seq:
|
||||||
|
+ * digest.update(string) -> aString
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
VALUE
|
||||||
|
ossl_digest_update(VALUE self, VALUE data)
|
||||||
|
{
|
||||||
|
@@ -136,126 +155,77 @@
|
||||||
|
|
||||||
|
StringValue(data);
|
||||||
|
GetDigest(self, ctx);
|
||||||
|
- EVP_DigestUpdate(ctx, RSTRING(data)->ptr, RSTRING(data)->len);
|
||||||
|
+ EVP_DigestUpdate(ctx, RSTRING_PTR(data), RSTRING_LEN(data));
|
||||||
|
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -105,10 +189,16 @@ index 4096b09..b0308f0 100644
|
||||||
- EVP_MD_CTX_cleanup(&final);
|
- EVP_MD_CTX_cleanup(&final);
|
||||||
-}
|
-}
|
||||||
-
|
-
|
||||||
-static VALUE
|
+/*
|
||||||
|
+ * call-seq:
|
||||||
|
+ * digest.finish -> aString
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
static VALUE
|
||||||
-ossl_digest_digest(VALUE self)
|
-ossl_digest_digest(VALUE self)
|
||||||
-{
|
+ossl_digest_finish(int argc, VALUE *argv, VALUE self)
|
||||||
- EVP_MD_CTX *ctx;
|
{
|
||||||
|
EVP_MD_CTX *ctx;
|
||||||
- char *buf;
|
- char *buf;
|
||||||
- int buf_len;
|
- int buf_len;
|
||||||
- VALUE digest;
|
- VALUE digest;
|
||||||
|
|
@ -119,16 +209,15 @@ index 4096b09..b0308f0 100644
|
||||||
-
|
-
|
||||||
- return digest;
|
- return digest;
|
||||||
-}
|
-}
|
||||||
-
|
+ VALUE str;
|
||||||
static VALUE
|
|
||||||
|
-static VALUE
|
||||||
-ossl_digest_hexdigest(VALUE self)
|
-ossl_digest_hexdigest(VALUE self)
|
||||||
+ossl_digest_finish(int argc, VALUE *argv, VALUE self)
|
-{
|
||||||
{
|
- EVP_MD_CTX *ctx;
|
||||||
EVP_MD_CTX *ctx;
|
|
||||||
- char *buf, *hexbuf;
|
- char *buf, *hexbuf;
|
||||||
- int buf_len;
|
- int buf_len;
|
||||||
- VALUE hexdigest;
|
- VALUE hexdigest;
|
||||||
+ VALUE str;
|
|
||||||
+ rb_scan_args(argc, argv, "01", &str);
|
+ rb_scan_args(argc, argv, "01", &str);
|
||||||
|
|
||||||
GetDigest(self, ctx);
|
GetDigest(self, ctx);
|
||||||
|
|
@ -136,6 +225,7 @@ index 4096b09..b0308f0 100644
|
||||||
- if (string2hex(buf, buf_len, &hexbuf, NULL) != 2 * buf_len) {
|
- if (string2hex(buf, buf_len, &hexbuf, NULL) != 2 * buf_len) {
|
||||||
- OPENSSL_free(buf);
|
- OPENSSL_free(buf);
|
||||||
- ossl_raise(eDigestError, "Memory alloc error");
|
- ossl_raise(eDigestError, "Memory alloc error");
|
||||||
|
+
|
||||||
+ if (NIL_P(str)) {
|
+ if (NIL_P(str)) {
|
||||||
+ str = rb_str_new(NULL, EVP_MD_CTX_size(ctx));
|
+ str = rb_str_new(NULL, EVP_MD_CTX_size(ctx));
|
||||||
+ } else {
|
+ } else {
|
||||||
|
|
@ -147,67 +237,112 @@ index 4096b09..b0308f0 100644
|
||||||
|
|
||||||
- return hexdigest;
|
- return hexdigest;
|
||||||
-}
|
-}
|
||||||
-
|
+ EVP_DigestFinal_ex(ctx, RSTRING_PTR(str), NULL);
|
||||||
|
|
||||||
-static VALUE
|
-static VALUE
|
||||||
-ossl_digest_s_digest(VALUE klass, VALUE str, VALUE data)
|
-ossl_digest_s_digest(VALUE klass, VALUE str, VALUE data)
|
||||||
-{
|
-{
|
||||||
- VALUE obj = rb_class_new_instance(1, &str, klass);
|
- VALUE obj = rb_class_new_instance(1, &str, klass);
|
||||||
+ EVP_DigestFinal_ex(ctx, RSTRING_PTR(str), NULL);
|
|
||||||
|
|
||||||
- ossl_digest_update(obj, data);
|
|
||||||
+ return str;
|
|
||||||
|
|
||||||
- return ossl_digest_digest(obj);
|
|
||||||
-}
|
|
||||||
-
|
-
|
||||||
-static VALUE
|
- ossl_digest_update(obj, data);
|
||||||
|
-
|
||||||
|
- return ossl_digest_digest(obj);
|
||||||
|
+ return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * call-seq:
|
||||||
|
+ * digest.name -> string
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
static VALUE
|
||||||
-ossl_digest_s_hexdigest(VALUE klass, VALUE str, VALUE data)
|
-ossl_digest_s_hexdigest(VALUE klass, VALUE str, VALUE data)
|
||||||
-{
|
+ossl_digest_name(VALUE self)
|
||||||
|
{
|
||||||
- VALUE obj = rb_class_new_instance(1, &str, klass);
|
- VALUE obj = rb_class_new_instance(1, &str, klass);
|
||||||
-
|
-
|
||||||
- ossl_digest_update(obj, data);
|
- ossl_digest_update(obj, data);
|
||||||
-
|
-
|
||||||
- return ossl_digest_hexdigest(obj);
|
- return ossl_digest_hexdigest(obj);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static VALUE
|
||||||
|
-ossl_digest_equal(VALUE self, VALUE other)
|
||||||
|
-{
|
||||||
|
EVP_MD_CTX *ctx;
|
||||||
|
- VALUE str1, str2;
|
||||||
|
|
||||||
|
- if (rb_obj_is_kind_of(other, cDigest) == Qtrue) {
|
||||||
|
- str2 = ossl_digest_digest(other);
|
||||||
|
- } else {
|
||||||
|
- StringValue(other);
|
||||||
|
- str2 = other;
|
||||||
|
- }
|
||||||
|
GetDigest(self, ctx);
|
||||||
|
- if (RSTRING(str2)->len == EVP_MD_CTX_size(ctx)) {
|
||||||
|
- str1 = ossl_digest_digest(self);
|
||||||
|
- } else {
|
||||||
|
- str1 = ossl_digest_hexdigest(self);
|
||||||
|
- }
|
||||||
|
- if (RSTRING(str1)->len == RSTRING(str2)->len
|
||||||
|
- && rb_str_cmp(str1, str2) == 0) {
|
||||||
|
- return Qtrue;
|
||||||
|
- }
|
||||||
|
|
||||||
|
- return Qfalse;
|
||||||
|
+ return rb_str_new2(EVP_MD_name(EVP_MD_CTX_md(ctx)));
|
||||||
|
}
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * call-seq:
|
||||||
|
+ * digest.digest_size -> integer
|
||||||
|
+ *
|
||||||
|
+ * Returns the output size of the digest.
|
||||||
|
+ */
|
||||||
|
static VALUE
|
||||||
|
-ossl_digest_name(VALUE self)
|
||||||
|
+ossl_digest_size(VALUE self)
|
||||||
|
{
|
||||||
|
EVP_MD_CTX *ctx;
|
||||||
|
|
||||||
|
GetDigest(self, ctx);
|
||||||
|
|
||||||
|
- return rb_str_new2(EVP_MD_name(EVP_MD_CTX_md(ctx)));
|
||||||
|
+ return INT2NUM(EVP_MD_CTX_size(ctx));
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
@@ -258,41 +201,44 @@ ossl_digest_size(VALUE self)
|
-ossl_digest_size(VALUE self)
|
||||||
return INT2NUM(EVP_MD_CTX_size(ctx));
|
+ossl_digest_block_length(VALUE self)
|
||||||
|
{
|
||||||
|
EVP_MD_CTX *ctx;
|
||||||
|
|
||||||
|
GetDigest(self, ctx);
|
||||||
|
|
||||||
|
- return INT2NUM(EVP_MD_CTX_size(ctx));
|
||||||
|
+ return INT2NUM(EVP_MD_CTX_block_size(ctx));
|
||||||
}
|
}
|
||||||
|
|
||||||
+static VALUE
|
|
||||||
+ossl_digest_block_length(VALUE self)
|
|
||||||
+{
|
|
||||||
+ EVP_MD_CTX *ctx;
|
|
||||||
+
|
|
||||||
+ GetDigest(self, ctx);
|
|
||||||
+
|
|
||||||
+ return INT2NUM(EVP_MD_CTX_block_size(ctx));
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+
|
|
||||||
/*
|
/*
|
||||||
* INIT
|
@@ -264,31 +234,26 @@
|
||||||
*/
|
|
||||||
void
|
void
|
||||||
Init_ossl_digest()
|
Init_ossl_digest()
|
||||||
{
|
{
|
||||||
|
- mDigest = rb_define_module_under(mOSSL, "Digest");
|
||||||
+ rb_require("openssl");
|
+ rb_require("openssl");
|
||||||
+ rb_require("digest");
|
+ rb_require("digest");
|
||||||
+
|
+
|
||||||
#if 0 /* let rdoc know about mOSSL */
|
+#if 0 /* let rdoc know about mOSSL */
|
||||||
mOSSL = rb_define_module("OpenSSL");
|
+ mOSSL = rb_define_module("OpenSSL");
|
||||||
#endif
|
+#endif
|
||||||
|
+
|
||||||
- mDigest = rb_define_module_under(mOSSL, "Digest");
|
+ cDigest = rb_define_class_under(mOSSL, "Digest", rb_path2class("Digest::Class"));
|
||||||
-
|
+ eDigestError = rb_define_class_under(cDigest, "DigestError", eOSSLError);
|
||||||
|
|
||||||
- eDigestError = rb_define_class_under(mDigest, "DigestError", eOSSLError);
|
- eDigestError = rb_define_class_under(mDigest, "DigestError", eOSSLError);
|
||||||
-
|
-
|
||||||
- cDigest = rb_define_class_under(mDigest, "Digest", rb_cObject);
|
- cDigest = rb_define_class_under(mDigest, "Digest", rb_cObject);
|
||||||
-
|
-
|
||||||
+ cDigest = rb_define_class_under(mOSSL, "Digest", rb_path2class("Digest::Class"));
|
|
||||||
+ eDigestError = rb_define_class_under(cDigest, "DigestError", eOSSLError);
|
|
||||||
+
|
|
||||||
rb_define_alloc_func(cDigest, ossl_digest_alloc);
|
rb_define_alloc_func(cDigest, ossl_digest_alloc);
|
||||||
- rb_define_singleton_method(cDigest, "digest", ossl_digest_s_digest, 2);
|
- rb_define_singleton_method(cDigest, "digest", ossl_digest_s_digest, 2);
|
||||||
- rb_define_singleton_method(cDigest, "hexdigest", ossl_digest_s_hexdigest, 2);
|
- rb_define_singleton_method(cDigest, "hexdigest", ossl_digest_s_hexdigest, 2);
|
||||||
|
|
@ -236,4 +371,3 @@ index 4096b09..b0308f0 100644
|
||||||
rb_define_method(cDigest, "name", ossl_digest_name, 0);
|
rb_define_method(cDigest, "name", ossl_digest_name, 0);
|
||||||
- rb_define_method(cDigest, "size", ossl_digest_size, 0);
|
- rb_define_method(cDigest, "size", ossl_digest_size, 0);
|
||||||
}
|
}
|
||||||
+
|
|
||||||
|
|
|
||||||
23
ruby-1.8.6.x-untainted_strings_can_be_tainted.patch
Normal file
23
ruby-1.8.6.x-untainted_strings_can_be_tainted.patch
Normal file
|
|
@ -0,0 +1,23 @@
|
||||||
|
--- ruby-1.8.6-p420/error.c.tainted 2008-08-04 12:16:55.000000000 +0900
|
||||||
|
+++ ruby-1.8.6-p420/error.c 2011-02-21 04:44:14.000000000 +0900
|
||||||
|
@@ -404,7 +404,6 @@
|
||||||
|
VALUE mesg = rb_attr_get(exc, rb_intern("mesg"));
|
||||||
|
|
||||||
|
if (NIL_P(mesg)) return rb_class_name(CLASS_OF(exc));
|
||||||
|
- if (OBJ_TAINTED(exc)) OBJ_TAINT(mesg);
|
||||||
|
return mesg;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -668,10 +667,9 @@
|
||||||
|
if (NIL_P(mesg)) return rb_class_name(CLASS_OF(exc));
|
||||||
|
StringValue(str);
|
||||||
|
if (str != mesg) {
|
||||||
|
- rb_iv_set(exc, "mesg", mesg = str);
|
||||||
|
+ OBJ_INFECT(str, mesg);
|
||||||
|
}
|
||||||
|
- if (OBJ_TAINTED(exc)) OBJ_TAINT(mesg);
|
||||||
|
- return mesg;
|
||||||
|
+ return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
@ -0,0 +1,29 @@
|
||||||
|
--- ruby-1.8.7-p330/lib/fileutils.rb 2010-06-08 15:31:50.000000000 +0900
|
||||||
|
+++ ruby-1.8.7-p334/lib/fileutils.rb 2011-02-18 21:18:10.000000000 +0900
|
||||||
|
@@ -658,10 +658,10 @@
|
||||||
|
# removing directories. This requires the current process is the
|
||||||
|
# owner of the removing whole directory tree, or is the super user (root).
|
||||||
|
#
|
||||||
|
- # WARNING: You must ensure that *ALL* parent directories are not
|
||||||
|
- # world writable. Otherwise this method does not work.
|
||||||
|
- # Only exception is temporary directory like /tmp and /var/tmp,
|
||||||
|
- # whose permission is 1777.
|
||||||
|
+ # WARNING: You must ensure that *ALL* parent directories cannot be
|
||||||
|
+ # moved by other untrusted users. For example, parent directories
|
||||||
|
+ # should not be owned by untrusted users, and should not be world
|
||||||
|
+ # writable except when the sticky bit set.
|
||||||
|
#
|
||||||
|
# WARNING: Only the owner of the removing directory tree, or Unix super
|
||||||
|
# user (root) should invoke this method. Otherwise this method does not
|
||||||
|
@@ -704,6 +704,11 @@
|
||||||
|
end
|
||||||
|
f.chown euid, -1
|
||||||
|
f.chmod 0700
|
||||||
|
+ unless fu_stat_identical_entry?(st, File.lstat(fullpath))
|
||||||
|
+ # TOC-to-TOU attack?
|
||||||
|
+ File.unlink fullpath
|
||||||
|
+ return
|
||||||
|
+ end
|
||||||
|
}
|
||||||
|
# ---- tree root is frozen ----
|
||||||
|
root = Entry_.new(path)
|
||||||
65
ruby-1.8.x-RHASH_SIZE-rb_hash_lookup-def.patch
Normal file
65
ruby-1.8.x-RHASH_SIZE-rb_hash_lookup-def.patch
Normal file
|
|
@ -0,0 +1,65 @@
|
||||||
|
Sat Apr 19 18:42:04 2008 Akinori MUSHA <knu@iDaemons.org>
|
||||||
|
|
||||||
|
* intern.h, hash.c (rb_hash_lookup): New internal function to
|
||||||
|
check if a key exists in a hash, ignoring #default; backported
|
||||||
|
from 1.9.
|
||||||
|
|
||||||
|
Thu Aug 30 08:24:18 2007 Tanaka Akira <akr@fsij.org>
|
||||||
|
|
||||||
|
* ruby.h (RHASH_TBL): defined for compatibility to 1.9.
|
||||||
|
* (RHASH_ITER_LEV): ditto.
|
||||||
|
* (RHASH_IFNONE): ditto.
|
||||||
|
* (RHASH_SIZE): ditto.
|
||||||
|
* (RHASH_EMPTY_P): ditto.
|
||||||
|
|
||||||
|
Index: ruby_1_8/ruby.h
|
||||||
|
===================================================================
|
||||||
|
--- ruby_1_8/ruby.h (revision 13310)
|
||||||
|
+++ ruby_1_8/ruby.h (revision 13311)
|
||||||
|
@@ -374,6 +374,11 @@
|
||||||
|
int iter_lev;
|
||||||
|
VALUE ifnone;
|
||||||
|
};
|
||||||
|
+#define RHASH_TBL(h) (RHASH(h)->tbl)
|
||||||
|
+#define RHASH_ITER_LEV(h) (RHASH(h)->iter_lev)
|
||||||
|
+#define RHASH_IFNONE(h) (RHASH(h)->ifnone)
|
||||||
|
+#define RHASH_SIZE(h) (RHASH(h)->tbl->num_entries)
|
||||||
|
+#define RHASH_EMPTY_P(h) (RHASH_SIZE(h) == 0)
|
||||||
|
|
||||||
|
struct RFile {
|
||||||
|
struct RBasic basic;
|
||||||
|
Index: ruby_1_8/hash.c
|
||||||
|
===================================================================
|
||||||
|
--- ruby_1_8/hash.c (revision 16077)
|
||||||
|
+++ ruby_1_8/hash.c (revision 16078)
|
||||||
|
@@ -454,6 +454,18 @@
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
+VALUE
|
||||||
|
+rb_hash_lookup(hash, key)
|
||||||
|
+ VALUE hash, key;
|
||||||
|
+{
|
||||||
|
+ VALUE val;
|
||||||
|
+
|
||||||
|
+ if (!st_lookup(RHASH(hash)->tbl, key, &val)) {
|
||||||
|
+ return Qnil; /* without Hash#default */
|
||||||
|
+ }
|
||||||
|
+ return val;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* call-seq:
|
||||||
|
* hsh.fetch(key [, default] ) => obj
|
||||||
|
Index: ruby_1_8/intern.h
|
||||||
|
===================================================================
|
||||||
|
--- ruby_1_8/intern.h (revision 16077)
|
||||||
|
+++ ruby_1_8/intern.h (revision 16078)
|
||||||
|
@@ -270,6 +270,7 @@
|
||||||
|
VALUE rb_hash_new _((void));
|
||||||
|
VALUE rb_hash_freeze _((VALUE));
|
||||||
|
VALUE rb_hash_aref _((VALUE, VALUE));
|
||||||
|
+VALUE rb_hash_lookup _((VALUE, VALUE));
|
||||||
|
VALUE rb_hash_aset _((VALUE, VALUE, VALUE));
|
||||||
|
VALUE rb_hash_delete_if _((VALUE));
|
||||||
|
VALUE rb_hash_delete _((VALUE,VALUE));
|
||||||
58
ruby-1.8.x-ext_tk-flatten-level-revert.patch
Normal file
58
ruby-1.8.x-ext_tk-flatten-level-revert.patch
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
Index: ruby-1.8-rev27736_trunk/ext/tk/lib/tk/pack.rb
|
||||||
|
===================================================================
|
||||||
|
--- ruby-1.8-rev27736_trunk/ext/tk/lib/tk/pack.rb (revision 27738)
|
||||||
|
+++ ruby-1.8-rev27736_trunk/ext/tk/lib/tk/pack.rb (working copy)
|
||||||
|
@@ -39,7 +39,23 @@
|
||||||
|
end
|
||||||
|
fail ArgumentError, 'no widget is given' if args.empty?
|
||||||
|
params = []
|
||||||
|
- args.flatten(1).each{|win| params.push(_epath(win))}
|
||||||
|
+
|
||||||
|
+ #args.flatten(1).each{|win| params.push(_epath(win))}
|
||||||
|
+ #
|
||||||
|
+ # flatten(level) is ruby >=1.8.7 feature, substituting
|
||||||
|
+ #
|
||||||
|
+ args_flatten_one = []
|
||||||
|
+ args.each {|args1|
|
||||||
|
+ if args1.is_a? Array then
|
||||||
|
+ args1.each {|args2|
|
||||||
|
+ args_flatten_one << args2
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ args_flatten_one << args1
|
||||||
|
+ end
|
||||||
|
+ }
|
||||||
|
+ args_flatten_one.each{|win| params.push(_epath(win))}
|
||||||
|
+
|
||||||
|
opts.each{|k, v|
|
||||||
|
params.push("-#{k}")
|
||||||
|
params.push(_epath(v)) # have to use 'epath' (hash_kv() is unavailable)
|
||||||
|
Index: ruby-1.8-rev27736_trunk/ext/tk/lib/tk/grid.rb
|
||||||
|
===================================================================
|
||||||
|
--- ruby-1.8-rev27736_trunk/ext/tk/lib/tk/grid.rb (revision 27738)
|
||||||
|
+++ ruby-1.8-rev27736_trunk/ext/tk/lib/tk/grid.rb (working copy)
|
||||||
|
@@ -63,7 +63,23 @@
|
||||||
|
end
|
||||||
|
fail ArgumentError, 'no widget is given' if args.empty?
|
||||||
|
params = []
|
||||||
|
- args.flatten(1).each{|win|
|
||||||
|
+
|
||||||
|
+ #args.flatten(1).each{|win|
|
||||||
|
+ #
|
||||||
|
+ # flatten(level) is ruby >=1.8.7 feature, substituting
|
||||||
|
+ #
|
||||||
|
+
|
||||||
|
+ args_flatten_one = []
|
||||||
|
+ args.each {|args1|
|
||||||
|
+ if args1.is_a? Array then
|
||||||
|
+ args1.each {|args2|
|
||||||
|
+ args_flatten_one << args2
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ args_flatten_one << args1
|
||||||
|
+ end
|
||||||
|
+ }
|
||||||
|
+ args_flatten_one.each{|win|
|
||||||
|
case win
|
||||||
|
when '-', ?- # RELATIVE PLACEMENT (increase columnspan)
|
||||||
|
params.push('-')
|
||||||
21
ruby-1.8.x-null-class-must-be-Qnil.patch
Normal file
21
ruby-1.8.x-null-class-must-be-Qnil.patch
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
Sun Mar 1 03:04:19 2009 Akinori MUSHA <knu@iDaemons.org>
|
||||||
|
|
||||||
|
* class.c (rb_singleton_class_clone): Qnil must be used for a null
|
||||||
|
class reference when we use NIL_P() to check class reference
|
||||||
|
validity. The bug was exposed by the spec test of Sequel.
|
||||||
|
|
||||||
|
* eval.c (ruby_init): Use NEW_CREF().
|
||||||
|
|
||||||
|
Index: ruby_1_8/class.c
|
||||||
|
===================================================================
|
||||||
|
--- ruby_1_8/class.c (revision 22678)
|
||||||
|
+++ ruby_1_8/class.c (revision 22679)
|
||||||
|
@@ -153,7 +153,7 @@
|
||||||
|
data.klass = obj;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
- data.klass = 0;
|
||||||
|
+ data.klass = Qnil;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
143
ruby.spec
143
ruby.spec
|
|
@ -1,6 +1,6 @@
|
||||||
%define rubyxver 1.8
|
%define rubyxver 1.8
|
||||||
%define rubyver 1.8.6
|
%define rubyver 1.8.6
|
||||||
%define _patchlevel 388
|
%define _patchlevel 420
|
||||||
%define dotpatchlevel %{?_patchlevel:.%{_patchlevel}}
|
%define dotpatchlevel %{?_patchlevel:.%{_patchlevel}}
|
||||||
%define patchlevel %{?_patchlevel:-p%{_patchlevel}}
|
%define patchlevel %{?_patchlevel:-p%{_patchlevel}}
|
||||||
%define arcver %{rubyver}%{?patchlevel}
|
%define arcver %{rubyver}%{?patchlevel}
|
||||||
|
|
@ -8,7 +8,9 @@
|
||||||
# This is required to ensure that noarch files puts under /usr/lib/... for
|
# This is required to ensure that noarch files puts under /usr/lib/... for
|
||||||
# multilib because ruby library is installed under /usr/{lib,lib64}/ruby anyway.
|
# multilib because ruby library is installed under /usr/{lib,lib64}/ruby anyway.
|
||||||
%define sitedir2 %{_prefix}/lib/ruby/site_ruby
|
%define sitedir2 %{_prefix}/lib/ruby/site_ruby
|
||||||
%define _normalized_cpu %(echo `echo %{_target_cpu} | sed 's/^ppc/powerpc/' | sed -e 's|i.86|i386|'`)
|
%define _normalized_cpu %(echo `echo %{_target_cpu} | sed 's/^ppc/powerpc/' | sed -e 's|i.86|i386|'`)
|
||||||
|
|
||||||
|
%define tk_using_svn_number 27738
|
||||||
|
|
||||||
# emacs sitelisp directory
|
# emacs sitelisp directory
|
||||||
%{!?_emacs_sitelispdir: %global _emacs_sitelispdir %{_datadir}/emacs/site-lisp}
|
%{!?_emacs_sitelispdir: %global _emacs_sitelispdir %{_datadir}/emacs/site-lisp}
|
||||||
|
|
@ -16,8 +18,7 @@
|
||||||
|
|
||||||
Name: ruby
|
Name: ruby
|
||||||
Version: %{rubyver}%{?dotpatchlevel}
|
Version: %{rubyver}%{?dotpatchlevel}
|
||||||
# 8.1 is not built yet (not needed because 8 is already untagged)
|
Release: 3%{?dist}
|
||||||
Release: 8%{?dist}.1
|
|
||||||
License: Ruby or GPLv2
|
License: Ruby or GPLv2
|
||||||
URL: http://www.ruby-lang.org/
|
URL: http://www.ruby-lang.org/
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
||||||
|
|
@ -40,7 +41,14 @@ Source2: ftp://ftp.ruby-lang.org/pub/%{name}/doc/rubyfaq-990927.tar.gz
|
||||||
Source3: ftp://ftp.ruby-lang.org/pub/%{name}/doc/rubyfaq-jp-990927.tar.gz
|
Source3: ftp://ftp.ruby-lang.org/pub/%{name}/doc/rubyfaq-jp-990927.tar.gz
|
||||||
Source4: irb.1
|
Source4: irb.1
|
||||||
Source10: ruby-mode-init.el
|
Source10: ruby-mode-init.el
|
||||||
|
#
|
||||||
|
# Source100: contains ext/tk directory of the head of ruby_1_8 branch
|
||||||
|
# i.e. http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_8
|
||||||
|
# see bug 560053, 590503, and
|
||||||
|
# http://lists.fedoraproject.org/pipermail/ruby-sig/2010-May/000096.html
|
||||||
|
Source100: ruby-1.8-rev%{tk_using_svn_number}_trunk-ext_tk.tar.gz
|
||||||
|
|
||||||
|
# Patch1 - Patch23 are Fedora specific
|
||||||
Patch1: ruby-deadcode.patch
|
Patch1: ruby-deadcode.patch
|
||||||
Patch20: ruby-1.8.6-p383-rubyprefix.patch
|
Patch20: ruby-1.8.6-p383-rubyprefix.patch
|
||||||
Patch21: ruby-deprecated-sitelib-search-path.patch
|
Patch21: ruby-deprecated-sitelib-search-path.patch
|
||||||
|
|
@ -48,17 +56,51 @@ Patch22: ruby-deprecated-search-path.patch
|
||||||
Patch23: ruby-multilib.patch
|
Patch23: ruby-multilib.patch
|
||||||
# Needed in 1.8.6-p287, no longer needed in 1.8.6-p368?
|
# Needed in 1.8.6-p287, no longer needed in 1.8.6-p368?
|
||||||
#Patch25: ruby-1.8.6.111-gcc43.patch
|
#Patch25: ruby-1.8.6.111-gcc43.patch
|
||||||
Patch26: ruby-1.8.6-rexml-CVE-2008-3790.patch
|
# ruby_1_8 branch rev 19320, 20121, bug 460134
|
||||||
|
# Included in 1.8.6 p368
|
||||||
|
#Patch26: ruby-1.8.6-rexml-CVE-2008-3790.patch
|
||||||
|
# Patch27, 28 could not be found in the upstream VCS
|
||||||
|
# Need checking??
|
||||||
Patch27: ruby-1.8.6-p287-CVE-2008-5189.patch
|
Patch27: ruby-1.8.6-p287-CVE-2008-5189.patch
|
||||||
Patch28: ruby-1.8.6-p287-remove-ssl-rand-range.patch
|
Patch28: ruby-1.8.6-p287-remove-ssl-rand-range.patch
|
||||||
|
# Fedora specific
|
||||||
|
# Change the directory of sitearchdir from i?86 to i386 for upgrade path
|
||||||
Patch29: ruby-always-use-i386.patch
|
Patch29: ruby-always-use-i386.patch
|
||||||
|
# By Tomas Mraz, "seems" already in ruby_1_8 branch head
|
||||||
|
# (but have not checked yet in detail)
|
||||||
Patch30: ruby-openssl-1.0.patch
|
Patch30: ruby-openssl-1.0.patch
|
||||||
|
# bug 528787, patch from in ruby_1_8 branch
|
||||||
Patch31: ruby-1.8.6-p369-ri-gem_multipath.patch
|
Patch31: ruby-1.8.6-p369-ri-gem_multipath.patch
|
||||||
# Patch32 from ruby_1_8 branch
|
# bug 518584, ruby issue 1556, patch from ruby_1_8??? branch
|
||||||
Patch32: ruby-1.8head-irb-save-history.patch
|
Patch32: ruby-1.8head-irb-save-history.patch
|
||||||
|
# bug 428384, Fedora specific, however needed for Fedora's static
|
||||||
|
# archive policy
|
||||||
Patch33: ruby-1.8.6-p383-mkmf-use-shared.patch
|
Patch33: ruby-1.8.6-p383-mkmf-use-shared.patch
|
||||||
# Testing
|
# bug 559158, Simplify the OpenSSL::Digest class
|
||||||
Patch34: ruby-1.8.6-simplify-openssl-digest.patch
|
# Applying Patch34 needs reversing Patch39 part
|
||||||
|
Patch34: ruby-1.8.6-simplify-openssl-digest.patch
|
||||||
|
# bug 580993, patch from ruby_1_8_7 branch
|
||||||
|
Patch35: ruby_1_8_7-gc-open4_096segv.patch
|
||||||
|
#
|
||||||
|
# Patch36, 37: needed to use the head of ext/tk directory of ruby_1_8 branch head
|
||||||
|
# Patch36: taken from ruby_1_8 branch, RHASH_SIZE definition is needed
|
||||||
|
# for ruby_1_8 head ext/tk
|
||||||
|
# With this change, rb_hash_lookup becomes also needed for rubygem-nokogiri
|
||||||
|
# (bug 592936)
|
||||||
|
Patch36: ruby-1.8.x-RHASH_SIZE-rb_hash_lookup-def.patch
|
||||||
|
# Patch37: flatten(level) feature is in >= 1.8.7, reverting
|
||||||
|
Patch37: ruby-1.8.x-ext_tk-flatten-level-revert.patch
|
||||||
|
# From ruby_1_8 branch: bz 530407
|
||||||
|
# bz 530407 reproducible with 1.8.7p174, not with 1.8.7p249
|
||||||
|
Patch38: ruby-1.8.x-null-class-must-be-Qnil.patch
|
||||||
|
# Once revert this patch to apply Patch34 cleanly
|
||||||
|
Patch39: ruby-1.8.6-openssl-digest-once-revert-for-simplify-patch.patch
|
||||||
|
# patch from ruby_1_8_7 branch (between 1.8.7p330 and 1.8.7p334)
|
||||||
|
# bug 678913, Symlink race condition in FileUtils.remove_entry_secure
|
||||||
|
Patch40: ruby-1.8.7p334-symlink-race-in-FileUtils-remove_entry_secure.patch
|
||||||
|
# Patch from ruby_1_8_7 branch, a bit modified for 1.8.6.x
|
||||||
|
# bug 678920, bypass of $SAFE mechanism in Exception#to_s
|
||||||
|
Patch41: ruby-1.8.6.x-untainted_strings_can_be_tainted.patch
|
||||||
|
|
||||||
Summary: An interpreter of object-oriented scripting language
|
Summary: An interpreter of object-oriented scripting language
|
||||||
Group: Development/Languages
|
Group: Development/Languages
|
||||||
|
|
@ -178,12 +220,19 @@ along with a list of the methods the class or module implements.
|
||||||
|
|
||||||
|
|
||||||
%prep
|
%prep
|
||||||
%setup -q -c -a 2 -a 3
|
%setup -q -c -a 2 -a 3 -a 100
|
||||||
mkdir -p ruby-refm-ja
|
mkdir -p ruby-refm-ja
|
||||||
pushd ruby-refm-ja
|
pushd ruby-refm-ja
|
||||||
tar fxz %{SOURCE1}
|
tar fxz %{SOURCE1}
|
||||||
popd
|
popd
|
||||||
pushd %{name}-%{arcver}
|
pushd %{name}-%{arcver}
|
||||||
|
|
||||||
|
( cd ext
|
||||||
|
mv tk .tk.old
|
||||||
|
cp -a ../../ruby-1.8-rev*/ext/tk tk
|
||||||
|
find tk -type d -name \.svn | sort -r | xargs rm -rf
|
||||||
|
)
|
||||||
|
|
||||||
%patch1 -p1
|
%patch1 -p1
|
||||||
%patch20 -p1
|
%patch20 -p1
|
||||||
%patch21 -p1
|
%patch21 -p1
|
||||||
|
|
@ -191,8 +240,8 @@ pushd %{name}-%{arcver}
|
||||||
%patch22 -p1
|
%patch22 -p1
|
||||||
%patch23 -p1
|
%patch23 -p1
|
||||||
%endif
|
%endif
|
||||||
#%patch25 -p1
|
#%%patch25 -p1
|
||||||
#%patch26 -p1
|
#%%patch26 -p1
|
||||||
%patch27 -p0
|
%patch27 -p0
|
||||||
%patch28 -p1
|
%patch28 -p1
|
||||||
%patch29 -p1
|
%patch29 -p1
|
||||||
|
|
@ -200,9 +249,15 @@ pushd %{name}-%{arcver}
|
||||||
%patch31 -p1
|
%patch31 -p1
|
||||||
%patch32 -p0
|
%patch32 -p0
|
||||||
%patch33 -p1
|
%patch33 -p1
|
||||||
|
# To apply patch34, patch39 part must once be reverted
|
||||||
# Once kill patch34 due to build failure on actionpack
|
%patch39 -p1 -R
|
||||||
#%%patch34 -p1
|
%patch34 -p1
|
||||||
|
%patch35 -p1
|
||||||
|
%patch36 -p1
|
||||||
|
%patch37 -p1
|
||||||
|
%patch38 -p1
|
||||||
|
%patch40 -p1
|
||||||
|
%patch41 -p1
|
||||||
popd
|
popd
|
||||||
|
|
||||||
%build
|
%build
|
||||||
|
|
@ -214,7 +269,10 @@ autoconf
|
||||||
|
|
||||||
rb_cv_func_strtod=no
|
rb_cv_func_strtod=no
|
||||||
export rb_cv_func_strtod
|
export rb_cv_func_strtod
|
||||||
|
|
||||||
|
# bug 489990
|
||||||
CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing"
|
CFLAGS="$RPM_OPT_FLAGS -fno-strict-aliasing"
|
||||||
|
|
||||||
export CFLAGS
|
export CFLAGS
|
||||||
%configure \
|
%configure \
|
||||||
--with-sitedir='%{sitedir}' \
|
--with-sitedir='%{sitedir}' \
|
||||||
|
|
@ -351,6 +409,18 @@ for i in `find -type f ! -name "*.gif"`; do
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# fix Japanese encoding strings for ruby-tcltk/ext/tk/sample/
|
||||||
|
pushd ruby-tcltk/ext/tk/
|
||||||
|
cd sample
|
||||||
|
find . -path ./demos-jp/\*.rb -or -path ./tkoptdb\*.rb -or -path ./msgs_rb2/ja.msg | \
|
||||||
|
xargs sed -i -e 's|euc-jp|utf-8|'
|
||||||
|
sed -i \
|
||||||
|
-e '/KCODE =/s|euc|utf-8|' -e 's|EUC-JP|UTF-8|' \
|
||||||
|
demos-jp/widget
|
||||||
|
cd ..
|
||||||
|
sed -i -e 's|EUC-JP|UTF-8|' README.1st
|
||||||
|
popd
|
||||||
|
|
||||||
# done
|
# done
|
||||||
cd ..
|
cd ..
|
||||||
|
|
||||||
|
|
@ -448,12 +518,8 @@ rm -rf $RPM_BUILD_ROOT
|
||||||
%dir %{_prefix}/lib/ruby
|
%dir %{_prefix}/lib/ruby
|
||||||
%dir %{_prefix}/lib/ruby/%{rubyxver}
|
%dir %{_prefix}/lib/ruby/%{rubyxver}
|
||||||
%ifnarch ppc64 s390x sparc64 x86_64
|
%ifnarch ppc64 s390x sparc64 x86_64
|
||||||
%if "%{_gnu}" == "-gnueabi"
|
|
||||||
%dir %{_prefix}/lib/ruby/%{rubyxver}/%{_normalized_cpu}-%{_target_os}-eabi
|
|
||||||
%else
|
|
||||||
%dir %{_prefix}/lib/ruby/%{rubyxver}/%{_normalized_cpu}-%{_target_os}
|
%dir %{_prefix}/lib/ruby/%{rubyxver}/%{_normalized_cpu}-%{_target_os}
|
||||||
%endif
|
%endif
|
||||||
%endif
|
|
||||||
%ifarch ppc64 s390x sparc64 x86_64
|
%ifarch ppc64 s390x sparc64 x86_64
|
||||||
%dir %{_libdir}/ruby
|
%dir %{_libdir}/ruby
|
||||||
%dir %{_libdir}/ruby/%{rubyxver}
|
%dir %{_libdir}/ruby/%{rubyxver}
|
||||||
|
|
@ -578,6 +644,47 @@ rm -rf $RPM_BUILD_ROOT
|
||||||
%{_emacs_sitestartdir}/ruby-mode-init.el
|
%{_emacs_sitestartdir}/ruby-mode-init.el
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Feb 21 2011 Dennis Gilmore <dennis@ausil.us> - 1.8.6-420-2
|
||||||
|
- drop the unneeded -eabi stuff its not used anywhere
|
||||||
|
|
||||||
|
* Mon Feb 21 2011 Mamoru Tasaka <mtasaka@ioa.s.u-tokyo.ac.jp> - 1.8.6.420-2
|
||||||
|
- Backport 2 fixes from 1.8.7p420
|
||||||
|
- Symlink race condition in FileUtils.remove_entry_secure (bug 678913)
|
||||||
|
- bypass of $SAFE mechanism in Exception#to_s (bug 678920)
|
||||||
|
|
||||||
|
* Sun Dec 26 2010 Mamoru Tasaka <mtasaka@ioa.s.u-tokyo.ac.jp> - 1.8.6.420-1
|
||||||
|
- Update to 1.8.6 p420
|
||||||
|
|
||||||
|
* Mon Aug 23 2010 Mamoru Tasaka <mtasaka@ioa.s.u-tokyo.ac.jp> - 1.8.6.399-6
|
||||||
|
- Apply upstream patch for CVE-2010-0541 (bug 587731)
|
||||||
|
|
||||||
|
* Wed May 19 2010 Mamoru Tasaka <mtasaka@ioa.s.u-tokyo.ac.jp> - 1.8.6.399-5
|
||||||
|
- Retry for bug 559158, Simplify the OpenSSL::Digest class
|
||||||
|
pull more change commits from ruby_1_8 branch
|
||||||
|
|
||||||
|
* Mon May 17 2010 Mamoru Tasaka <mtasaka@ioa.s.u-tokyo.ac.jp> - 1.8.6.399-4
|
||||||
|
- Patch36 (ruby-1.8.x-RHASH_SIZE-rb_hash_lookup-def.patch)
|
||||||
|
also backport rb_hash_lookup definition (bug 592936)
|
||||||
|
|
||||||
|
* Thu May 13 2010 Mamoru Tasaka <mtasaka@ioa.s.u-tokyo.ac.jp> - 1.8.6.399-3
|
||||||
|
- ruby-1.8.x-null-class-must-be-Qnil.patch (bug 530407)
|
||||||
|
- Recreate some patches using upstream svn when available, and
|
||||||
|
add some comments for patches
|
||||||
|
|
||||||
|
* Tue May 11 2010 Mamoru Tasaka <mtasaka@ioa.s.u-tokyo.ac.jp> - 1.8.6.399-2
|
||||||
|
- tcltk: Give up using potentially unmaintained ruby_1_8_6 branch
|
||||||
|
and instead completely replace with ruby_1_8 branch head
|
||||||
|
(at this time, using rev 27738)
|
||||||
|
(seems to fix 560053, 590503)
|
||||||
|
- Fix Japanese encoding strings under ruby-tcltk/ext/tk/sample/
|
||||||
|
|
||||||
|
* Tue Apr 27 2010 Mamoru Tasaka <mtasaka@ioa.s.u-tokyo.ac.jp> - 1.8.6.399-1
|
||||||
|
- Update to 1.8.6 p 399 (bug 579675)
|
||||||
|
- Patch to fix gc bug causing open4 crash (bug 580993)
|
||||||
|
|
||||||
|
* Fri Mar 12 2010 Mamoru Tasaka <mtasaka@ioa.s.u-tokyo.ac.jp> - 1.8.6.388-9
|
||||||
|
- F-14: rebuild against new gdbm
|
||||||
|
|
||||||
* Thu Jan 28 2010 Mamoru Tasaka <mtasaka@ioa.s.u-tokyo.ac.jp>
|
* Thu Jan 28 2010 Mamoru Tasaka <mtasaka@ioa.s.u-tokyo.ac.jp>
|
||||||
- Once revert the previous change (patch34)
|
- Once revert the previous change (patch34)
|
||||||
|
|
||||||
|
|
|
||||||
351
ruby_1_8_7-gc-open4_096segv.patch
Normal file
351
ruby_1_8_7-gc-open4_096segv.patch
Normal file
|
|
@ -0,0 +1,351 @@
|
||||||
|
Index: ruby_1_8_7/marshal.c
|
||||||
|
===================================================================
|
||||||
|
--- ruby_1_8_7/marshal.c (revision 26075)
|
||||||
|
+++ ruby_1_8_7/marshal.c (revision 26076)
|
||||||
|
@@ -85,12 +85,10 @@
|
||||||
|
static ID s_getc, s_read, s_write, s_binmode;
|
||||||
|
|
||||||
|
struct dump_arg {
|
||||||
|
- VALUE obj;
|
||||||
|
VALUE str, dest;
|
||||||
|
st_table *symbols;
|
||||||
|
st_table *data;
|
||||||
|
int taint;
|
||||||
|
- VALUE wrapper;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct dump_call_arg {
|
||||||
|
@@ -104,22 +102,32 @@
|
||||||
|
struct dump_arg *arg;
|
||||||
|
ID sym;
|
||||||
|
{
|
||||||
|
- if (!DATA_PTR(arg->wrapper)) {
|
||||||
|
+ if (!arg->symbols) {
|
||||||
|
rb_raise(rb_eRuntimeError, "Marshal.dump reentered at %s",
|
||||||
|
rb_id2name(sym));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void clear_dump_arg _((struct dump_arg *arg));
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
mark_dump_arg(ptr)
|
||||||
|
void *ptr;
|
||||||
|
{
|
||||||
|
struct dump_arg *p = ptr;
|
||||||
|
- if (!ptr)
|
||||||
|
+ if (!p->symbols)
|
||||||
|
return;
|
||||||
|
rb_mark_set(p->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+free_dump_arg(ptr)
|
||||||
|
+ void *ptr;
|
||||||
|
+{
|
||||||
|
+ clear_dump_arg(ptr);
|
||||||
|
+ xfree(ptr);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static VALUE
|
||||||
|
class2path(klass)
|
||||||
|
VALUE klass;
|
||||||
|
@@ -699,32 +707,17 @@
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-static VALUE
|
||||||
|
-dump(arg)
|
||||||
|
- struct dump_call_arg *arg;
|
||||||
|
-{
|
||||||
|
- w_object(arg->obj, arg->arg, arg->limit);
|
||||||
|
- if (arg->arg->dest) {
|
||||||
|
- rb_io_write(arg->arg->dest, arg->arg->str);
|
||||||
|
- rb_str_resize(arg->arg->str, 0);
|
||||||
|
- }
|
||||||
|
- return 0;
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static VALUE
|
||||||
|
-dump_ensure(arg)
|
||||||
|
+static void
|
||||||
|
+clear_dump_arg(arg)
|
||||||
|
struct dump_arg *arg;
|
||||||
|
{
|
||||||
|
- if (!DATA_PTR(arg->wrapper)) return 0;
|
||||||
|
+ if (!arg->symbols) return;
|
||||||
|
st_free_table(arg->symbols);
|
||||||
|
+ arg->symbols = 0;
|
||||||
|
st_free_table(arg->data);
|
||||||
|
- DATA_PTR(arg->wrapper) = 0;
|
||||||
|
- arg->wrapper = 0;
|
||||||
|
if (arg->taint) {
|
||||||
|
OBJ_TAINT(arg->str);
|
||||||
|
}
|
||||||
|
-
|
||||||
|
- return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -760,8 +753,8 @@
|
||||||
|
{
|
||||||
|
VALUE obj, port, a1, a2;
|
||||||
|
int limit = -1;
|
||||||
|
- struct dump_arg arg;
|
||||||
|
- struct dump_call_arg c_arg;
|
||||||
|
+ struct dump_arg *arg;
|
||||||
|
+ VALUE wrapper;
|
||||||
|
|
||||||
|
port = Qnil;
|
||||||
|
rb_scan_args(argc, argv, "12", &obj, &a1, &a2);
|
||||||
|
@@ -775,37 +768,40 @@
|
||||||
|
else if (NIL_P(a1)) goto type_error;
|
||||||
|
else port = a1;
|
||||||
|
}
|
||||||
|
- arg.dest = 0;
|
||||||
|
- arg.symbols = st_init_numtable();
|
||||||
|
- arg.data = st_init_numtable();
|
||||||
|
- arg.taint = Qfalse;
|
||||||
|
- arg.str = rb_str_buf_new(0);
|
||||||
|
- RBASIC(arg.str)->klass = 0;
|
||||||
|
- arg.wrapper = Data_Wrap_Struct(rb_cData, mark_dump_arg, 0, &arg);
|
||||||
|
+ wrapper = Data_Make_Struct(rb_cData, struct dump_arg, mark_dump_arg, free_dump_arg, arg);
|
||||||
|
+ arg->dest = 0;
|
||||||
|
+ arg->symbols = st_init_numtable();
|
||||||
|
+ arg->data = st_init_numtable();
|
||||||
|
+ arg->taint = Qfalse;
|
||||||
|
+ arg->str = rb_str_buf_new(0);
|
||||||
|
+ RBASIC(arg->str)->klass = 0;
|
||||||
|
if (!NIL_P(port)) {
|
||||||
|
if (!rb_respond_to(port, s_write)) {
|
||||||
|
type_error:
|
||||||
|
rb_raise(rb_eTypeError, "instance of IO needed");
|
||||||
|
}
|
||||||
|
- arg.dest = port;
|
||||||
|
+ arg->dest = port;
|
||||||
|
if (rb_respond_to(port, s_binmode)) {
|
||||||
|
rb_funcall2(port, s_binmode, 0, 0);
|
||||||
|
- check_dump_arg(&arg, s_binmode);
|
||||||
|
+ check_dump_arg(arg, s_binmode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
- port = arg.str;
|
||||||
|
+ port = arg->str;
|
||||||
|
}
|
||||||
|
|
||||||
|
- c_arg.obj = obj;
|
||||||
|
- c_arg.arg = &arg;
|
||||||
|
- c_arg.limit = limit;
|
||||||
|
+ w_byte(MARSHAL_MAJOR, arg);
|
||||||
|
+ w_byte(MARSHAL_MINOR, arg);
|
||||||
|
|
||||||
|
- w_byte(MARSHAL_MAJOR, &arg);
|
||||||
|
- w_byte(MARSHAL_MINOR, &arg);
|
||||||
|
+ w_object(obj, arg, limit);
|
||||||
|
+ if (arg->dest) {
|
||||||
|
+ rb_io_write(arg->dest, arg->str);
|
||||||
|
+ rb_str_resize(arg->str, 0);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- rb_ensure(dump, (VALUE)&c_arg, dump_ensure, (VALUE)&arg);
|
||||||
|
- RBASIC(arg.str)->klass = rb_cString;
|
||||||
|
+ RBASIC(arg->str)->klass = rb_cString;
|
||||||
|
+ clear_dump_arg(arg);
|
||||||
|
+ RB_GC_GUARD(wrapper);
|
||||||
|
|
||||||
|
return port;
|
||||||
|
}
|
||||||
|
@@ -817,7 +813,6 @@
|
||||||
|
st_table *data;
|
||||||
|
VALUE proc;
|
||||||
|
int taint;
|
||||||
|
- VALUE wrapper;
|
||||||
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
@@ -825,22 +820,31 @@
|
||||||
|
struct load_arg *arg;
|
||||||
|
ID sym;
|
||||||
|
{
|
||||||
|
- if (!DATA_PTR(arg->wrapper)) {
|
||||||
|
+ if (!arg->symbols) {
|
||||||
|
rb_raise(rb_eRuntimeError, "Marshal.load reentered at %s",
|
||||||
|
rb_id2name(sym));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void clear_load_arg _((struct load_arg *arg));
|
||||||
|
+
|
||||||
|
static void
|
||||||
|
mark_load_arg(ptr)
|
||||||
|
void *ptr;
|
||||||
|
{
|
||||||
|
struct load_arg *p = ptr;
|
||||||
|
- if (!ptr)
|
||||||
|
+ if (!p->symbols)
|
||||||
|
return;
|
||||||
|
rb_mark_tbl(p->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+free_load_arg(void *ptr)
|
||||||
|
+{
|
||||||
|
+ clear_load_arg(ptr);
|
||||||
|
+ xfree(ptr);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static VALUE r_object _((struct load_arg *arg));
|
||||||
|
|
||||||
|
static int
|
||||||
|
@@ -1415,23 +1419,14 @@
|
||||||
|
return r_object0(arg, arg->proc, 0, Qnil);
|
||||||
|
}
|
||||||
|
|
||||||
|
-static VALUE
|
||||||
|
-load(arg)
|
||||||
|
+static void
|
||||||
|
+clear_load_arg(arg)
|
||||||
|
struct load_arg *arg;
|
||||||
|
{
|
||||||
|
- return r_object(arg);
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
-static VALUE
|
||||||
|
-load_ensure(arg)
|
||||||
|
- struct load_arg *arg;
|
||||||
|
-{
|
||||||
|
- if (!DATA_PTR(arg->wrapper)) return 0;
|
||||||
|
+ if (!arg->symbols) return;
|
||||||
|
st_free_table(arg->symbols);
|
||||||
|
+ arg->symbols = 0;
|
||||||
|
st_free_table(arg->data);
|
||||||
|
- DATA_PTR(arg->wrapper) = 0;
|
||||||
|
- arg->wrapper = 0;
|
||||||
|
- return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -1451,35 +1446,37 @@
|
||||||
|
VALUE *argv;
|
||||||
|
{
|
||||||
|
VALUE port, proc;
|
||||||
|
- int major, minor;
|
||||||
|
- VALUE v;
|
||||||
|
- struct load_arg arg;
|
||||||
|
+ int major, minor, taint = Qfalse;
|
||||||
|
+ VALUE v, wrapper;
|
||||||
|
+ struct load_arg *arg;
|
||||||
|
|
||||||
|
rb_scan_args(argc, argv, "11", &port, &proc);
|
||||||
|
v = rb_check_string_type(port);
|
||||||
|
if (!NIL_P(v)) {
|
||||||
|
- arg.taint = OBJ_TAINTED(port); /* original taintedness */
|
||||||
|
+ taint = OBJ_TAINTED(port); /* original taintedness */
|
||||||
|
port = v;
|
||||||
|
}
|
||||||
|
else if (rb_respond_to(port, s_getc) && rb_respond_to(port, s_read)) {
|
||||||
|
if (rb_respond_to(port, s_binmode)) {
|
||||||
|
rb_funcall2(port, s_binmode, 0, 0);
|
||||||
|
}
|
||||||
|
- arg.taint = Qtrue;
|
||||||
|
+ taint = Qtrue;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
rb_raise(rb_eTypeError, "instance of IO needed");
|
||||||
|
}
|
||||||
|
- arg.src = port;
|
||||||
|
- arg.offset = 0;
|
||||||
|
- arg.symbols = st_init_numtable();
|
||||||
|
- arg.data = st_init_numtable();
|
||||||
|
- arg.proc = 0;
|
||||||
|
- arg.wrapper = Data_Wrap_Struct(rb_cData, mark_load_arg, 0, &arg);
|
||||||
|
+ wrapper = Data_Make_Struct(rb_cData, struct load_arg, mark_load_arg, free_load_arg, arg);
|
||||||
|
+ arg->src = port;
|
||||||
|
+ arg->offset = 0;
|
||||||
|
+ arg->symbols = st_init_numtable();
|
||||||
|
+ arg->data = st_init_numtable();
|
||||||
|
+ arg->proc = 0;
|
||||||
|
+ arg->taint = taint;
|
||||||
|
|
||||||
|
- major = r_byte(&arg);
|
||||||
|
- minor = r_byte(&arg);
|
||||||
|
+ major = r_byte(arg);
|
||||||
|
+ minor = r_byte(arg);
|
||||||
|
if (major != MARSHAL_MAJOR || minor > MARSHAL_MINOR) {
|
||||||
|
+ clear_load_arg(arg);
|
||||||
|
rb_raise(rb_eTypeError, "incompatible marshal file format (can't be read)\n\
|
||||||
|
\tformat version %d.%d required; %d.%d given",
|
||||||
|
MARSHAL_MAJOR, MARSHAL_MINOR, major, minor);
|
||||||
|
@@ -1490,8 +1487,10 @@
|
||||||
|
MARSHAL_MAJOR, MARSHAL_MINOR, major, minor);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!NIL_P(proc)) arg.proc = proc;
|
||||||
|
- v = rb_ensure(load, (VALUE)&arg, load_ensure, (VALUE)&arg);
|
||||||
|
+ if (!NIL_P(proc)) arg->proc = proc;
|
||||||
|
+ v = r_object(arg);
|
||||||
|
+ clear_load_arg(arg);
|
||||||
|
+ RB_GC_GUARD(wrapper);
|
||||||
|
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
Index: ruby_1_8_7/test/ruby/test_marshal.rb
|
||||||
|
===================================================================
|
||||||
|
--- ruby_1_8_7/test/ruby/test_marshal.rb (revision 26075)
|
||||||
|
+++ ruby_1_8_7/test/ruby/test_marshal.rb (revision 26076)
|
||||||
|
@@ -71,4 +71,41 @@
|
||||||
|
}
|
||||||
|
assert_equal("marshal data too short", e.message)
|
||||||
|
end
|
||||||
|
+
|
||||||
|
+ class DumpTest
|
||||||
|
+ def marshal_dump
|
||||||
|
+ loop { Thread.pass }
|
||||||
|
+ end
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
+ class LoadTest
|
||||||
|
+ def marshal_dump
|
||||||
|
+ nil
|
||||||
|
+ end
|
||||||
|
+ def marshal_load(obj)
|
||||||
|
+ loop { Thread.pass }
|
||||||
|
+ end
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
+ def test_context_switch
|
||||||
|
+ o = DumpTest.new
|
||||||
|
+ Thread.new { Marshal.dump(o) }
|
||||||
|
+ GC.start
|
||||||
|
+ assert(true, '[ruby-dev:39425]')
|
||||||
|
+
|
||||||
|
+ o = LoadTest.new
|
||||||
|
+ m = Marshal.dump(o)
|
||||||
|
+ Thread.new { Marshal.load(m) }
|
||||||
|
+ GC.start
|
||||||
|
+ assert(true, '[ruby-dev:39425]')
|
||||||
|
+ end
|
||||||
|
+
|
||||||
|
+ def test_taint
|
||||||
|
+ x = Object.new
|
||||||
|
+ x.taint
|
||||||
|
+ s = Marshal.dump(x)
|
||||||
|
+ assert_equal(true, s.tainted?)
|
||||||
|
+ y = Marshal.load(s)
|
||||||
|
+ assert_equal(true, y.tainted?)
|
||||||
|
+ end
|
||||||
|
end
|
||||||
|
Index: ruby_1_8_7/ruby.h
|
||||||
|
===================================================================
|
||||||
|
--- ruby_1_8_7/ruby.h (revision 16014)
|
||||||
|
+++ ruby_1_8_7/ruby.h (revision 16015)
|
||||||
|
@@ -224,6 +224,8 @@
|
||||||
|
|
||||||
|
#define TYPE(x) rb_type((VALUE)(x))
|
||||||
|
|
||||||
|
+#define RB_GC_GUARD(v) (*(volatile VALUE *)&(v))
|
||||||
|
+
|
||||||
|
void rb_check_type _((VALUE,int));
|
||||||
|
#define Check_Type(v,t) rb_check_type((VALUE)(v),t)
|
||||||
|
|
||||||
3
sources
3
sources
|
|
@ -1,4 +1,5 @@
|
||||||
f26cefbc8ab6728650ab9ae773d22bcb ruby-1.8.6-p388.tar.bz2
|
|
||||||
b6dd396f513efeb7864685c840f9643a ruby-refm-rdp-1.8.2-ja-html.tar.gz
|
b6dd396f513efeb7864685c840f9643a ruby-refm-rdp-1.8.2-ja-html.tar.gz
|
||||||
634c25b14e19925d10af3720d72e8741 rubyfaq-990927.tar.gz
|
634c25b14e19925d10af3720d72e8741 rubyfaq-990927.tar.gz
|
||||||
4fcec898f51d8371cc42d0a013940469 rubyfaq-jp-990927.tar.gz
|
4fcec898f51d8371cc42d0a013940469 rubyfaq-jp-990927.tar.gz
|
||||||
|
6a8313c73087513f24e52d8cee5b3804 ruby-1.8-rev27738_trunk-ext_tk.tar.gz
|
||||||
|
1c7a978e9ffd4f56dc2ad74bbd2c34f3 ruby-1.8.6-p420.tar.bz2
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue