ruby / fiddle

A libffi wrapper for Ruby.
BSD 2-Clause "Simplified" License
154 stars 37 forks source link

Unreachable code path in Fiddle::ValueUtil#wrap_arg #124

Open Maumagnaguagno opened 1 year ago

Maumagnaguagno commented 1 year ago

In Fiddle::ValueUtil#wrap_arg there is a long case-when for arg with an unreachable code path. When arg and ty are of Array type, and ty[0] is TYPE_CHAR, there is another condition, for arg to be String at Line 101. Even if this condition is fixed, val is undefined at Line 102 for this method. https://github.com/ruby/fiddle/blob/04238cefed14a433f93909bd93dbe1d0a4efc47e/lib/fiddle/value.rb#L95-L106

Should Lines 100-103 be removed?

kou commented 1 year ago

Can you create a script that uses 101 and share it to us?

Maumagnaguagno commented 1 year ago
require 'fiddle/value'

c = Class.new.extend(Fiddle::ValueUtil)
p c.wrap_arg(['55','0'],[Fiddle::TYPE_VOIDP]) # Line  99
p c.wrap_arg(['test'],[Fiddle::TYPE_CHAR])    # Line 106
kou commented 1 year ago

Ah, could you use normal API instead of directly using wrap_arg? It seems that lib/fiddle/struct.rb uses wrap_arg.

Maumagnaguagno commented 1 year ago

Unfortunately I am not that familiar with Fiddle structs to make a valid minimal example to reach that point. I just noticed the loose variable val and that arg needs to be both Array and String at the same time.

kou commented 1 year ago

OK. I'll take a look at this later.