2013年5月7日火曜日

ngx_http_upstream_rr_peer_t 調査

nginxの構造体ngx_http_upstream_rr_peer_tはupstreamの情報を格納するのに使われている。
このメンバの ngx_str_t name; はupstreamのserver名を格納している。

ngx_str_tは
typedef struct {
    size_t      len;
    u_char     *data;
} ngx_str_t;
文字列と長さを格納している。

nginxをreloadするとこのname.dataにゴミが乗ることがある(version 1.2.8で確認)。
どこで混在するのか調べきれてないが、ngx_str_tのdataをそのまま信用するのは危ない感じである。
lenをチェックしてみたところlenは不正な値が入ることは無さそうで信頼できそうである。

これを踏まえて、ngx_str_tのdataを比較する場合は、単純にngx_strcmpだと上述のため危険であるので、
ngx_str_tのlenが同じ且つngx_strncmpで比較するのが正確そうである。

こんな感じのものを用意することにした。
int ngx_strtcmp(ngx_str_t *s1, ngx_str_t *s2) {
  if (s1->len == s2->len) {
    return ngx_strncmp(s1->data, s2->data, s1->len);
  }
  return ngx_strcmp(s1->data, s2->data);
}


0 件のコメント:

コメントを投稿