/src/uWebSockets/fuzzing/helpers.h
Line  | Count  | Source  | 
1  |  | #ifndef HELPERS_H  | 
2  |  | #define HELPERS_H  | 
3  |  |  | 
4  |  | /* Common helpers for fuzzing */  | 
5  |  |  | 
6  |  | #include <functional>  | 
7  |  | #include <string_view>  | 
8  |  | #include <cstring>  | 
9  |  |  | 
10  |  | /* We use this to pad the fuzz */  | 
11  | 11.4k  | static inline const uint8_t *makePadded(const uint8_t *data, size_t size) { | 
12  | 11.4k  |     static int paddedLength = 512 * 1024;  | 
13  | 11.4k  |     static char *padded = new char[128 + paddedLength + 128];  | 
14  |  |  | 
15  |  |     /* Increase landing area if required */  | 
16  | 11.4k  |     if (paddedLength < size) { | 
17  | 89  |         delete [] padded;  | 
18  | 89  |         paddedLength = size;  | 
19  | 89  |         padded = new char [128 + paddedLength + 128];  | 
20  | 89  |     }  | 
21  |  |  | 
22  | 11.4k  |     memcpy(padded + 128, data, size);  | 
23  |  |  | 
24  | 11.4k  |     return (uint8_t *) padded + 128;  | 
25  | 11.4k  | } WebSocket.cpp:makePadded(unsigned char const*, unsigned long) Line  | Count  | Source  |  11  | 1.44k  | static inline const uint8_t *makePadded(const uint8_t *data, size_t size) { |  12  | 1.44k  |     static int paddedLength = 512 * 1024;  |  13  | 1.44k  |     static char *padded = new char[128 + paddedLength + 128];  |  14  |  |  |  15  |  |     /* Increase landing area if required */  |  16  | 1.44k  |     if (paddedLength < size) { |  17  | 12  |         delete [] padded;  |  18  | 12  |         paddedLength = size;  |  19  | 12  |         padded = new char [128 + paddedLength + 128];  |  20  | 12  |     }  |  21  |  |  |  22  | 1.44k  |     memcpy(padded + 128, data, size);  |  23  |  |  |  24  | 1.44k  |     return (uint8_t *) padded + 128;  |  25  | 1.44k  | }  |  
 TopicTree.cpp:makePadded(unsigned char const*, unsigned long) Line  | Count  | Source  |  11  | 3.24k  | static inline const uint8_t *makePadded(const uint8_t *data, size_t size) { |  12  | 3.24k  |     static int paddedLength = 512 * 1024;  |  13  | 3.24k  |     static char *padded = new char[128 + paddedLength + 128];  |  14  |  |  |  15  |  |     /* Increase landing area if required */  |  16  | 3.24k  |     if (paddedLength < size) { |  17  | 18  |         delete [] padded;  |  18  | 18  |         paddedLength = size;  |  19  | 18  |         padded = new char [128 + paddedLength + 128];  |  20  | 18  |     }  |  21  |  |  |  22  | 3.24k  |     memcpy(padded + 128, data, size);  |  23  |  |  |  24  | 3.24k  |     return (uint8_t *) padded + 128;  |  25  | 3.24k  | }  |  
 PerMessageDeflate.cpp:makePadded(unsigned char const*, unsigned long) Line  | Count  | Source  |  11  | 292  | static inline const uint8_t *makePadded(const uint8_t *data, size_t size) { |  12  | 292  |     static int paddedLength = 512 * 1024;  |  13  | 292  |     static char *padded = new char[128 + paddedLength + 128];  |  14  |  |  |  15  |  |     /* Increase landing area if required */  |  16  | 292  |     if (paddedLength < size) { |  17  | 22  |         delete [] padded;  |  18  | 22  |         paddedLength = size;  |  19  | 22  |         padded = new char [128 + paddedLength + 128];  |  20  | 22  |     }  |  21  |  |  |  22  | 292  |     memcpy(padded + 128, data, size);  |  23  |  |  |  24  | 292  |     return (uint8_t *) padded + 128;  |  25  | 292  | }  |  
 Http.cpp:makePadded(unsigned char const*, unsigned long) Line  | Count  | Source  |  11  | 6.46k  | static inline const uint8_t *makePadded(const uint8_t *data, size_t size) { |  12  | 6.46k  |     static int paddedLength = 512 * 1024;  |  13  | 6.46k  |     static char *padded = new char[128 + paddedLength + 128];  |  14  |  |  |  15  |  |     /* Increase landing area if required */  |  16  | 6.46k  |     if (paddedLength < size) { |  17  | 37  |         delete [] padded;  |  18  | 37  |         paddedLength = size;  |  19  | 37  |         padded = new char [128 + paddedLength + 128];  |  20  | 37  |     }  |  21  |  |  |  22  | 6.46k  |     memcpy(padded + 128, data, size);  |  23  |  |  |  24  | 6.46k  |     return (uint8_t *) padded + 128;  |  25  | 6.46k  | }  |  
  | 
26  |  |  | 
27  |  | /* Splits the fuzz data in one or many chunks */  | 
28  | 11.4k  | static inline void makeChunked(const uint8_t *data, size_t size, std::function<void(const uint8_t *data, size_t size)> cb) { | 
29  |  |     /* First byte determines chunk size; 0 is all that remains, 1-255 is small chunk */  | 
30  | 4.67M  |     for (int i = 0; i < size; ) { | 
31  | 4.66M  |         unsigned int chunkSize = data[i++];  | 
32  | 4.66M  |         if (!chunkSize) { | 
33  | 3.54k  |             chunkSize = size - i;  | 
34  | 4.65M  |         } else { | 
35  | 4.65M  |             chunkSize = std::min<int>(chunkSize, size - i);  | 
36  | 4.65M  |         }  | 
37  |  |  | 
38  | 4.66M  |         cb(data + i, chunkSize);  | 
39  | 4.66M  |         i += chunkSize;  | 
40  | 4.66M  |     }  | 
41  | 11.4k  | } WebSocket.cpp:makeChunked(unsigned char const*, unsigned long, std::__1::function<void (unsigned char const*, unsigned long)>) Line  | Count  | Source  |  28  | 1.44k  | static inline void makeChunked(const uint8_t *data, size_t size, std::function<void(const uint8_t *data, size_t size)> cb) { |  29  |  |     /* First byte determines chunk size; 0 is all that remains, 1-255 is small chunk */  |  30  | 84.3k  |     for (int i = 0; i < size; ) { |  31  | 82.9k  |         unsigned int chunkSize = data[i++];  |  32  | 82.9k  |         if (!chunkSize) { |  33  | 426  |             chunkSize = size - i;  |  34  | 82.5k  |         } else { |  35  | 82.5k  |             chunkSize = std::min<int>(chunkSize, size - i);  |  36  | 82.5k  |         }  |  37  |  |  |  38  | 82.9k  |         cb(data + i, chunkSize);  |  39  | 82.9k  |         i += chunkSize;  |  40  | 82.9k  |     }  |  41  | 1.44k  | }  |  
 TopicTree.cpp:makeChunked(unsigned char const*, unsigned long, std::__1::function<void (unsigned char const*, unsigned long)>) Line  | Count  | Source  |  28  | 3.24k  | static inline void makeChunked(const uint8_t *data, size_t size, std::function<void(const uint8_t *data, size_t size)> cb) { |  29  |  |     /* First byte determines chunk size; 0 is all that remains, 1-255 is small chunk */  |  30  | 4.28M  |     for (int i = 0; i < size; ) { |  31  | 4.28M  |         unsigned int chunkSize = data[i++];  |  32  | 4.28M  |         if (!chunkSize) { |  33  | 283  |             chunkSize = size - i;  |  34  | 4.28M  |         } else { |  35  | 4.28M  |             chunkSize = std::min<int>(chunkSize, size - i);  |  36  | 4.28M  |         }  |  37  |  |  |  38  | 4.28M  |         cb(data + i, chunkSize);  |  39  | 4.28M  |         i += chunkSize;  |  40  | 4.28M  |     }  |  41  | 3.24k  | }  |  
 PerMessageDeflate.cpp:makeChunked(unsigned char const*, unsigned long, std::__1::function<void (unsigned char const*, unsigned long)>) Line  | Count  | Source  |  28  | 292  | static inline void makeChunked(const uint8_t *data, size_t size, std::function<void(const uint8_t *data, size_t size)> cb) { |  29  |  |     /* First byte determines chunk size; 0 is all that remains, 1-255 is small chunk */  |  30  | 95.5k  |     for (int i = 0; i < size; ) { |  31  | 95.2k  |         unsigned int chunkSize = data[i++];  |  32  | 95.2k  |         if (!chunkSize) { |  33  | 170  |             chunkSize = size - i;  |  34  | 95.0k  |         } else { |  35  | 95.0k  |             chunkSize = std::min<int>(chunkSize, size - i);  |  36  | 95.0k  |         }  |  37  |  |  |  38  | 95.2k  |         cb(data + i, chunkSize);  |  39  | 95.2k  |         i += chunkSize;  |  40  | 95.2k  |     }  |  41  | 292  | }  |  
 Http.cpp:makeChunked(unsigned char const*, unsigned long, std::__1::function<void (unsigned char const*, unsigned long)>) Line  | Count  | Source  |  28  | 6.46k  | static inline void makeChunked(const uint8_t *data, size_t size, std::function<void(const uint8_t *data, size_t size)> cb) { |  29  |  |     /* First byte determines chunk size; 0 is all that remains, 1-255 is small chunk */  |  30  | 208k  |     for (int i = 0; i < size; ) { |  31  | 202k  |         unsigned int chunkSize = data[i++];  |  32  | 202k  |         if (!chunkSize) { |  33  | 2.66k  |             chunkSize = size - i;  |  34  | 199k  |         } else { |  35  | 199k  |             chunkSize = std::min<int>(chunkSize, size - i);  |  36  | 199k  |         }  |  37  |  |  |  38  | 202k  |         cb(data + i, chunkSize);  |  39  | 202k  |         i += chunkSize;  |  40  | 202k  |     }  |  41  | 6.46k  | }  |  
  | 
42  |  |  | 
43  |  | /* Reads all bytes to trigger invalid reads */  | 
44  | 147k  | static inline void readBytes(std::string_view s) { | 
45  | 147k  |     volatile int sum = 0;  | 
46  | 4.39M  |     for (int i = 0; i < s.size(); i++) { | 
47  | 4.24M  |         sum += s[i];  | 
48  | 4.24M  |     }  | 
49  | 147k  | } Unexecuted instantiation: WebSocket.cpp:readBytes(std::__1::basic_string_view<char, std::__1::char_traits<char> >) Unexecuted instantiation: TopicTree.cpp:readBytes(std::__1::basic_string_view<char, std::__1::char_traits<char> >) Unexecuted instantiation: PerMessageDeflate.cpp:readBytes(std::__1::basic_string_view<char, std::__1::char_traits<char> >) Http.cpp:readBytes(std::__1::basic_string_view<char, std::__1::char_traits<char> >) Line  | Count  | Source  |  44  | 147k  | static inline void readBytes(std::string_view s) { |  45  | 147k  |     volatile int sum = 0;  |  46  | 4.39M  |     for (int i = 0; i < s.size(); i++) { |  47  | 4.24M  |         sum += s[i];  |  48  | 4.24M  |     }  |  49  | 147k  | }  |  
  | 
50  |  |  | 
51  |  | #endif  |