Lỗi phân tách OS X OpenSSL khét tiếng của Ruby 1.9.3 trong http.rb: 799


3

[Bài viết rút ngắn và cập nhật với một câu trả lời.]

Ruby 1.9.3 được biên dịch trên OS X 10.7.4 với MacPorts gặp sự cố trong ứng dụng Rails của tôi khi sử dụng SSL trong http.rb, ví dụ: khi xác thực với 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]

Lưu ý: Đây là một giải pháp thực sự cho vấn đề segfault, không phải là giải pháp thử-yêu thích-thay thế-ruby-cài đặt-du-jour. Tôi không muốn sửa đổi một nửa hệ thống của mình trên nửa tá máy phát và sản xuất bằng cách cài đặt RVM, rbenv, Homebrew hoặc bất cứ thứ gì khác. Tôi cũng muốn chỉ ra cách tôi tìm thấy sự cố vì điều này có thể xảy ra với bất kỳ trình cài đặt Ruby nào.

Một số điều tôi lưu ý khi dùng thử và lỗi:

  • Biên dịch OpenSSL và Ruby bằng cách sử dụng --with-openssl-dir=/usr hoặc là ..=/opt/local đã không giúp được gì.
  • Sau khi biên dịch lại Ruby 1.9 bằng cách sử dụng / opt / local dưới dạng openssl-dir, ngoài nhiều thứ khác bài đăng trên web , Tôi có thể chạy kết nối SSL dựa trên dòng lệnh tốt. Tuy nhiên, SSL kết nối trong các dự án Rails của tôi vẫn bị rơi.
  • Backtrace mà OS X lưu trong /Library/Logs/CrashReporter dấu vết của libssl.1.0.0.dylib (Cổng thông tin) libssl.0.9.8.dylib (HĐH X). Nhưng tất cả các tệp MacPorts của tôi được liên kết với OpenSSL 1.0.x. ( find /opt/local -iname "*.dylib" | xargs otool -L là bạn của bạn!)
  • Điều này chỉ xảy ra trên các ứng dụng trực tiếp của tôi. Không phải trên ứng dụng mới trinh tiết.
  • Điều này chỉ xảy ra khi sử dụng pg Đá quý Postgres có chứa phần mở rộng bản địa.

Nhìn vào gói của PG gem:

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

Đá quý PG không liên kết với MacPorts libpq! Và:

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

... libpq của OSX (tất nhiên!) Liên kết với OS X libssllibcrypto. Chơi lô tô!

Giải pháp: RTFM! README-OS_X của PG nói:

Nếu bạn cần cài đặt tùy chỉnh PostgreSQL, bạn nên đảm bảo rằng bạn biên dịch nó theo cùng phiên bản OpenSSL như phần mở rộng OpenSSL của Ruby mà bạn sẽ sử dụng hoặc biên dịch nó mà không cần hỗ trợ SSL. Nếu bạn không làm điều này, bạn có thể sẽ thấy segfaults ...

Vì thế:

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

Bingo, vấn đề được giải quyết.

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

Nếu gói của bạn không tham chiếu phiên bản đá quý pg mới nhất hiện tại, thì bạn sẽ cần chỉ định phiên bản khi cài đặt lại, ví dụ:

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

Bạn có thể cần phải gửi một lỗi trong trình theo dõi vấn đề Homebrew ...
D.W.

Tôi không sử dụng Homebrew, xin lỗi nếu điều đó không rõ ràng trong câu hỏi của tôi.
Jens

Câu trả lời:


1

Xem ở trên - đá quý PG là thủ phạm. Rõ ràng, nó tự động biên dịch dựa trên các thư viện Postgres (9.0) tích hợp sẵn của OS X, tất nhiên được biên dịch theo OSSS dựng sẵn OpenSSL.

Một khi tôi thấy đây là lý do, việc khắc phục là không đáng kể. Không cần phải cài đặt RVM, rbenv, Homebrew hoặc bất cứ thứ gì khác. Chỉ cần biên dịch lại đá quý PG ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.