3 votos

Ruby 1.9.3 infame de OS X OpenSSL violación de segmento en http.rb:799

[Post acortado y actualizado con una respuesta.]

Ruby 1.9.3 compilado en OS X 10.7.4 con MacPorts se bloquea en mi Rieles de aplicaciones cuando se utiliza SSL de http.rb, por ejemplo, a la hora de autenticar a 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 violación de segmento, no una oportunidad-mi favorito-alternativa-ruby-installer-du-jour solución. Yo no quiero modificar la mitad de mi sistema en la mitad de una docena de devel y máquinas de producción mediante la instalación de RVM, rbenv tendremos, Homebrew o cualquier otra cosa. También quiero mostrar cómo me encontré con el problema, ya que esto puede ocurrir con cualquier Ruby instalador.

Algunas cosas que he notado por ensayo y error:

  • Compilación de OpenSSL y Ruby usando --with-openssl-dir=/usr o ..=/opt/local no ayuda.
  • Después de volver a compilar Ruby 1.9 uso de /opt/local como openssl-dir, otros que en muchos otros puestos en la web, yo podría correr SSL basado conecta desde la línea de comandos bien. Sin embargo, SSL se conecta en mi Rieles de proyectos seguían estrellándose.
  • El accidente se traza que OS X guarda en /Library/Logs/CrashReporter contenían restos de libssl.1.0.0.dylib (MacPorts) y libssl.0.9.8.dylib (OS X). Pero todos mis MacPorts archivos estaban vinculados en contra de OpenSSL 1.0.x. (find /opt/local -iname "*.dylib" | xargs otool -L es tu amigo!)
  • Esto ocurrió solamente en mis aplicaciones en vivo. No en la virgen de nuevas aplicaciones.
  • Esto ocurrió sólo cuando el uso de la pg Postgres joya que contiene extensiones nativas.

Buscando en la PG joya del paquete:

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

El PG gema no enlace con MacPorts s libpq! 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)
    (...)

... OSX del libpq (por supuesto!) enlaces en contra de OS X libssl y libcrypto. Bingo!

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

Si necesita una instalación personalizada de PostgreSQL, usted debe asegurarse de que usted compile contra la misma versión de OpenSSL como OpenSSL extensión de Ruby que vas a utilizar, o compilarlo sin soporte SSL. Si no lo haces, es probable que vea segfaults ...

Así:

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 actual, pg joya versión, entonces usted necesitará especificar la versión al volver a instalar, por ejemplo,

gem install pg -v 0.13.2 -- --with-pg-config=/opt/local/lib/postgresql91/bin/pg_config

1voto

deckoff Puntos 182

Ver arriba - PG joya era el culpable. Al parecer, se compila automáticamente en contra de las integradas en OS X Postgres (9.0), las bibliotecas, que son, por supuesto, compilado en contra de OS X builtin OpenSSL.

Una vez que encontré la razón, la revisión era trivial. No hay necesidad de instalar RVM, rbenv tendremos, Homebrew o cualquier otra cosa. Acaba de volver a compilar el PG joya ...

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X