Skip to content

Entering a literal null byte causes a crash and subsequent session history-load errors #1789

Description

@owst

On Ubuntu 16.04 x64, with xterm and Pry version 0.11.3 on Ruby 2.4.4 I accidentally entered a literal null byte when typing a string value in pry (by hitting Ctrl-space) - pry immediately crashed, and when I reload it, refuses to load the history as it contains a null byte:

(I held ctrl while first typing the space below, so it appeared as if I hadn't added one)

$ pry             
[1] pry(main)> x = 'foo bar'
~/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/pry-0.11.3/lib/pry/history.rb:117:in `<<': string contains null byte (ArgumentError)
from ~/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/pry-0.11.3/lib/pry/history.rb:117:in `push_to_readline'
from ~/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/pry-0.11.3/lib/pry/history.rb:48:in `call'
from ~/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/pry-0.11.3/lib/pry/history.rb:48:in `push'
from ~/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/pry-0.11.3/lib/pry/pry_instance.rb:267:in `handle_line'
from ~/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/pry-0.11.3/lib/pry/pry_instance.rb:243:in `block (2 levels) in eval'
from ~/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/pry-0.11.3/lib/pry/pry_instance.rb:242:in `catch'
from ~/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/pry-0.11.3/lib/pry/pry_instance.rb:242:in `block in eval'
from ~/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/pry-0.11.3/lib/pry/pry_instance.rb:241:in `catch'
from ~/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/pry-0.11.3/lib/pry/pry_instance.rb:241:in `eval'
from ~/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/pry-0.11.3/lib/pry/repl.rb:77:in `block in repl'
from ~/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/pry-0.11.3/lib/pry/repl.rb:67:in `loop'
from ~/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/pry-0.11.3/lib/pry/repl.rb:67:in `repl'
from ~/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/pry-0.11.3/lib/pry/repl.rb:38:in `block in start'
from ~/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/pry-0.11.3/lib/pry/input_lock.rb:61:in `__with_ownership'
from ~/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/pry-0.11.3/lib/pry/input_lock.rb:79:in `with_ownership'
from ~/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/pry-0.11.3/lib/pry/repl.rb:38:in `start'
from ~/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/pry-0.11.3/lib/pry/repl.rb:13:in `start'
from ~/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/pry-0.11.3/lib/pry/pry_class.rb:192:in `start'
from ~/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/pry-byebug-3.6.0/lib/pry-byebug/pry_ext.rb:11:in `start_with_pry_byebug'
from ~/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/pry-0.11.3/lib/pry/cli.rb:116:in `start'
from ~/.rbenv/versions/2.4.4/lib/ruby/gems/2.4.0/gems/pry-0.11.3/bin/pry:12:in `<top (required)>'
from ~/.rbenv/versions/2.4.4/bin/pry:23:in `load'
from ~/.rbenv/versions/2.4.4/bin/pry:23:in `<main>'

and now, pry apparently refuses to load my history:

$ pry
History file not loaded: string contains null byte
[1] pry(main)>     

On master as of today (ef80932bc66ca8a03f970d24280a77af30293489) pry crashes rather than reporting that it can't load history:

$ bundle exec bin/pry
bundler: failed to load command: bin/pry (bin/pry)
ArgumentError: string contains null byte
  ~/code/pry/lib/pry/history.rb:117:in `<<'
  ~/code/pry/lib/pry/history.rb:117:in `push_to_readline'
  ~/code/pry/lib/pry/history.rb:37:in `call'
  ~/code/pry/lib/pry/history.rb:37:in `block in load'
  ~/code/pry/lib/pry/history.rb:108:in `block in read_from_file'
  ~/code/pry/lib/pry/history.rb:108:in `foreach'
  ~/code/pry/lib/pry/history.rb:108:in `read_from_file'
  ~/code/pry/lib/pry/history.rb:36:in `call'
  ~/code/pry/lib/pry/history.rb:36:in `load'
  ~/code/pry/lib/pry/pry_class.rb:243:in `load_history'
  ~/code/pry/lib/pry/pry_class.rb:147:in `final_session_setup'
  ~/code/pry/lib/pry/cli.rb:84:in `parse_options'
  bin/pry:11:in `<top (required)>'

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions