Autoindex: fixed possible integer overflow on 32-bit systems.
Vladimir Homutov
3 years ago
433 | 433 | { |
434 | 434 | u_char *last, scale; |
435 | 435 | off_t length; |
436 | size_t len, char_len, escape_html; | |
436 | size_t len, entry_len, char_len, escape_html; | |
437 | 437 | ngx_tm_t tm; |
438 | 438 | ngx_buf_t *b; |
439 | 439 | ngx_int_t size; |
498 | 498 | entry[i].utf_len = entry[i].name.len; |
499 | 499 | } |
500 | 500 | |
501 | len += sizeof("<a href=\"") - 1 | |
502 | + entry[i].name.len + entry[i].escape | |
503 | + 1 /* 1 is for "/" */ | |
504 | + sizeof("\">") - 1 | |
505 | + entry[i].name.len - entry[i].utf_len | |
506 | + entry[i].escape_html | |
507 | + NGX_HTTP_AUTOINDEX_NAME_LEN + sizeof(">") - 2 | |
508 | + sizeof("</a>") - 1 | |
509 | + sizeof(" 28-Sep-1970 12:00 ") - 1 | |
510 | + 20 /* the file size */ | |
511 | + 2; | |
501 | entry_len = sizeof("<a href=\"") - 1 | |
502 | + entry[i].name.len + entry[i].escape | |
503 | + 1 /* 1 is for "/" */ | |
504 | + sizeof("\">") - 1 | |
505 | + entry[i].name.len - entry[i].utf_len | |
506 | + entry[i].escape_html | |
507 | + NGX_HTTP_AUTOINDEX_NAME_LEN + sizeof(">") - 2 | |
508 | + sizeof("</a>") - 1 | |
509 | + sizeof(" 28-Sep-1970 12:00 ") - 1 | |
510 | + 20 /* the file size */ | |
511 | + 2; | |
512 | ||
513 | if (len > NGX_MAX_SIZE_T_VALUE - entry_len) { | |
514 | return NULL; | |
515 | } | |
516 | ||
517 | len += entry_len; | |
512 | 518 | } |
513 | 519 | |
514 | 520 | b = ngx_create_temp_buf(r->pool, len); |
696 | 702 | ngx_http_autoindex_json(ngx_http_request_t *r, ngx_array_t *entries, |
697 | 703 | ngx_str_t *callback) |
698 | 704 | { |
699 | size_t len; | |
705 | size_t len, entry_len; | |
700 | 706 | ngx_buf_t *b; |
701 | 707 | ngx_uint_t i; |
702 | 708 | ngx_http_autoindex_entry_t *entry; |
713 | 719 | entry[i].escape = ngx_escape_json(NULL, entry[i].name.data, |
714 | 720 | entry[i].name.len); |
715 | 721 | |
716 | len += sizeof("{ }," CRLF) - 1 | |
717 | + sizeof("\"name\":\"\"") - 1 | |
718 | + entry[i].name.len + entry[i].escape | |
719 | + sizeof(", \"type\":\"directory\"") - 1 | |
720 | + sizeof(", \"mtime\":\"Wed, 31 Dec 1986 10:00:00 GMT\"") - 1; | |
722 | entry_len = sizeof("{ }," CRLF) - 1 | |
723 | + sizeof("\"name\":\"\"") - 1 | |
724 | + entry[i].name.len + entry[i].escape | |
725 | + sizeof(", \"type\":\"directory\"") - 1 | |
726 | + sizeof(", \"mtime\":\"Wed, 31 Dec 1986 10:00:00 GMT\"") - 1; | |
721 | 727 | |
722 | 728 | if (entry[i].file) { |
723 | len += sizeof(", \"size\":") - 1 + NGX_OFF_T_LEN; | |
724 | } | |
729 | entry_len += sizeof(", \"size\":") - 1 + NGX_OFF_T_LEN; | |
730 | } | |
731 | ||
732 | if (len > NGX_MAX_SIZE_T_VALUE - entry_len) { | |
733 | return NULL; | |
734 | } | |
735 | ||
736 | len += entry_len; | |
725 | 737 | } |
726 | 738 | |
727 | 739 | b = ngx_create_temp_buf(r->pool, len); |
840 | 852 | static ngx_buf_t * |
841 | 853 | ngx_http_autoindex_xml(ngx_http_request_t *r, ngx_array_t *entries) |
842 | 854 | { |
843 | size_t len; | |
855 | size_t len, entry_len; | |
844 | 856 | ngx_tm_t tm; |
845 | 857 | ngx_buf_t *b; |
846 | 858 | ngx_str_t type; |
858 | 870 | entry[i].escape = ngx_escape_html(NULL, entry[i].name.data, |
859 | 871 | entry[i].name.len); |
860 | 872 | |
861 | len += sizeof("<directory></directory>" CRLF) - 1 | |
862 | + entry[i].name.len + entry[i].escape | |
863 | + sizeof(" mtime=\"1986-12-31T10:00:00Z\"") - 1; | |
873 | entry_len = sizeof("<directory></directory>" CRLF) - 1 | |
874 | + entry[i].name.len + entry[i].escape | |
875 | + sizeof(" mtime=\"1986-12-31T10:00:00Z\"") - 1; | |
864 | 876 | |
865 | 877 | if (entry[i].file) { |
866 | len += sizeof(" size=\"\"") - 1 + NGX_OFF_T_LEN; | |
867 | } | |
878 | entry_len += sizeof(" size=\"\"") - 1 + NGX_OFF_T_LEN; | |
879 | } | |
880 | ||
881 | if (len > NGX_MAX_SIZE_T_VALUE - entry_len) { | |
882 | return NULL; | |
883 | } | |
884 | ||
885 | len += entry_len; | |
868 | 886 | } |
869 | 887 | |
870 | 888 | b = ngx_create_temp_buf(r->pool, len); |