LWP で https + authorization_basic を使うと セグメンテーション違反する件

最終的な結合試験中に見つかった不具合なんですが、Crypt::SSLeay + openssl-0.9.8a でセグメンテーションフォルトします。多くの場合、デフォルトで rpm されている openssl-0.9.7 系では問題が発生しないようです。

あまり深追いをしていないのですが、セグメンテーションフォルトっていうエラーなので、Perl スクリプトではなくて、XS の C で描かれた部分だろうなぁ〜と思ってます。恐らく Crypt::SSLeay の SSLeay.xs のどこかが openssl-0.9.8a に非対応なのでしょう。

LWP で Crypt::SSLeay を使っているところは、 HTTPS.pm / https10.pm 内です。例えば、openssl-0.9.8a を入れている場合、こんなスクリプトはセグメンテーションフォルトします。

- スポンサーリンク -

use strict;
use LWP::UserAgent;
use HTTP::Request::Common;
use HTTP::Cookies;

my $ua = LWP::UserAgent->new;
   $ua->agent('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)');
   $ua->timeout(30);
   $cookie_jar = HTTP::Cookies->new(file => 'cokkie.txt', autosave => 1, ignore_discard => 1);
   $ua->cookie_jar($cookie_jar);
   $user_id = 'testis';
   $user_pw = 'testpw';

my $request = HTTP::Request::Common::GET('https://testsite.com/testfile.html');
   $request->authorization_basic($user_id, $user_pw);
my $result  = $ua->request($request);
die "Failed to Authentication.." unless($result->is_success);
print $result->content;

このスクリプトは単純にベーシック認証がかかったサイトに https でアクセスするってだけのものです。よく使うパターンの一つでもありますが、

my $result = $ua->request($request);

の部分でセグメンテーションフォルトします。見つけるのにえらい苦労しましたので、情報までに記事にしておくことにしました。原因特定は後になってなので、Perl から CPAN までモジュールを全て再インストールするという無駄な行為をして自滅してしまいました。

Perl モジュールのインストールも OS のライブラリを update していると急に make が通らなくなったり(GDとかさぁ・・・)して苦労しますね。インストールメモにはバッドノウハウばかりです・・・。

最近の教訓 → 新しい物好きも如何なモノかと・・・。

ライブラリやモジュールは安定動作している状態ならむやみにバージョンアップしない方が良い場合もあり。(もっともセキュリティーフォールとか問題がある場合は、対処必須ですが。)
- スポンサーリンク -