mirror of
https://github.com/warmcat/libwebsockets.git
synced 2025-03-30 00:00:16 +01:00
parsers: use common unaligned accessors
This commit is contained in:
parent
7528491505
commit
5f4dce6942
2 changed files with 25 additions and 55 deletions
|
@ -148,12 +148,12 @@ enum {
|
||||||
LWS_RXFLOW_PENDING_CHANGE = (1 << 1),
|
LWS_RXFLOW_PENDING_CHANGE = (1 << 1),
|
||||||
};
|
};
|
||||||
|
|
||||||
enum lws_parser_return {
|
typedef enum lws_parser_return {
|
||||||
LPR_OK = 0,
|
LPR_FORBIDDEN = -2,
|
||||||
LPR_FAIL = -1,
|
LPR_FAIL = -1,
|
||||||
|
LPR_OK = 0,
|
||||||
LPR_DO_FALLBACK = 2,
|
LPR_DO_FALLBACK = 2,
|
||||||
LPR_FORBIDDEN = -2
|
} lws_parser_return_t;
|
||||||
};
|
|
||||||
|
|
||||||
enum pmd_return {
|
enum pmd_return {
|
||||||
PMDR_UNKNOWN,
|
PMDR_UNKNOWN,
|
||||||
|
@ -933,7 +933,7 @@ lws_has_buffered_out(struct lws *wsi) { return !!wsi->buflist_out; }
|
||||||
LWS_EXTERN int LWS_WARN_UNUSED_RESULT
|
LWS_EXTERN int LWS_WARN_UNUSED_RESULT
|
||||||
lws_ws_client_rx_sm(struct lws *wsi, unsigned char c);
|
lws_ws_client_rx_sm(struct lws *wsi, unsigned char c);
|
||||||
|
|
||||||
LWS_EXTERN int LWS_WARN_UNUSED_RESULT
|
LWS_EXTERN lws_parser_return_t LWS_WARN_UNUSED_RESULT
|
||||||
lws_parse(struct lws *wsi, unsigned char *buf, int *len);
|
lws_parse(struct lws *wsi, unsigned char *buf, int *len);
|
||||||
|
|
||||||
LWS_EXTERN int LWS_WARN_UNUSED_RESULT
|
LWS_EXTERN int LWS_WARN_UNUSED_RESULT
|
||||||
|
|
|
@ -37,41 +37,6 @@ static const unsigned char lextable[] = {
|
||||||
#define UHO_LL 4
|
#define UHO_LL 4
|
||||||
#define UHO_NAME 8
|
#define UHO_NAME 8
|
||||||
|
|
||||||
static uint16_t
|
|
||||||
lws_un16be_get(const void *_p)
|
|
||||||
{
|
|
||||||
const uint8_t *p = _p;
|
|
||||||
|
|
||||||
return ((uint16_t)p[0] << 8) | p[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
lws_un16be_set(void *_p, uint16_t v)
|
|
||||||
{
|
|
||||||
uint8_t *p = _p;
|
|
||||||
|
|
||||||
*p++ = (uint8_t)(v >> 8);
|
|
||||||
*p++ = (uint8_t)v;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint32_t
|
|
||||||
lws_un32be_get(const void *_p)
|
|
||||||
{
|
|
||||||
const uint8_t *p = _p;
|
|
||||||
|
|
||||||
return (uint32_t)((p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
lws_un32be_set(void *_p, uint32_t v)
|
|
||||||
{
|
|
||||||
uint8_t *p = _p;
|
|
||||||
|
|
||||||
*p++ = (uint8_t)(v >> 24);
|
|
||||||
*p++ = (uint8_t)(v >> 16);
|
|
||||||
*p++ = (uint8_t)(v >> 8);
|
|
||||||
*p = (uint8_t)v;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static struct allocated_headers *
|
static struct allocated_headers *
|
||||||
|
@ -617,11 +582,13 @@ lws_hdr_custom_length(struct lws *wsi, const char *name, int nlen)
|
||||||
while (ll) {
|
while (ll) {
|
||||||
if (ll >= wsi->http.ah->data_length)
|
if (ll >= wsi->http.ah->data_length)
|
||||||
return -1;
|
return -1;
|
||||||
if (nlen == lws_un16be_get(&wsi->http.ah->data[ll + UHO_NLEN]) &&
|
if (nlen == lws_ser_ru16be(
|
||||||
|
(uint8_t *)&wsi->http.ah->data[ll + UHO_NLEN]) &&
|
||||||
!strncmp(name, &wsi->http.ah->data[ll + UHO_NAME], nlen))
|
!strncmp(name, &wsi->http.ah->data[ll + UHO_NAME], nlen))
|
||||||
return lws_un16be_get(&wsi->http.ah->data[ll + UHO_VLEN]);
|
return lws_ser_ru16be(
|
||||||
|
(uint8_t *)&wsi->http.ah->data[ll + UHO_VLEN]);
|
||||||
|
|
||||||
ll = lws_un32be_get(&wsi->http.ah->data[ll + UHO_LL]);
|
ll = lws_ser_ru32be((uint8_t *)&wsi->http.ah->data[ll + UHO_LL]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -643,9 +610,11 @@ lws_hdr_custom_copy(struct lws *wsi, char *dst, int len, const char *name,
|
||||||
while (ll) {
|
while (ll) {
|
||||||
if (ll >= wsi->http.ah->data_length)
|
if (ll >= wsi->http.ah->data_length)
|
||||||
return -1;
|
return -1;
|
||||||
if (nlen == lws_un16be_get(&wsi->http.ah->data[ll + UHO_NLEN]) &&
|
if (nlen == lws_ser_ru16be(
|
||||||
|
(uint8_t *)&wsi->http.ah->data[ll + UHO_NLEN]) &&
|
||||||
!strncmp(name, &wsi->http.ah->data[ll + UHO_NAME], nlen)) {
|
!strncmp(name, &wsi->http.ah->data[ll + UHO_NAME], nlen)) {
|
||||||
n = lws_un16be_get(&wsi->http.ah->data[ll + UHO_VLEN]);
|
n = lws_ser_ru16be(
|
||||||
|
(uint8_t *)&wsi->http.ah->data[ll + UHO_VLEN]);
|
||||||
if (n + 1 > len)
|
if (n + 1 > len)
|
||||||
return -1;
|
return -1;
|
||||||
strncpy(dst, &wsi->http.ah->data[ll + UHO_NAME + nlen], n);
|
strncpy(dst, &wsi->http.ah->data[ll + UHO_NAME + nlen], n);
|
||||||
|
@ -653,7 +622,7 @@ lws_hdr_custom_copy(struct lws *wsi, char *dst, int len, const char *name,
|
||||||
|
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
ll = lws_un32be_get(&wsi->http.ah->data[ll + UHO_LL]);
|
ll = lws_ser_ru32be((uint8_t *)&wsi->http.ah->data[ll + UHO_LL]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -684,7 +653,7 @@ lws_pos_in_bounds(struct lws *wsi)
|
||||||
(unsigned int)wsi->context->max_http_header_data)
|
(unsigned int)wsi->context->max_http_header_data)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if ((int)wsi->http.ah->pos == wsi->context->max_http_header_data) {
|
if ((int)wsi->http.ah->pos >= wsi->context->max_http_header_data - 1) {
|
||||||
lwsl_err("Ran out of header data space\n");
|
lwsl_err("Ran out of header data space\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -967,7 +936,7 @@ static const unsigned char methods[] = {
|
||||||
* possible returns:, -1 fail, 0 ok or 2, transition to raw
|
* possible returns:, -1 fail, 0 ok or 2, transition to raw
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int LWS_WARN_UNUSED_RESULT
|
lws_parser_return_t LWS_WARN_UNUSED_RESULT
|
||||||
lws_parse(struct lws *wsi, unsigned char *buf, int *len)
|
lws_parse(struct lws *wsi, unsigned char *buf, int *len)
|
||||||
{
|
{
|
||||||
struct allocated_headers *ah = wsi->http.ah;
|
struct allocated_headers *ah = wsi->http.ah;
|
||||||
|
@ -989,7 +958,7 @@ lws_parse(struct lws *wsi, unsigned char *buf, int *len)
|
||||||
if (c == '\r')
|
if (c == '\r')
|
||||||
break;
|
break;
|
||||||
if (c == '\n') {
|
if (c == '\n') {
|
||||||
lws_un16be_set(&ah->data[ah->unk_pos + 2],
|
lws_ser_wu16be((uint8_t *)&ah->data[ah->unk_pos + 2],
|
||||||
ah->pos - ah->unk_value_pos);
|
ah->pos - ah->unk_value_pos);
|
||||||
ah->parser_state = WSI_TOKEN_NAME_PART;
|
ah->parser_state = WSI_TOKEN_NAME_PART;
|
||||||
ah->unk_pos = 0;
|
ah->unk_pos = 0;
|
||||||
|
@ -1002,7 +971,7 @@ lws_parse(struct lws *wsi, unsigned char *buf, int *len)
|
||||||
(c != ' ' && c != '\t')) {
|
(c != ' ' && c != '\t')) {
|
||||||
|
|
||||||
if (lws_pos_in_bounds(wsi))
|
if (lws_pos_in_bounds(wsi))
|
||||||
return -1;
|
return LPR_FAIL;
|
||||||
|
|
||||||
ah->data[ah->pos++] = c;
|
ah->data[ah->pos++] = c;
|
||||||
}
|
}
|
||||||
|
@ -1032,7 +1001,7 @@ lws_parse(struct lws *wsi, unsigned char *buf, int *len)
|
||||||
/* enforce starting with / */
|
/* enforce starting with / */
|
||||||
if (!ah->frags[ah->nfrag].len)
|
if (!ah->frags[ah->nfrag].len)
|
||||||
if (issue_char(wsi, '/') < 0)
|
if (issue_char(wsi, '/') < 0)
|
||||||
return -1;
|
return LPR_FAIL;
|
||||||
|
|
||||||
if (ah->ups == URIPS_SEEN_SLASH_DOT_DOT) {
|
if (ah->ups == URIPS_SEEN_SLASH_DOT_DOT) {
|
||||||
/*
|
/*
|
||||||
|
@ -1054,7 +1023,7 @@ lws_parse(struct lws *wsi, unsigned char *buf, int *len)
|
||||||
|
|
||||||
/* begin parsing HTTP version: */
|
/* begin parsing HTTP version: */
|
||||||
if (issue_char(wsi, '\0') < 0)
|
if (issue_char(wsi, '\0') < 0)
|
||||||
return -1;
|
return LPR_FAIL;
|
||||||
ah->parser_state = WSI_TOKEN_HTTP;
|
ah->parser_state = WSI_TOKEN_HTTP;
|
||||||
goto start_fragment;
|
goto start_fragment;
|
||||||
}
|
}
|
||||||
|
@ -1131,7 +1100,7 @@ swallow:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (lws_pos_in_bounds(wsi))
|
if (lws_pos_in_bounds(wsi))
|
||||||
return -1;
|
return LPR_FAIL;
|
||||||
|
|
||||||
ah->data[ah->pos++] = c;
|
ah->data[ah->pos++] = c;
|
||||||
pos = ah->lextable_pos;
|
pos = ah->lextable_pos;
|
||||||
|
@ -1148,7 +1117,8 @@ swallow:
|
||||||
ah->unk_ll_head = ah->unk_pos;
|
ah->unk_ll_head = ah->unk_pos;
|
||||||
|
|
||||||
if (ah->unk_ll_tail)
|
if (ah->unk_ll_tail)
|
||||||
lws_un32be_set(&ah->data[ah->unk_ll_tail + UHO_LL],
|
lws_ser_wu32be(
|
||||||
|
(uint8_t *)&ah->data[ah->unk_ll_tail + UHO_LL],
|
||||||
ah->unk_pos);
|
ah->unk_pos);
|
||||||
|
|
||||||
ah->unk_ll_tail = ah->unk_pos;
|
ah->unk_ll_tail = ah->unk_pos;
|
||||||
|
@ -1161,7 +1131,7 @@ swallow:
|
||||||
|
|
||||||
/* set the unknown header name part length */
|
/* set the unknown header name part length */
|
||||||
|
|
||||||
lws_un16be_set(&ah->data[ah->unk_pos],
|
lws_ser_wu16be((uint8_t *)&ah->data[ah->unk_pos],
|
||||||
(ah->pos - ah->unk_pos) - UHO_NAME);
|
(ah->pos - ah->unk_pos) - UHO_NAME);
|
||||||
|
|
||||||
ah->unk_value_pos = ah->pos;
|
ah->unk_value_pos = ah->pos;
|
||||||
|
|
Loading…
Add table
Reference in a new issue