tonytonyjan / jaro_winkler

Ruby & C implementation of Jaro-Winkler distance algorithm which supports UTF-8 string.
MIT License
192 stars 29 forks source link

Segmentation fault on nil string #24

Closed CodyZeusLiving closed 5 years ago

CodyZeusLiving commented 5 years ago

Calling the distance function with a nil argument causes a segmentation fault.

Example stack trace:

-- Ruby level backtrace information ----------------------------------------
/Users/codyhunt/.rvm/rubies/ruby-2.5.1/bin/irb:11:in `<main>'
/Users/codyhunt/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb.rb:383:in `start'
/Users/codyhunt/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb.rb:427:in `run'
/Users/codyhunt/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb.rb:427:in `catch'
/Users/codyhunt/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb.rb:428:in `block in run'
/Users/codyhunt/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb.rb:487:in `eval_input'
/Users/codyhunt/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb/ruby-lex.rb:231:in `each_top_level_statement'
/Users/codyhunt/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb/ruby-lex.rb:231:in `catch'
/Users/codyhunt/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb/ruby-lex.rb:232:in `block in each_top_level_statement'
/Users/codyhunt/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb/ruby-lex.rb:232:in `loop'
/Users/codyhunt/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb/ruby-lex.rb:246:in `block (2 levels) in each_top_level_statement'
/Users/codyhunt/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb.rb:488:in `block in eval_input'
/Users/codyhunt/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb.rb:623:in `signal_status'
/Users/codyhunt/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb.rb:491:in `block (2 levels) in eval_input'
/Users/codyhunt/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb/context.rb:380:in `evaluate'
/Users/codyhunt/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb/workspace.rb:85:in `evaluate'
/Users/codyhunt/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/irb/workspace.rb:85:in `eval'
(irb):4:in `irb_binding'
(irb):4:in `distance'

-- Machine register context ------------------------------------------------
 rax: 0x00007fc1a556d280 rbx: 0x0000000000000008 rcx: 0x0000000000000000
 rdx: 0x0000000000000002 rdi: 0x00007ffee9f58db8 rsi: 0x0000000000000008
 rbp: 0x00007ffee9f58da0 rsp: 0x00007ffee9f58d60  r8: 0x0000000000000000
  r9: 0x000000000000000f r10: 0x00007fc1a7248f90 r11: 0x0000000000000002
 r12: 0x0000000000000002 r13: 0x00000001061f5730 r14: 0x00007ffee9f58db8
 r15: 0x000000010606a308 rip: 0x00000001061f513b rfl: 0x0000000000010206

-- C level backtrace information -------------------------------------------
0   libruby.2.5.dylib                   0x0000000105eac497 rb_vm_bugreport + 135
1   libruby.2.5.dylib                   0x0000000105d232b3 rb_bug_context + 467
2   libruby.2.5.dylib                   0x0000000105e198b1 sigsegv + 81
3   libsystem_platform.dylib            0x00007fff7458ab3d _sigtramp + 29
4   jaro_winkler_ext.bundle             0x00000001061f513b codepoints_init + 27
5   jaro_winkler_ext.bundle             0x00000001061f59b5 distance + 197
6   libruby.2.5.dylib                   0x0000000105e9ef84 vm_call_cfunc + 292
7   libruby.2.5.dylib                   0x0000000105e8667e vm_exec_core + 13262
8   libruby.2.5.dylib                   0x0000000105e99620 vm_exec + 144
9   libruby.2.5.dylib                   0x0000000105ea84cd eval_string_with_cref + 1437
10  libruby.2.5.dylib                   0x0000000105e9503a rb_f_eval + 234
11  libruby.2.5.dylib                   0x0000000105e9ef84 vm_call_cfunc + 292
12  libruby.2.5.dylib                   0x0000000105e8667e vm_exec_core + 13262
13  libruby.2.5.dylib                   0x0000000105e99620 vm_exec + 144
14  libruby.2.5.dylib                   0x0000000105ea76ca invoke_block_from_c_bh + 378
15  libruby.2.5.dylib                   0x0000000105ea8803 loop_i + 35
16  libruby.2.5.dylib                   0x0000000105d2d9d7 rb_rescue2 + 311
17  libruby.2.5.dylib                   0x0000000105e9ef84 vm_call_cfunc + 292
18  libruby.2.5.dylib                   0x0000000105e85bc4 vm_exec_core + 10516
19  libruby.2.5.dylib                   0x0000000105e99620 vm_exec + 144
20  libruby.2.5.dylib                   0x0000000105ea76ca invoke_block_from_c_bh + 378
21  libruby.2.5.dylib                   0x0000000105ea879e catch_i + 78
22  libruby.2.5.dylib                   0x0000000105e961ed vm_catch_protect + 173
23  libruby.2.5.dylib                   0x0000000105e969c4 rb_f_catch + 68
24  libruby.2.5.dylib                   0x0000000105e9ef84 vm_call_cfunc + 292
25  libruby.2.5.dylib                   0x0000000105e85bc4 vm_exec_core + 10516
26  libruby.2.5.dylib                   0x0000000105e99620 vm_exec + 144
27  libruby.2.5.dylib                   0x0000000105ea76ca invoke_block_from_c_bh + 378
28  libruby.2.5.dylib                   0x0000000105ea879e catch_i + 78
29  libruby.2.5.dylib                   0x0000000105e961ed vm_catch_protect + 173
30  libruby.2.5.dylib                   0x0000000105e969c4 rb_f_catch + 68
31  libruby.2.5.dylib                   0x0000000105e9ef84 vm_call_cfunc + 292
32  libruby.2.5.dylib                   0x0000000105e85bc4 vm_exec_core + 10516
33  libruby.2.5.dylib                   0x0000000105e99620 vm_exec + 144
34  libruby.2.5.dylib                   0x0000000105d2d311 ruby_exec_internal + 177
35  libruby.2.5.dylib                   0x0000000105d2d208 ruby_run_node + 56
36  ruby                                0x0000000105ca4f2f main + 79

I think this could be fixed by checking for nil arguments and setting them to the empty string instead.

tonytonyjan commented 5 years ago

@CodyZeusLiving thanks for making the gem better :)