| 926 | } |
| 927 | |
| 928 | int DoPushTable(lua_State*L, PushTableLogger& logger, const TableHeader& header, const char* original_buffer, const char* buffer, uint32_t buffer_size, uint32_t depth) |
| 929 | { |
| 930 | int top = lua_gettop(L); |
| 931 | (void)top; |
| 932 | |
| 933 | const char* buffer_start = buffer; |
| 934 | const char* buffer_end = buffer + buffer_size; |
| 935 | CHECK_PUSHTABLE_OOB("table header", logger, buffer+2, buffer_end, 0, depth); |
| 936 | |
| 937 | uint32_t count = 0; |
| 938 | if (header.m_Version <= 3) |
| 939 | { |
| 940 | memcpy(&count, buffer, sizeof(uint16_t)); |
| 941 | buffer += 2; |
| 942 | } |
| 943 | else |
| 944 | { |
| 945 | memcpy(&count, buffer, sizeof(uint32_t)); |
| 946 | buffer += 4; |
| 947 | } |
| 948 | |
| 949 | PushTableLogFormat(logger, "{%d|", (uint32_t)count); |
| 950 | |
| 951 | if (buffer > buffer_end) { |
| 952 | char log_str[PUSH_TABLE_LOGGER_STR_SIZE]; |
| 953 | PushTableLogPrint(logger, log_str); |
| 954 | char str[512]; \ |
| 955 | dmSnPrintf(str, sizeof(str), "Reading outside of buffer at before element [BufStart: %p, Cursor: %p, End: %p, BufSize: %lu, Bytes OOB: %d].\n'%s'", logger.m_BufferStart, buffer, buffer_end, logger.m_BufferSize, (int)(buffer_end - buffer), log_str); \ |
| 956 | return luaL_error(L, "%s", str); |
| 957 | } |
| 958 | |
| 959 | lua_newtable(L); |
| 960 | |
| 961 | for (uint32_t i = 0; i < count; ++i) |
| 962 | { |
| 963 | CHECK_PUSHTABLE_OOB("key-value tags", logger, buffer+2, buffer_end, count, depth); |
| 964 | |
| 965 | char key_type = (*buffer++); |
| 966 | char value_type = (*buffer++); |
| 967 | |
| 968 | if (key_type == LUA_TSTRING) |
| 969 | { |
| 970 | PushTableLogString(logger, "KS"); |
| 971 | |
| 972 | if (header.m_Version <= 1) |
| 973 | buffer += LoadOldTSTRING(L, buffer, buffer_end, count, logger); |
| 974 | else |
| 975 | buffer += LoadTSTRING(L, buffer, buffer_end, count, logger); |
| 976 | |
| 977 | CHECK_PUSHTABLE_OOB("key string", logger, buffer, buffer_end, count, depth); |
| 978 | } |
| 979 | else if (key_type == LUA_TNUMBER || key_type == LUA_TNEGATIVENUMBER) |
| 980 | { |
| 981 | PushTableLogString(logger, "KN"); |
| 982 | |
| 983 | buffer = ReadEncodedIndex(L, key_type, header, buffer); |
| 984 | CHECK_PUSHTABLE_OOB("key number", logger, buffer, buffer_end, count, depth); |
| 985 | } |
no test coverage detected