Il famigerato OS X OpenSSL segfault di Ruby 1.9.3 in http.rb: 799

3

[Post abbreviato e aggiornato con una risposta.]

Ruby 1.9.3 compilato su OS X 10.7.4 con MacPorts si blocca nelle mie app Rails quando si utilizza SSL in http.rb, ad es. durante l'autenticazione su Facebook:

(facebook) Callback phase initiated.
/opt/local/lib/ruby1.9/1.9.1/net/http.rb:799: [BUG] Segmentation fault
ruby 1.9.3p194 (2012-04-20 revision 35410) [x86_64-darwin11]

Nota: questa è una soluzione reale al problema segfault, non una soluzione try-my-favorite-alternative-ruby-installer-du-jour. Non volevo modificare metà del mio sistema su una mezza dozzina di macchine di sviluppo e produzione installando RVM, rbenv, Homebrew o qualsiasi altra cosa. Voglio anche mostrare come ho trovato il problema poiché questo può verificarsi con qualsiasi programma di installazione di Ruby.

Alcune cose che ho notato per tentativi ed errori:

  • Compilare OpenSSL e Ruby usando --with-openssl-dir=/usr o ..=/opt/local non ha aiutato.
  • Dopo aver ricompilato Ruby 1.9 usando / opt / local come openssl-dir, oltre che in numerosi altri post sul Web , potrei eseguire collegamenti basati su SSL dalla riga di comando. Tuttavia, SSL collega nei miei progetti Rails stavano ancora andando in crash.
  • Il crash backtrace che OS X salva in /Library/Logs/CrashReporter contiene tracce di libssl.1.0.0.dylib (MacPorts) e libssl.0.9.8.dylib (OS X). Ma tutti i miei file MacPorts erano collegati a OpenSSL 1.0.x. ( find /opt/local -iname "*.dylib" | xargs otool -L è tuo amico!)
  • Questo si è verificato solo sulle mie app live. Non su nuove app vergini.
  • Questo si è verificato solo quando si utilizzava la gemma Postgres pg che contiene estensioni native.

Guardando il pacchetto della gemma PG:

$ otool -L /opt/local/lib/ruby1.9/gems/1.9.1/gems/pg-0.14.1/lib/pg_ext.bundle 
/opt/local/lib/ruby1.9/gems/1.9.1/gems/pg-0.14.1/lib/pg_ext.bundle:
/opt/local/lib/libruby.1.9.1.dylib (compatibility version 1.9.1, current version 1.9.1)
/usr/lib/libpq.5.dylib (compatibility version 5.0.0, current version 5.3.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 159.1.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)

La gemma PG non si collega al libpq di MacPorts! E:

Jens ~/Sites/testapp$ otool -L /usr/lib/libpq.5.dylib
/usr/lib/libpq.5.dylib:
/usr/lib/libpq.5.dylib (compatibility version 5.0.0, current version 5.3.0)
/usr/lib/libssl.0.9.8.dylib (compatibility version 0.9.8, current version 44.0.0)
/usr/lib/libcrypto.0.9.8.dylib (compatibility version 0.9.8, current version 44.0.0)
    (...)

... i libpq di OSX (ovviamente!) si collegano ai libssl e libcrypto di OS X. Bingo!

Soluzione: RTFM! README-OS_X di PG dice:

If you need a custom installation of PostgreSQL, you should ensure that you either compile it against the same version of OpenSSL as the OpenSSL extension of the Ruby you'll be using, or compile it without SSL support. If you fail to do this, you will likely see segfaults ...

sudo gem install pg -- --with-pg-config=/opt/local/lib/postgresql83/bin/pg_config

Bingo, problema risolto.

$ bundle exec rails runner "require 'net/http'; require 'net/https'; h=Net::HTTP.new('gmail.com', 443); h.use_ssl=true; puts h.get('/');"
#<Net::HTTPMovedPermanently:0x007fe48d5590a0>

Se il tuo bundle non fa riferimento alla versione più recente di pg gem, dovrai specificare la versione quando si reinstalla, ad es.

gem install pg -v 0.13.2 -- --with-pg-config=/opt/local/lib/postgresql91/bin/pg_config
    
posta Jens 09.09.2012 - 14:09
fonte

1 risposta

1

Vedi sopra - la gemma PG era il colpevole. Apparentemente, si compila automaticamente contro le librerie Postgres (9.0) integrate di OS X, che sono ovviamente compilate con OS X incorporato in OpenSSL.

Una volta trovato questo motivo, la correzione era banale. Non è necessario installare RVM, rbenv, Homebrew o qualsiasi altra cosa. Basta ricompilare la gemma PG ...

    
risposta data 10.09.2012 - 22:21
fonte

Leggi altre domande sui tag