3 votes

L'infâme défaut OpenSSL de Ruby 1.9.3 pour OS X dans http.rb:799

[Post abrégé et mis à jour avec une réponse].

Ruby 1.9.3 compilé sur OS X 10.7.4 avec MacPorts plante dans mes applications Rails lorsque j'utilise SSL dans http.rb, par exemple lors de l'authentification sur 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]

Remarque : il s'agit d'une véritable solution au problème de segfault, et non d'une solution de type "try-my-favorite-alternative-ruby-installer-du-jour". Je ne voulais pas modifier la moitié de mon système sur une demi-douzaine de machines devel et de production en installant RVM, rbenv, Homebrew ou autre. Je veux aussi montrer comment j'ai trouvé le problème car cela peut se produire avec n'importe quel installateur de Ruby.

J'ai appris certaines choses par essais et erreurs :

  • Compiler OpenSSL et Ruby en utilisant --with-openssl-dir=/usr o ..=/opt/local n'a pas aidé.
  • Après avoir recompilé Ruby 1.9 en utilisant /opt/local comme répertoire openssl, à part dans de nombreux autres cas, il n'y a pas eu d'amélioration. messages sur le web J'ai pu établir des connexions SSL à partir de la ligne de commande. Cependant, les connexions SSL dans mes projets Rails s'écrasaient toujours.
  • Le backtrace de crash que OS X enregistre dans /Library/Logs/CrashReporter contenait des traces de libssl.1.0.0.dylib (MacPorts) y libssl.0.9.8.dylib (OS X). Mais tous mes fichiers MacPorts étaient liés à OpenSSL 1.0.x. ( find /opt/local -iname "*.dylib" | xargs otool -L est votre ami)
  • Cela ne s'est produit que sur mes applications en direct. Pas sur les nouvelles applications vierges.
  • Cela ne s'est produit que lors de l'utilisation de la pg Gemme Postgres qui contient des extensions natives.

Je regarde le paquet de la gemme 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 gemme PG n'est pas liée à la gemme MacPorts libpq ! Et :

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

... La libpq d'OSX (bien sûr !) est liée à la libpq d'OS X. libssl y libcrypto . Bingo !

Solution : RTFM ! Le README-OS_X de PG dit :

Si vous avez besoin d'une installation personnalisée de PostgreSQL, vous devez vous assurer de le compiler avec la même version d'OpenSSL que l'extension OpenSSL du Ruby que vous utiliserez, ou de le compiler sans le support SSL. Si vous ne le faites pas, vous verrez probablement des erreurs de segmentation ...

Donc :

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

Bingo, problème résolu.

$ 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 votre paquet ne fait pas référence à la dernière version de la gemme pg, vous devrez spécifier la version lors de la réinstallation, par ex.

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

1voto

Cyler Points 117

Voir ci-dessus - la gemme PG était le coupable. Apparemment, elle compile automatiquement avec les librairies Postgres (9.0) intégrées à OS X, qui sont bien sûr compilées avec OpenSSL intégré à OS X.

Une fois que j'ai découvert que c'était la raison, la correction a été triviale. Pas besoin d'installer RVM, rbenv, Homebrew ou quoi que ce soit d'autre. Il suffit de recompiler la gemme PG ...

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X