ipモジュールで-Fオプション利用時にリクエストが破壊される
send_bufferを上回る(※)データを送るときの処理にバグが潜んでいました。 具体的には、protocol_module_ip.cppのput_data_into_sendbuffer()関数内、 「//sendbuffer rest size is too small」コメント以下のelse文が該当箇所に なります。 send_bufferを上回った場合、以下の処理で残ったデータの 開始位置とサイズを計算していますが、 //set item position buffer_element.first += sendbuffer_rest_size; buffer_element.second -= sendbuffer_rest_size; その後、data_ptr->buffer_sequenceにpushする処理が 抜けているため、残ったデータの開始位置とサイズが 更新されていませんでした。 そのため、残りのデータを送信しようとしたときに、 前と同じデータの開始位置で送信を行うため、 同じデータが2回送られてしまい、HTTPリクエストが壊れた と考えられます。 本事象はv3.0.0以降のipモジュールのみ発生する問題で、 XFFを追加して、送信データがsend_bufferを上回るサイズになった場合や、 Sorry-URI書き換え時にも同様の事象が発生します。 (※)補足 send_bufferを上回る場合について、 recv_bufferとsend_bufferは同じサイズであるため、 どんなに大きなサイズのデータが送られてきても、 受信処理の中で、send_bufferサイズを上回るデータを 取得することはない。 送信データサイズがsend_bufferサイズを上回るのは、 データ送信前に、URIの書き換えやXFFの追加を行うことで、 データサイズが増加した場合にのみ起こる。
コードを解析したところ、本問題はipモジュールでSorryURIオプションを 利用したときにも発生します。 添付のpatchで、-Fオプション利用時とSorryURIオプション利用時、 どちらの場合でも、事象が解消します。 本修正は、v3.1.0に取り込むのが良いと思います。 (修正内容) put_data_into_sendbuffer()関数内で、送信データがsend_bufferを 上回った場合に、残ったデータの開始位置とサイズが更新されていな かった箇所を修正しました。
上記パッチでBug fixされたことを、発見者の太田さんに確認してもらえました。
パッチ適用バージョンであるv3.0.4-3をリリースできた時点で、本チケットはclosedにしようと思います。
v3.1.0への適用を忘れないようにしましょう。
# すでに雲雀さんがv3.1.0-develでパッチを作成されているので、そのままコードを残せばいいだけですけど。
v3.1.0への適用については、gitにmod_ip_xff_bugfixというブランチを作成しているので、 v3.1.0-develで上記ブランチをpullしていただければと思います。
userのML投稿で見つかった、ipモジュールで-Fオプションを使用した際に、HTTPリクエストが壊れる問題