|
50 | 50 | #define HEADER_TERMINATOR_LEN (sizeof("\r\n") - 1)
|
51 | 51 | #define MIN_REQUEST_SIZE (sizeof("GET / HTTP/1.1\r\n\r\n") - 1)
|
52 | 52 |
|
| 53 | +static const char *next_request_empty = ""; |
| 54 | + |
53 | 55 | enum lwan_read_finalizer {
|
54 | 56 | FINALIZER_DONE,
|
55 | 57 | FINALIZER_TRY_AGAIN,
|
@@ -933,32 +935,38 @@ static void save_to_corpus_for_fuzzing(struct lwan_value buffer)
|
933 | 935 | }
|
934 | 936 | #endif
|
935 | 937 |
|
936 |
| -static enum lwan_http_status |
937 |
| -client_read(struct lwan_request *request, |
938 |
| - struct lwan_value *buffer, |
939 |
| - const size_t want_to_read, |
940 |
| - enum lwan_read_finalizer (*finalizer)(const struct lwan_value *buffer, |
941 |
| - size_t want_to_read, |
942 |
| - const struct lwan_request *request, |
943 |
| - int n_packets)) |
| 938 | +static enum lwan_http_status client_read( |
| 939 | + struct lwan_request *request, |
| 940 | + struct lwan_value *buffer, |
| 941 | + const size_t want_to_read, |
| 942 | + enum lwan_read_finalizer (*finalizer)(const struct lwan_value *buffer, |
| 943 | + size_t want_to_read, |
| 944 | + const struct lwan_request *request, |
| 945 | + int n_packets)) |
944 | 946 | {
|
945 | 947 | struct lwan_request_parser_helper *helper = request->helper;
|
946 | 948 | int n_packets = 0;
|
947 | 949 |
|
948 | 950 | if (helper->next_request) {
|
949 |
| - const size_t next_request_len = (size_t)(helper->next_request - buffer->value); |
950 |
| - size_t new_len; |
951 |
| - |
952 |
| - if (__builtin_sub_overflow(buffer->len, next_request_len, &new_len)) { |
| 951 | + if (UNLIKELY(helper->next_request == next_request_empty)) { |
953 | 952 | helper->next_request = NULL;
|
954 |
| - } else if (new_len) { |
955 |
| - /* FIXME: This memmove() could be eventually removed if a better |
956 |
| - * stucture (maybe a ringbuffer, reading with readv(), and each |
957 |
| - * pointer is coro_strdup() if they wrap around?) were used for |
958 |
| - * the request buffer. */ |
959 |
| - buffer->len = new_len; |
960 |
| - memmove(buffer->value, helper->next_request, new_len); |
961 |
| - goto try_to_finalize; |
| 953 | + } else { |
| 954 | + const size_t next_request_len = |
| 955 | + (size_t)(helper->next_request - buffer->value); |
| 956 | + size_t new_len; |
| 957 | + |
| 958 | + if (__builtin_sub_overflow(buffer->len, next_request_len, |
| 959 | + &new_len)) { |
| 960 | + helper->next_request = NULL; |
| 961 | + } else if (new_len) { |
| 962 | + /* FIXME: This memmove() could be eventually removed if a better |
| 963 | + * stucture (maybe a ringbuffer, reading with readv(), and each |
| 964 | + * pointer is coro_strdup() if they wrap around?) were used for |
| 965 | + * the request buffer. */ |
| 966 | + buffer->len = new_len; |
| 967 | + memmove(buffer->value, helper->next_request, new_len); |
| 968 | + goto try_to_finalize; |
| 969 | + } |
962 | 970 | }
|
963 | 971 | }
|
964 | 972 |
|
@@ -1289,7 +1297,7 @@ get_remaining_body_data_length(struct lwan_request *request,
|
1289 | 1297 | if (UNLIKELY((size_t)parsed_size >= max_size))
|
1290 | 1298 | return HTTP_TOO_LARGE;
|
1291 | 1299 | if (UNLIKELY(!parsed_size)) {
|
1292 |
| - helper->next_request = ""; |
| 1300 | + helper->next_request = (char *)next_request_empty; |
1293 | 1301 | *total = *have = 0;
|
1294 | 1302 | } else {
|
1295 | 1303 | *total = (size_t)parsed_size;
|
|
0 commit comments