yosuke takadate
taten****@gmail*****
2011年 3月 7日 (月) 19:21:34 JST
黒様様 高舘です。 有用な情報ありがとうございます。 X-Forwarded-For 、確かに気になっておりました。 要件上はずす事ができないのですが・・ &conn->cldata[20511]には文字列が格納されています。 --- (gdb) print &conn->cldata[20511] $9 = 0x180920ef "4" (gdb) print &conn->cldata[20480] $7 = 0x180920d0 "94972114362627419947849511552144" --- 原因がX-Forwarded-Forヘッダの追加による領域外アクセスならば conn.c 253行目を以下のように変更すれば、もしかして問題は解決する のでしょうか? --- conn->cldata = (char *)malloc(conn->cldata_bufsize); --- #define X_FORWARDED_FOR_LENGTH 48 〜 conn->cldata = (char *)malloc(conn->cldata_bufsize + X_FORWARDED_FOR_LENGTH); --- 2011年3月5日13:19 KUROSAWA Takahiro <takah****@gmail*****>: > 黒沢と申します. > > At Fri, 4 Mar 2011 14:43:28 +0900, > yosuke takadate wrote: > >> cldataのアドレスは取得できているので、 >> "error / can not allocate memory for buffer"という >> エラーログは出力されておりません。 >> connの内容は以下のようになっています。 >> >> (gdb) print *conn >> $1 = {lsock = 0x17b15160, srv = 0x17b151d0, dest = 0x17b23dc0, splice >> = 0, caddr = {sin_family = 2, >> sin_port = 53934, sin_addr = {s_addr = 3894339786}, sin_zero = >> "\000\000\000\000\000\000\000"}, raddr = { >> sin_family = 0, sin_port = 0, sin_addr = {s_addr = 0}, sin_zero = >> "\000\000\000\000\000\000\000"}, >> vaddr = {sin_family = 0, sin_port = 0, sin_addr = {s_addr = 0}, >> sin_zero = "\000\000\000\000\000\000\000"}, >> laddr = {sin_family = 0, sin_port = 0, sin_addr = {s_addr = 0}, >> sin_zero = "\000\000\000\000\000\000\000"}, >> ciom = 0x17afe9a0, riom = 0x17afe9c0, proto = 6 '\006', state = 0, >> cldata = 0x1808d0d0 "POST /HOGE/upload >> HTTP/1.1\r\nX-Forwarded-For: 111.222.333.444\r\nHost: >> hoge.jp:8831\r\nUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; >> ja; rv:1.9.2.12) Gecko/20101026"..., cldata_len = 20512, >> cldata_bufsize = 20480, cmss = 1448, sorry_conn_flag = 0, old_dest = >> 0x0} >> >> この状態で、conn.c:2923のfreeで落ちてしまうということは、 >> cldataへの格納時点で、(マルチパートリクエスト時に起きやすい >> 何らかの原因で)バッファ溢れが起きているのでしょうか。 >> MALLOC_CHECKなどでmessageを検出できるように試してみたいと思います。 > > 久々に l7vsd のコードを見るので外しているかもしれませんが, > X-Forwarded-For の追加処理で領域外アクセスを起こすように見えます. > 上の core に対し,gdb から > print &conn->cldata[20511] > を実行して文字列が表示されるようだと,領域外アクセスが起きている > 可能性が高そうです. > > 可能でしたら,ですが,l7directord.cf の --forwarded-for の設定を > 外すとひとまず問題は回避できるかもしれません. >