@@ -1992,6 +1992,9 @@ http_parse_host(const char * buf, struct http_parser_url *u, int found_at) {
19921992 const char * p ;
19931993 size_t buflen = u -> field_data [UF_HOST ].off + u -> field_data [UF_HOST ].len ;
19941994
1995+ if (buflen > UINT16_MAX )
1996+ return 1 ;
1997+
19951998 u -> field_data [UF_HOST ].len = 0 ;
19961999
19972000 s = found_at ? s_http_userinfo_start : s_http_host_start ;
@@ -2006,21 +2009,21 @@ http_parse_host(const char * buf, struct http_parser_url *u, int found_at) {
20062009 switch (new_s ) {
20072010 case s_http_host :
20082011 if (s != s_http_host ) {
2009- u -> field_data [UF_HOST ].off = p - buf ;
2012+ u -> field_data [UF_HOST ].off = ( uint16_t )( p - buf ) ;
20102013 }
20112014 u -> field_data [UF_HOST ].len ++ ;
20122015 break ;
20132016
20142017 case s_http_host_v6 :
20152018 if (s != s_http_host_v6 ) {
2016- u -> field_data [UF_HOST ].off = p - buf ;
2019+ u -> field_data [UF_HOST ].off = ( uint16_t )( p - buf ) ;
20172020 }
20182021 u -> field_data [UF_HOST ].len ++ ;
20192022 break ;
20202023
20212024 case s_http_host_port :
20222025 if (s != s_http_host_port ) {
2023- u -> field_data [UF_PORT ].off = p - buf ;
2026+ u -> field_data [UF_PORT ].off = ( uint16_t )( p - buf ) ;
20242027 u -> field_data [UF_PORT ].len = 0 ;
20252028 u -> field_set |= (1 << UF_PORT );
20262029 }
@@ -2029,7 +2032,7 @@ http_parse_host(const char * buf, struct http_parser_url *u, int found_at) {
20292032
20302033 case s_http_userinfo :
20312034 if (s != s_http_userinfo ) {
2032- u -> field_data [UF_USERINFO ].off = p - buf ;
2035+ u -> field_data [UF_USERINFO ].off = ( uint16_t )( p - buf ) ;
20332036 u -> field_data [UF_USERINFO ].len = 0 ;
20342037 u -> field_set |= (1 << UF_USERINFO );
20352038 }
@@ -2066,6 +2069,9 @@ http_parser_parse_url(const char *buf, size_t buflen, int is_connect,
20662069 enum http_parser_url_fields uf , old_uf ;
20672070 int found_at = 0 ;
20682071
2072+ if (buflen > UINT16_MAX )
2073+ return 1 ;
2074+
20692075 u -> port = u -> field_set = 0 ;
20702076 s = is_connect ? s_req_server_start : s_req_spaces_before_url ;
20712077 uf = old_uf = UF_MAX ;
@@ -2121,7 +2127,7 @@ http_parser_parse_url(const char *buf, size_t buflen, int is_connect,
21212127 continue ;
21222128 }
21232129
2124- u -> field_data [uf ].off = p - buf ;
2130+ u -> field_data [uf ].off = ( uint16_t )( p - buf ) ;
21252131 u -> field_data [uf ].len = 1 ;
21262132
21272133 u -> field_set |= (1 << uf );
0 commit comments