1
0
Fork 0
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:
Andy Green 2019-09-11 06:34:52 +01:00
parent 7528491505
commit 5f4dce6942
2 changed files with 25 additions and 55 deletions

View file

@ -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

View file

@ -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;