|
| 1 | +#include "tier0/dbg.h" |
| 2 | +#include "unitlib/unitlib.h" |
| 3 | +#include "tier1/lzss.h" |
| 4 | + |
| 5 | +#ifdef USING_ASAN |
| 6 | +#include <sanitizer/asan_interface.h> |
| 7 | +#endif |
| 8 | + |
| 9 | +DEFINE_TESTSUITE( LZSSSafeUncompressTestSuite ) |
| 10 | + |
| 11 | +static void SafeUncompressTests() |
| 12 | +{ |
| 13 | + CLZSS lzss; |
| 14 | + char poision1[8192]; |
| 15 | + unsigned char in[256]; |
| 16 | + |
| 17 | + char poision2[8192]; |
| 18 | + |
| 19 | + unsigned char out[256]; |
| 20 | + char poision3[8192]; |
| 21 | + |
| 22 | +#ifdef USING_ASAN |
| 23 | + ASAN_POISON_MEMORY_REGION( poision1, 8192 ); |
| 24 | + ASAN_POISON_MEMORY_REGION( poision2, 8192 ); |
| 25 | + ASAN_POISON_MEMORY_REGION( poision3, 8192 ); |
| 26 | +#endif |
| 27 | + |
| 28 | + lzss_header_t *pHeader = (lzss_header_t*)in; |
| 29 | + pHeader->actualSize = sizeof(in)-sizeof(lzss_header_t); |
| 30 | + pHeader->id = LZSS_ID; |
| 31 | + |
| 32 | + uint result = 0; |
| 33 | + |
| 34 | + // 0xff bytes test |
| 35 | + memset(in+8, 0xFF, sizeof(in)-sizeof(lzss_header_t)); |
| 36 | + result = lzss.SafeUncompress( in, sizeof(in), out, sizeof(out) ); |
| 37 | + Shipping_Assert( result == 0 ); |
| 38 | + |
| 39 | + // zero bytes test |
| 40 | + memset(in+8, 0x0, sizeof(in)-sizeof(lzss_header_t)); |
| 41 | + result = lzss.SafeUncompress( in, sizeof(in), out, sizeof(out) ); |
| 42 | + Shipping_Assert( result == 0 ); |
| 43 | + |
| 44 | + // valid data, invalid header |
| 45 | + pHeader->actualSize = 1; |
| 46 | + pHeader->id = LZSS_ID; |
| 47 | + result = lzss.SafeUncompress( in, sizeof(in), out, sizeof(out) ); |
| 48 | + Shipping_Assert( result == 0 ); |
| 49 | + |
| 50 | + pHeader->actualSize = 999; |
| 51 | + pHeader->id = LZSS_ID; |
| 52 | + result = lzss.SafeUncompress( in, sizeof(in), out, sizeof(out) ); |
| 53 | + Shipping_Assert( result == 0 ); |
| 54 | + |
| 55 | + pHeader->actualSize = 999; |
| 56 | + pHeader->id = 1337; |
| 57 | + result = lzss.SafeUncompress( in, sizeof(in), out, sizeof(out) ); |
| 58 | + Shipping_Assert( result == 0 ); |
| 59 | + |
| 60 | + |
| 61 | + // valid header, valid data |
| 62 | + const unsigned char compressed[] = {0x4c,0x5a,0x53,0x53,0x1a,0x0,0x0,0x0,0x0,0x44,0x6f,0x20,0x79,0x6f,0x75,0x20,0x6c,0x0,0x69,0x6b,0x65,0x20,0x77,0x68,0x61,0x74,0x41,0x0,0xd4,0x73,0x65,0x65,0x3f,0x0,0x0,0x0}; |
| 63 | + |
| 64 | + pHeader->actualSize = sizeof(compressed); |
| 65 | + pHeader->id = LZSS_ID; |
| 66 | + result = lzss.SafeUncompress( compressed, sizeof(compressed), out, sizeof(out) ); |
| 67 | + |
| 68 | + const char data[] = "Do you like what you see?"; |
| 69 | + Shipping_Assert( memcmp(out, data, 26) == 0 ); |
| 70 | + Shipping_Assert( result == 26 ); |
| 71 | +} |
| 72 | + |
| 73 | +DEFINE_TESTCASE( LZSSSafeUncompressTest, LZSSSafeUncompressTestSuite ) |
| 74 | +{ |
| 75 | + Msg( "Running CLZSS::SafeUncompress tests\n" ); |
| 76 | + |
| 77 | + SafeUncompressTests(); |
| 78 | +} |
0 commit comments