Skip to content

Passenger does not work with ruby frozen-string-literal #2619

@stevenboyd

Description

@stevenboyd

Ruby is moving toward having literal strings frozen by default[1][2]. Currently passenger has many instances where it mutates a literal string. This will break in future version of ruby where literal strings are frozen, and currently breaks apps that try and run with frozen-string-literal enabled.

I tested this with the latest version of passenger (6.0.27) with rails 7.1.5 on ruby 3.1.3 and rails 8.0.2 on ruby 3.2.2. I am on Mac OSX 15.4.

I found a bunch of cases where string literals were mutated, and started to try and fix them. But I was unable to get very far since I couldn't get the dev environment setup for passenger. Hopefully this helps someone else get started.

STEPS TO REPRODUCE

SETUP

Generate a new rails app:
rails new my_app
cd my_app

Add passenger to the Gemfile:
gem "passenger", "~> 6.0.27", require: "phusion_passenger/rack_handler"

Bundle install to install passenge:
bundle install

Run passenger with frozen-string-literal enabled:
RUBYOPT="--enable=frozen_string_literal" bundle exec passenger start

OBSERVED BEHAVIOR

Passenger fails to start with a FrozenError in the passenger code.

bundler: failed to load command: passenger (/Users/steven.boyd/.asdf/installs/ruby/3.2.2/bin/passenger)
/Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/passenger-6.0.27/src/ruby_supportlib/phusion_passenger.rb:192:in `block in <module:PhusionPassenger>': can't modify frozen String: "" (FrozenError)
	from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/passenger-6.0.27/src/ruby_supportlib/phusion_passenger.rb:191:in `each'
	from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/passenger-6.0.27/src/ruby_supportlib/phusion_passenger.rb:191:in `<module:PhusionPassenger>'
	from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/passenger-6.0.27/src/ruby_supportlib/phusion_passenger.rb:26:in `<top (required)>'
	from <internal:/Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require'
	from <internal:/Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/3.2.0/rubygems/core_ext/kernel_require.rb>:37:in `require'
	from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/passenger-6.0.27/bin/passenger:33:in `<top (required)>'
	from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/bin/passenger:25:in `load'
	from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/bin/passenger:25:in `<top (required)>'
	from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.6/lib/bundler/cli/exec.rb:58:in `load'
	from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.6/lib/bundler/cli/exec.rb:58:in `kernel_load'
	from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.6/lib/bundler/cli/exec.rb:23:in `run'
	from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.6/lib/bundler/cli.rb:491:in `exec'
	from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.6/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
	from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.6/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
	from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.6/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
	from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.6/lib/bundler/cli.rb:34:in `dispatch'
	from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.6/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
	from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.6/lib/bundler/cli.rb:28:in `start'
	from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.6/exe/bundle:45:in `block in <top (required)>'
	from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.6/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
	from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/lib/ruby/gems/3.2.0/gems/bundler-2.4.6/exe/bundle:33:in `<top (required)>'
	from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/bin/bundle:25:in `load'
	from /Users/steven.boyd/.asdf/installs/ruby/3.2.2/bin/bundle:25:in `<main>'

DESIRED BEHAVIOR

Passenger boots up and works with frozen-string-literal enabled.

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