Before anything else: This bug is marked as "grave", because it
"renders package unusable". Dmitry, I'd downgrade the bug's severity,
as the package is perfectly usable as long as you don't raise
$SAFE. Of course, it _is_ a bug, and it _should_ be fixed, but I don't
see it as grave.
Umh... I'm trying to tackle this, but am still at loss - Anyway, I
think sharing this might help towards finding the solution. First of
all, look what $SAFE and SecurityError means [1].
I am starting with this minimal invocation as a test case:
$ ruby -e '$:.unshift("./lib"); $SAFE=1;require"tidy"; html="";
xml=Tidy.open{|t| t.clean(html)}'
My first guess was, of course, that the set_error_buffer (which is an
"extern" definition - it calls the tidySetErrorBuffer library
function) was getting a tainted parameter. This confirmed it:
--- a/lib/tidy/tidyobj.rb
+++ b/lib/tidy/tidyobj.rb
@@ -28,6 +28,7 @@ class Tidyobj
@errbuf = Tidybuf.new
@outbuf = Tidybuf.new
@options = Tidyopt.new(@doc)
+ warn "*** Doc: [EMAIL PROTECTED] Errbuf: [EMAIL PROTECTED] Struct: [EMAIL
PROTECTED]"
rc = Tidylib.set_error_buffer(@doc, @errbuf.struct)
verify_severe(rc)
unless options.nil?
I got this line just before the SecurityError exception is raised:
*** Doc: true Errbuf: false Struct: false
Now, on to untaint the TidyLib C object:
--- a/lib/tidy/tidylib.rb
+++ b/lib/tidy/tidylib.rb
@@ -38,7 +38,9 @@ module Tidylib
# tidyCreate
#
def create
- tidyCreate
+ lib = tidyCreate
+ lib.untaint
+ lib
end
# tidyCleanAndRepair
However, this still fails. My debugging line _does_ change, it is now:
*** Doc: false Errbuf: false Struct: false
Still, it fails just after it, in the set_error_buffer function, whose
body is exactly:
def set_error_buffer(doc, buf
tidySetErrorBuffer(doc, buf)
end
I get the same behaviour. Still, I'm a lazy and sloppy programmer, so
I added a couple extra warnings as debugging aids:
--- a/lib/tidy/tidylib.rb
+++ b/lib/tidy/tidylib.rb
@@ -99,7 +101,9 @@ module Tidylib
# tidySetErrorBuffer
#
def set_error_buffer(doc, buf)
+ warn "*** Getting #{doc.class}: #{doc.tainted?}, #{buf.class},
#{buf.tainted?}"
tidySetErrorBuffer(doc, buf)
+ warn "...still alive"
end
# Convert to string, replace underscores with dashes (:output_xml =>
'output-xml').
Still, it continues dying:
$ ruby -e '$:.unshift("./lib"); $SAFE=1;require"tidy"; html="";
xml=Tidy.open{|t| t.clean(html)}'
*** Doc: false Errbuf: false Struct: false
*** Getting DL::PtrData: false, DL::Importable::Internal::Memory, false
(eval):5:in `call': Insecure operation - call (SecurityError)
from (eval):5:in `tidySetErrorBuffer'
from ./lib/tidy/tidylib.rb:105:in `set_error_buffer'
from ./lib/tidy/tidyobj.rb:32:in `initialize'
from ./lib/tidy.rb:36:in `new'
from ./lib/tidy.rb:36:in `new'
from ./lib/tidy.rb:56:in `open'
from -e:1
As you can see in my previous patch, nothing besides doc and buf is
invoked here.
Now, buf comes from Tidybuf, which is also C-based
(DL::Importable::Internal::Memory). And... This is where I am stuck: I
can untaint Tidybuf as an object, but not its contents or
results. And, being it a buffer, it _does_ make sense that the data it
generates is considered tainted.
...So, I cannot dig any further :-/ But I hope this information can
help someone else.
Greetings,
[1] http://www.rubycentral.com/pickaxe/taint.html
--
Gunnar Wolf - [EMAIL PROTECTED] - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF
--
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]