@@ -545,6 +545,9 @@ rfbDisconnectUDPSock(rfbScreenInfoPtr rfbScreen)
545545void
546546rfbCloseClient (rfbClientPtr cl )
547547{
548+ #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
549+ cl -> sock = RFB_INVALID_SOCKET ;
550+ #endif
548551 rfbExtensionData * extension ;
549552
550553 for (extension = cl -> extensions ; extension ; extension = extension -> next )
@@ -638,6 +641,12 @@ rfbConnect(rfbScreenInfoPtr rfbScreen,
638641 return sock ;
639642}
640643
644+ #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
645+ size_t fuzz_offset ;
646+ size_t fuzz_size ;
647+ const uint8_t * fuzz_data ;
648+ #endif
649+
641650/*
642651 * ReadExact reads an exact number of bytes from a client. Returns 1 if
643652 * those bytes have been read, 0 if the other end has closed, or -1 if an error
@@ -647,6 +656,14 @@ rfbConnect(rfbScreenInfoPtr rfbScreen,
647656int
648657rfbReadExactTimeout (rfbClientPtr cl , char * buf , int len , int timeout )
649658{
659+ #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
660+ if (fuzz_offset + len <= fuzz_size ) {
661+ memcpy (buf , fuzz_data + fuzz_offset , len );
662+ fuzz_offset += len ;
663+ return 1 ;
664+ }
665+ return 0 ;
666+ #endif
650667 rfbSocket sock = cl -> sock ;
651668 int n ;
652669 fd_set fds ;
@@ -739,6 +756,14 @@ int rfbReadExact(rfbClientPtr cl,char* buf,int len)
739756int
740757rfbPeekExactTimeout (rfbClientPtr cl , char * buf , int len , int timeout )
741758{
759+ #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
760+ if (fuzz_offset + len <= fuzz_size ) {
761+ memcpy (buf , fuzz_data + fuzz_offset , len );
762+ fuzz_offset += len ;
763+ return 1 ;
764+ }
765+ return 0 ;
766+ #endif
742767 rfbSocket sock = cl -> sock ;
743768 int n ;
744769 fd_set fds ;
@@ -817,6 +842,9 @@ rfbWriteExact(rfbClientPtr cl,
817842 const char * buf ,
818843 int len )
819844{
845+ #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
846+ return 1 ;
847+ #endif
820848 rfbSocket sock = cl -> sock ;
821849 int n ;
822850 fd_set fds ;
0 commit comments