|
|
@ -333,16 +333,15 @@ static int find_header_and_get_info(const char *pktdata, unsigned int pktlen, |
|
|
|
const char *hdrname, |
|
|
|
char **hdrnameaddr, |
|
|
|
char **hdrvalueaddr, unsigned int *hdrvaluelen) { |
|
|
|
|
|
|
|
char *hdr_begin; |
|
|
|
char *data_addr_rn; |
|
|
|
char *hdr_begin; |
|
|
|
|
|
|
|
*hdrvaluelen = 0u; |
|
|
|
*hdrnameaddr = NULL; |
|
|
|
*hdrvalueaddr = NULL; |
|
|
|
|
|
|
|
/* Search for the header using Boyer-Moore */ |
|
|
|
hdr_begin = boyer_moore_search(pktdata, pktlen, |
|
|
|
/* Search for the header */ |
|
|
|
hdr_begin = dumb_memmem(pktdata, pktlen, |
|
|
|
hdrname, strlen(hdrname)); |
|
|
|
if (!hdr_begin) return FALSE; |
|
|
|
if (pktdata > hdr_begin) return FALSE; |
|
|
@ -351,8 +350,8 @@ static int find_header_and_get_info(const char *pktdata, unsigned int pktlen, |
|
|
|
*hdrnameaddr = hdr_begin; |
|
|
|
*hdrvalueaddr = hdr_begin + strlen(hdrname); |
|
|
|
|
|
|
|
/* Search for header end using Boyer-Moore */ |
|
|
|
data_addr_rn = boyer_moore_search(*hdrvalueaddr, |
|
|
|
/* Search for header end (\r\n) */ |
|
|
|
data_addr_rn = dumb_memmem(*hdrvalueaddr, |
|
|
|
pktlen - (uintptr_t)(*hdrvalueaddr - pktdata), |
|
|
|
"\r\n", 2); |
|
|
|
if (data_addr_rn) { |
|
|
@ -360,11 +359,9 @@ static int find_header_and_get_info(const char *pktdata, unsigned int pktlen, |
|
|
|
if (*hdrvaluelen >= 3 && *hdrvaluelen <= HOST_MAXLEN) |
|
|
|
return TRUE; |
|
|
|
} |
|
|
|
|
|
|
|
return FALSE; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Very crude Server Name Indication (TLS ClientHello hostname) extractor. |
|
|
|
*/ |
|
|
|