Ticket #10330

ポート転送の接続が多くなると落ちる
Date d'ouverture: 2007-04-25 17:18 Dernière mise à jour: 2007-05-07 22:20

Rapporteur:
(Anonyme)
Propriétaire:
(Aucun)
Type:
État:
Atteints
Composant:
(Aucun)
Jalon:
(Aucun)
Priorité:
5 - moyen
Sévérité:
5 - moyen
Résolution:
Fixed
Fichier:
2
Vote
Score: 0
No votes
0.0% (0/0)
0.0% (0/0)

Détails

100 回ほど POP 接続をすると、teraterm が落ちます。
POP 接続はその都度閉じていますが、接続が閉じたときに
該当する channel を解放する処理がないようです。
そのため、channels を使い尽くしてしまうようです。
# used に 0 を代入する処理が見つかりませんでした。

また、ssh2_channel_new の返り値を見ていないところが
あり、本当に使用中の channel が CHANNEL_MAX を超えた
ときも落ちる可能性があります。

Ticket History (3/10 Histories)

2007-04-25 19:17 Updated by: (del#24082)
Commentaire
Logged In: YES
user_id=24082

報告どうもありがとうございます。

SSH2_MSG_CHANNEL_CLOSEハンドラのhandle_SSH2_channel_close()
で、チャネルの解放処理が漏れていました。
OpenSSH 4.6p1では、channel_input_oclose()#channels.cに相当す
る部分です。

ssh2_channel_new()のほうも調査をいたします。
2007-04-26 11:12 Updated by: (del#24082)
Commentaire
Logged In: YES
user_id=24082

修正内容を検証するために、再現手順をもう少し詳しく教えてもら
えないでしょうか?
よろしくお願いします。
2007-04-26 12:10 Updated by: (del#1144)
Commentaire
Logged In: YES
user_id=1144

/ssh-L110:127.0.0.1:110 で接続し、POP 接続の(たぶん)101
回目に SSH_open_channel の中で落ちます。
CHANNEL_MAX を 少なくすると再現が簡単です。

channel_new のぶんだけパッチを作りました。
呼んでいるのは4カ所です。
local->remote fwd SSH_open_channel 1カ所
remote->local fwd handle_SSH2_channel_open 2カ所
認証 handle_SSH2_userauth_success 1カ所

handle_SSH2_userauth_success は fatal を出しています。
handle_SSH2_channel_open は、nonfatal を出して return FALSE
したあと、なぜか接続自体が切れます。
SSH_open_channel は void なので nonfatal を出して return
していますが、クライアントが返事を待ちっぱなしになります。
2007-04-26 12:10 Updated by: (del#1144)
  • File 1838: channel_new.patch is attached
2007-04-26 13:58 Updated by: (del#24082)
Commentaire
Logged In: YES
user_id=24082

>永田さん
パッチ作成いつもありがとうございます。

POP接続の件は、ローカルポートからの切断時にリークしているという
ことですね。
修正箇所は、accept_wnd_proc()#fwd.cのFD_CLOSEラベルから呼ば
れる、
closed_local_connection()に手を入れる必要がありそうです。
チャネル番号から ssh2_local_channel_lookup() を使って、SSH2
チャネル構造体を
取り出し、フリーする、といったところです。
2007-04-26 15:58 Updated by: (del#1144)
Commentaire
Logged In: YES
user_id=1144

closed_local_connection のあとに handle_SSH2_channel_close
に飛んでいてここで channel を使用しているので、
handle_SSH2_channel_close で解放するようにしました。
また、handle_SSH2_open_failure でも解放するようにしました。

解放を c->used = 0; としていますが、これで十分でしょうか。
ここでは channels[CHANNEL_MAX] の方をいじっていますが、
alloc 部分のソースを見ると pvar->fwd_state の channels や
num_channels を操作しており、解放の時にこれらをそのままに
しておいてよいのかわかりませんでした。
2007-04-26 15:58 Updated by: (del#1144)
  • File 1839: channel_new2.patch is attached
2007-04-26 19:21 Updated by: (del#24082)
Commentaire
Logged In: YES
user_id=24082

チャネルフリーの件は修正し、コミットしました。
handle_SSH2_open_failure()のほうですが、セッション自体が開け
ていないので、いらないような気がしますが、必要なら追加願いま
す。

2007-04-26 21:32 Updated by: (del#1144)
Commentaire
Logged In: YES
user_id=1144

ありがとうございます。
転送セッションは開けないものの SSH 接続が残るので、
POP3 チェッカーなどが転送先への接続リクエストを継続すると
使いっぱなしの channel が増えていくと思います。

ssh2_channel_new() の返り値をチェックするコードをコミット
しました。
下の方で書いた SSH_open_channel() で ssh2_channel_new()
に失敗したときに TeraTerm が終了するまで応答待ちになる件
ですが、sshd_config で AllowTcpForwarding no にしてから転送
したときにも同じことが起きるようです。
すぐに接続を切る方法はあるでしょうか。
2007-05-07 22:20 Updated by: (del#1144)
  • Ticket Close date is changed to 2007-05-07 22:20
  • Résolution Update from Aucun to Fixed
  • État Update from Ouvert to Atteints

Attachment File List

Modifier

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Connexion