Rails active_record_store & Segmentation fault
Posted by Bhushan Ahire | Posted in Rails, Security | Posted on 25-02-2008
0
Here’s a quick tip if you’re getting errors like this one in your Rails application:
/usr/local/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/session/active_record_store.rb:84: [BUG] Segmentation fault
The most probable reason you’re getting the Segmentation fault and your server crashes is because you’re trying to store too much data in sessions table of your application (I assume you are using active_record_store as a session store).
The problem with “too much data” is that by default, the session table creation rake task created the following migration in Rails 1.x:
class AddSessions < ActiveRecord::Migration
def self.upcreate_table :sessions do |t|
t.column :session_id, :string
t.column :data, :text
t.column :updated_at, :datetime
end
add_index :sessions, :session_id
enddef self.down
drop_table :sessions
end
end
Please note the data field defined as text. This means that it can only store up to 64Kb of data. And that also means that if you’re trying to store more than 64Kb in your session.
In order to fix the problem, you just need to manually change the column type before you run migration which creates session store, or just create a new migration which changes parameters of the data column in existing sessions table:
Should look something like that (Rails 2 syntax):
class CreateSessions < ActiveRecord::Migration
def self.updrop_table :sessions
create_table :sessions do |t|
t.string :session_id, :null => false
t.column :data, :binary, :limit => 10.megabyte
t.timestamps
endadd_index :sessions, :session_id
add_index :sessions, :updated_at
enddef self.down
drop_table :sessions
end
end
Empty your sessions table, restart your server and you’re done. No more segmentation faults. Of course you shouldn’t store that much data in a session in the first place.
