Coverage for /pythoncovmergedfiles/medio/medio/src/python-multipart/fuzz/fuzz_decoders.py: 56%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

54 statements  

1###### Coverage stub 

2import atexit 

3import coverage 

4cov = coverage.coverage(data_file='.coverage', cover_pylib=True) 

5cov.start() 

6# Register an exist handler that will print coverage 

7def exit_handler(): 

8 cov.stop() 

9 cov.save() 

10atexit.register(exit_handler) 

11####### End of coverage stub 

12import io 

13import logging 

14import sys 

15 

16logging.disable(logging.CRITICAL) 

17 

18import atheris 

19from helpers import EnhancedDataProvider 

20 

21with atheris.instrument_imports(): 

22 from python_multipart.decoders import Base64Decoder, DecodeError, QuotedPrintableDecoder 

23 

24 

25def fuzz_base64_decoder(fdp: EnhancedDataProvider) -> None: 

26 decoder = Base64Decoder(io.BytesIO()) 

27 decoder.write(fdp.ConsumeRandomBytes()) 

28 decoder.finalize() 

29 

30 

31def fuzz_base64_decoder_chunked(fdp: EnhancedDataProvider) -> None: 

32 decoder = Base64Decoder(io.BytesIO()) 

33 num_chunks = fdp.ConsumeIntInRange(1, 8) 

34 body = fdp.ConsumeRandomBytes() 

35 chunk_size = max(1, (len(body) + num_chunks - 1) // num_chunks) 

36 for i in range(0, len(body), chunk_size): 

37 decoder.write(body[i : i + chunk_size]) 

38 decoder.finalize() 

39 

40 

41def fuzz_quoted_decoder(fdp: EnhancedDataProvider) -> None: 

42 decoder = QuotedPrintableDecoder(io.BytesIO()) 

43 decoder.write(fdp.ConsumeRandomBytes()) 

44 decoder.finalize() 

45 

46 

47def fuzz_quoted_decoder_chunked(fdp: EnhancedDataProvider) -> None: 

48 decoder = QuotedPrintableDecoder(io.BytesIO()) 

49 num_chunks = fdp.ConsumeIntInRange(1, 8) 

50 body = fdp.ConsumeRandomBytes() 

51 chunk_size = max(1, (len(body) + num_chunks - 1) // num_chunks) 

52 for i in range(0, len(body), chunk_size): 

53 decoder.write(body[i : i + chunk_size]) 

54 decoder.finalize() 

55 

56 

57def TestOneInput(data: bytes) -> None: 

58 fdp = EnhancedDataProvider(data) 

59 targets = [ 

60 fuzz_base64_decoder, 

61 fuzz_base64_decoder_chunked, 

62 fuzz_quoted_decoder, 

63 fuzz_quoted_decoder_chunked, 

64 ] 

65 target = fdp.PickValueInList(targets) 

66 

67 try: 

68 target(fdp) 

69 except DecodeError: 

70 return 

71 

72 

73def main(): 

74 atheris.Setup(sys.argv, TestOneInput) 

75 atheris.Fuzz() 

76 

77 

78if __name__ == "__main__": 

79 main()