el famoso Segfault OS X OpenSSL de Ruby 1.9.3 en http.rb: 799

3

[Publicación abreviada y actualizada con una respuesta.]

Ruby 1.9.3 compilado en OS X 10.7.4 con MacPorts se bloquea en mis aplicaciones Rails cuando uso SSL en http.rb, por ejemplo. al autenticar en 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: esta es una solución real para el problema de segfault, no una solución try-my-favorite-alternative-ruby-installer-du-jour. No quería modificar la mitad de mi Sistema en media docena de máquinas de desarrollo y producción instalando RVM, rbenv, Homebrew o cualquier otra cosa. También quiero mostrar cómo encontré el problema, ya que esto puede ocurrir con cualquier instalador de Ruby.

Algunas cosas que noté por prueba y error:

  • Compilar OpenSSL y Ruby utilizando --with-openssl-dir=/usr o ..=/opt/local no ayudó.
  • Después de volver a compilar Ruby 1.9 utilizando / opt / local como openssl-dir, aparte de muchos otros publicaciones en la web , podría ejecutar conexiones basadas en SSL desde la multa de la línea de comandos. Sin embargo, SSL se conecta en mis proyectos de Rails y seguían fallando.
  • El rastreo de retroceso que OS X guarda en /Library/Logs/CrashReporter contenía trazas de libssl.1.0.0.dylib (MacPorts) y libssl.0.9.8.dylib (OS X). Pero todos mis archivos MacPorts fueron vinculados contra OpenSSL 1.0.x. ( find /opt/local -iname "*.dylib" | xargs otool -L es tu amigo!)
  • Esto ocurrió solo en mis aplicaciones en vivo. No en aplicaciones nuevas y vírgenes.
  • Esto ocurrió solo al usar la gema pg Postgres que contiene extensiones nativas.

Mirando el paquete de la gema 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 gema PG no se enlaza con libpq de MacPorts! Y:

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)
    (...)

... Los libpq de OSX (¡por supuesto!) se vinculan con libssl y libcrypto de OS X. Bingo!

Solución: RTFM! README-OS_X de PG dice:

  

Si necesita una instalación personalizada de PostgreSQL, debe asegurarse de compilarla con la misma versión de OpenSSL que la extensión OpenSSL de Ruby que usará, o compilarla sin soporte SSL. Si no lo haces, es probable que veas segfaults ...

Entonces:

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

Bingo, problema resuelto.

$ 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>

Si su paquete no hace referencia a la última versión de pg gem actual, deberá especificar la versión al reinstalar, por ejemplo,

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

1 respuesta

1

Ver más arriba - la gema PG fue la culpable. Aparentemente, se compila automáticamente contra las bibliotecas Postgres (9.0) incorporadas de OS X, que por supuesto se compilan contra OpenSSL integrado de OS X.

Una vez que encontré que esta era la razón, la solución era trivial. No es necesario instalar RVM, rbenv, Homebrew o cualquier otra cosa. Solo recompile la gema PG ...

    
respondido por el Jens 10.09.2012 - 22:21

Lea otras preguntas en las etiquetas