60 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/* This is a fuzz test of the websocket parser */
 | 
						|
 | 
						|
#define WIN32_EXPORT
 | 
						|
 | 
						|
#include "helpers.h"
 | 
						|
 | 
						|
/* We test the websocket parser */
 | 
						|
#include "../src/WebSocketProtocol.h"
 | 
						|
 | 
						|
struct Impl {
 | 
						|
    static bool refusePayloadLength(uint64_t length, uWS::WebSocketState<true> *wState, void *s) {
 | 
						|
 | 
						|
        /* We need a limit */
 | 
						|
        if (length > 16000) {
 | 
						|
            return true;
 | 
						|
        }
 | 
						|
 | 
						|
        /* Return ok */
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
 | 
						|
    static bool setCompressed(uWS::WebSocketState<true> *wState, void *s) {
 | 
						|
        /* We support it */
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
 | 
						|
    static void forceClose(uWS::WebSocketState<true> *wState, void *s) {
 | 
						|
 | 
						|
    }
 | 
						|
 | 
						|
    static bool handleFragment(char *data, size_t length, unsigned int remainingBytes, int opCode, bool fin, uWS::WebSocketState<true> *webSocketState, void *s) {
 | 
						|
 | 
						|
        if (opCode == uWS::TEXT) {
 | 
						|
            if (!uWS::protocol::isValidUtf8((unsigned char *)data, length)) {
 | 
						|
                /* Return break */
 | 
						|
                return true;
 | 
						|
            }
 | 
						|
        } else if (opCode == uWS::CLOSE) {
 | 
						|
            uWS::protocol::parseClosePayload((char *)data, length);
 | 
						|
        }
 | 
						|
 | 
						|
        /* Return ok */
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
 | 
						|
 | 
						|
    /* Create the parser state */
 | 
						|
    uWS::WebSocketState<true> state;
 | 
						|
 | 
						|
    makeChunked(makePadded(data, size), size, [&state](const uint8_t *data, size_t size) {
 | 
						|
        /* Parse it */
 | 
						|
        uWS::WebSocketProtocol<true, Impl>::consume((char *) data, size, &state, nullptr);
 | 
						|
    });
 | 
						|
 | 
						|
    return 0;
 | 
						|
}
 | 
						|
 |