Coverage for /pythoncovmergedfiles/medio/medio/src/python-multipart/fuzz/fuzz_form.py: 44%

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

45 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 sys 

14from unittest.mock import Mock 

15 

16import atheris 

17from helpers import EnhancedDataProvider 

18 

19with atheris.instrument_imports(): 

20 from python_multipart.exceptions import FormParserError 

21 from python_multipart.multipart import parse_form 

22 

23on_field = Mock() 

24on_file = Mock() 

25 

26 

27def parse_octet_stream(fdp: EnhancedDataProvider) -> None: 

28 header = {"Content-Type": "application/octet-stream"} 

29 parse_form(header, io.BytesIO(fdp.ConsumeRandomBytes()), on_field, on_file) 

30 

31 

32def parse_url_encoded(fdp: EnhancedDataProvider) -> None: 

33 header = {"Content-Type": "application/x-url-encoded"} 

34 parse_form(header, io.BytesIO(fdp.ConsumeRandomBytes()), on_field, on_file) 

35 

36 

37def parse_form_urlencoded(fdp: EnhancedDataProvider) -> None: 

38 header = {"Content-Type": "application/x-www-form-urlencoded"} 

39 parse_form(header, io.BytesIO(fdp.ConsumeRandomBytes()), on_field, on_file) 

40 

41 

42def parse_multipart_form_data(fdp: EnhancedDataProvider) -> None: 

43 boundary = "boundary" 

44 header = {"Content-Type": f"multipart/form-data; boundary={boundary}"} 

45 body = ( 

46 f"--{boundary}\r\n" 

47 f"Content-Type: multipart/form-data; boundary={boundary}\r\n\r\n" 

48 f"{fdp.ConsumeRandomString()}\r\n" 

49 f"--{boundary}--\r\n" 

50 ) 

51 parse_form(header, io.BytesIO(body.encode("latin1", errors="ignore")), on_field, on_file) 

52 

53 

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

55 fdp = EnhancedDataProvider(data) 

56 targets = [parse_octet_stream, parse_url_encoded, parse_form_urlencoded, parse_multipart_form_data] 

57 target = fdp.PickValueInList(targets) 

58 

59 try: 

60 target(fdp) 

61 except FormParserError: 

62 return 

63 

64 

65def main(): 

66 atheris.Setup(sys.argv, TestOneInput) 

67 atheris.Fuzz() 

68 

69 

70if __name__ == "__main__": 

71 main()