fuzz-url.rs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #![no_main]
  2. #[macro_use]
  3. extern crate libfuzzer_sys;
  4. extern crate url;
  5. use std::str;
  6. use url::{Url, quirks, Origin, Host, Position};
  7. fuzz_target!(|data: &[u8]| {
  8. // Initialisation
  9. let utf8 = match str::from_utf8(data) {
  10. Ok(v) => v,
  11. Err(_) => return,
  12. };
  13. let mut url_parse_attempt = Url::parse(utf8);
  14. // Randomly fuzz functions
  15. match data.get(0) {
  16. Some(&choice) => match choice % 20 {
  17. 0 => {
  18. if let Ok(parsed_url) = &url_parse_attempt {
  19. let _ = parsed_url.query();
  20. }
  21. },
  22. 1 => {
  23. if let Ok(parsed_url) = &url_parse_attempt {
  24. let _ = parsed_url.fragment();
  25. }
  26. },
  27. 2 => {
  28. if let Ok(parsed_url) = &mut url_parse_attempt {
  29. let _ = quirks::set_protocol(parsed_url, utf8);
  30. }
  31. },
  32. 3 => {
  33. if let Ok(parsed_url) = &mut url_parse_attempt {
  34. let _ = quirks::set_username(parsed_url, utf8);
  35. }
  36. },
  37. 4 => {
  38. if let Ok(parsed_url) = &mut url_parse_attempt {
  39. let _ = quirks::set_password(parsed_url, utf8);
  40. }
  41. },
  42. 5 => {
  43. if let Ok(parsed_url) = &mut url_parse_attempt {
  44. quirks::set_search(parsed_url, utf8);
  45. }
  46. },
  47. 6 => {
  48. if let Ok(parsed_url) = &mut url_parse_attempt {
  49. quirks::set_hash(parsed_url, utf8);
  50. }
  51. },
  52. 7 => {
  53. if let Ok(parsed_url) = &mut url_parse_attempt {
  54. parsed_url.set_scheme("https").ok();
  55. }
  56. },
  57. 8 => {
  58. if let Ok(parsed_url) = &mut url_parse_attempt {
  59. let _ = parsed_url.set_host(Some("example.com"));
  60. }
  61. },
  62. 9 => {
  63. if let Ok(parsed_url) = &mut url_parse_attempt {
  64. let _ = parsed_url.set_port(Some(8080));
  65. }
  66. },
  67. 10 => {
  68. if let Ok(parsed_url) = &mut url_parse_attempt {
  69. let _ = parsed_url.set_path("/test/path");
  70. }
  71. },
  72. 11 => {
  73. if let Ok(parsed_url) = &mut url_parse_attempt {
  74. let _ = parsed_url.path_segments_mut().map(|mut segments| {
  75. segments.push("segment1");
  76. segments.push("segment2");
  77. });
  78. }
  79. },
  80. 12 => {
  81. if let Ok(parsed_url) = &mut url_parse_attempt {
  82. let _ = parsed_url.set_query(Some("key=value"));
  83. }
  84. },
  85. 13 => {
  86. if let Ok(parsed_url) = &mut url_parse_attempt {
  87. let _ = parsed_url.set_fragment(Some("fragment"));
  88. }
  89. },
  90. 14 => {
  91. if let Ok(parsed_url) = &url_parse_attempt {
  92. if let Some(domain) = parsed_url.host_str() {
  93. let _ = Host::parse(domain);
  94. }
  95. }
  96. },
  97. 15 => {
  98. if let Ok(parsed_url) = &url_parse_attempt {
  99. let _ = parsed_url.origin().ascii_serialization();
  100. }
  101. },
  102. 16 => {
  103. if let Ok(parsed_url) = &mut url_parse_attempt {
  104. let _ = parsed_url.join("/relative/path");
  105. }
  106. },
  107. 17 => {
  108. if let Ok(parsed_url) = &mut url_parse_attempt {
  109. let _ = parsed_url.make_relative(&Url::parse("https://example.com/base").unwrap());
  110. }
  111. },
  112. 18 => {
  113. if let Ok(parsed_url) = &url_parse_attempt {
  114. let _ = &parsed_url[Position::BeforeHost..Position::AfterPort];
  115. }
  116. },
  117. 19 => {
  118. if let Ok(parsed_url) = &url_parse_attempt {
  119. let _ = &parsed_url[Position::BeforeScheme..];
  120. }
  121. },
  122. _ => {},
  123. },
  124. None => {},
  125. }
  126. });