#174 修正HTTP1解析层在解析HTTP头部时,误采用前缀匹配判断头部是否为标准定义的问题。

* 原实现在判断请求/应答头部字段是否为标准头部时,没有判断传入字符串长度是否相等,导致当传入字符串为标准头部的前缀时误将其解析为标准头部;
* 现修正,增加判断字符串长度的流程,当字符串长度完全相等时再执行字符串匹配。
This commit is contained in:
luqiuwen
2019-09-23 19:07:32 +08:00
parent cd0fd187ad
commit ce8c8cd899
2 changed files with 18 additions and 4 deletions

View File

@@ -20,12 +20,19 @@ static enum tfe_http_std_field __str_header_field_to_std_field_id(const char * s
/* TODO: store the header text in hash table or rbtree, or use AC multistring search algo. */
for (unsigned int i = 0; i < __str_std_header_field_map_size; i++)
{
const char * __std_header_field = __str_std_header_field_map[i];
if (__std_header_field == NULL)
const char * std_header_field_iter = __str_std_header_field_map[i];
if (std_header_field_iter == NULL)
continue;
size_t __compare_length = MIN(strlen(__std_header_field), len);
if (evutil_ascii_strncasecmp(__std_header_field, str_field, __compare_length) != 0)
/* std_header_field_iter must contains '\0' */
size_t std_field_length = strlen(std_header_field_iter);
/* but the str_field may don't contains '\0', so must use strnlen */
size_t field_length = strnlen(str_field, len);
if (std_field_length != field_length)
continue;
if (strncasecmp(std_header_field_iter, str_field, std_field_length) != 0)
continue;
return (enum tfe_http_std_field) i;