diff options
author | Luke Kanies <luke@madstop.com> | 2009-02-11 14:33:48 -0600 |
---|---|---|
committer | James Turnbull <james@lovedthanlost.net> | 2009-02-12 07:39:11 +1100 |
commit | 319822af6d58c3e0c391e86cfd836ec31de43c67 (patch) | |
tree | 44c79a0ce0b767145837fa66d8e0888eaafff553 | |
parent | 6b0c1b9170c69829bdf5956d1dec0949dcc08b35 (diff) | |
download | puppet-319822af6d58c3e0c391e86cfd836ec31de43c67.tar.gz puppet-319822af6d58c3e0c391e86cfd836ec31de43c67.tar.xz puppet-319822af6d58c3e0c391e86cfd836ec31de43c67.zip |
Fixing #1869 - autoloaded files should never leak exceptions
Ruby's exception hierarchy is a bit strange, in that only
exceptions that sub RuntimeError are caught by default.
This patch explicitly catches the base class, Exception,
which means that LoadError, SyntaxError, and any
RuntimeErrors will all be caught.
This is done for both load() and loadall(); load() uses
Kernel.load, but loadall() uses Kernel.require.
Signed-off-by: Luke Kanies <luke@madstop.com>
-rw-r--r-- | CHANGELOG | 2 | ||||
-rw-r--r-- | lib/puppet/util/autoload.rb | 4 | ||||
-rwxr-xr-x | spec/unit/util/autoload.rb | 39 |
3 files changed, 43 insertions, 2 deletions
@@ -1,4 +1,6 @@ 0.24.8 + Fixing #1869 - autoloaded files should never leak exceptions + Fixing #1543 - Nagios parse errors no longer kill Puppet Fixed #1420 - nagios_serviceescalation not allowing host_name more than one type diff --git a/lib/puppet/util/autoload.rb b/lib/puppet/util/autoload.rb index 535d9ef2e..0c80f8b06 100644 --- a/lib/puppet/util/autoload.rb +++ b/lib/puppet/util/autoload.rb @@ -78,7 +78,7 @@ class Puppet::Util::Autoload name = symbolize(name) loaded name, file return true - rescue LoadError => detail + rescue Exception => detail # I have no idea what's going on here, but different versions # of ruby are raising different errors on missing files. unless detail.to_s =~ /^no such file/i @@ -115,7 +115,7 @@ class Puppet::Util::Autoload begin Kernel.require file loaded(name, file) - rescue => detail + rescue Exception => detail if Puppet[:trace] puts detail.backtrace end diff --git a/spec/unit/util/autoload.rb b/spec/unit/util/autoload.rb new file mode 100755 index 000000000..ff717d6c5 --- /dev/null +++ b/spec/unit/util/autoload.rb @@ -0,0 +1,39 @@ +#!/usr/bin/env ruby + +Dir.chdir(File.dirname(__FILE__)) { (s = lambda { |f| File.exist?(f) ? require(f) : Dir.chdir("..") { s.call(f) } }).call("spec/spec_helper.rb") } + +require 'puppet/util/autoload' + +describe Puppet::Util::Autoload do + before do + @autoload = Puppet::Util::Autoload.new("foo", "tmp") + + @autoload.stubs(:eachdir).yields "/my/dir" + end + + describe "when loading a file" do + [RuntimeError, LoadError, SyntaxError].each do |error| + it "should not die an if a #{error.to_s} exception is thrown" do + FileTest.stubs(:exists?).returns true + + Kernel.expects(:load).raises error + + lambda { @autoload.load("foo") }.should_not raise_error + end + end + end + + describe "when loading all files" do + before do + Dir.stubs(:glob).returns "file.rb" + end + + [RuntimeError, LoadError, SyntaxError].each do |error| + it "should not die an if a #{error.to_s} exception is thrown" do + Kernel.expects(:require).raises error + + lambda { @autoload.loadall }.should_not raise_error + end + end + end +end |