Skip to content

Commit 7486b1a

Browse files
committed
net.http: fix a panic in parse_multipart_form, for small/incomplete form data (fix #26204)
1 parent 9035f43 commit 7486b1a

2 files changed

Lines changed: 14 additions & 2 deletions

File tree

vlib/net/http/request.v

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -665,8 +665,12 @@ pub fn parse_multipart_form(body string, boundary string) (map[string]string, ma
665665
if line_segments.len < 2 {
666666
continue
667667
}
668-
line1 := field[line_segments[1].start..line_segments[1].end]
669-
line2 := field[line_segments[2].start..line_segments[2].end]
668+
line1 := field#[line_segments[1].start..line_segments[1].end]
669+
line2 := if line_segments.len == 2 {
670+
''
671+
} else {
672+
field#[line_segments[2].start..line_segments[2].end]
673+
}
670674
disposition := parse_disposition(line1.trim_space())
671675
// Grab everything between the double quotes
672676
name := disposition['name'] or { continue }

vlib/net/http/request_test.v

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,14 @@ fn test_parse_multipart_form_empty_body() {
213213
assert files.len == 0
214214
}
215215

216+
fn test_parse_multipart_form_issue_26204__do_not_panic_for_small_or_partial_forms() {
217+
boundary := '----01KDN6J6BKWY9WMYWRW4MG5J59'
218+
body := '${boundary}\r\nContent-Disposition: form-data; name="fooz"${boundary}--\r\n'
219+
form, files := http.parse_multipart_form(body, boundary)
220+
assert form.len == 0
221+
assert files.len == 0
222+
}
223+
216224
fn test_parse_multipart_form_issue_24974_raw() {
217225
body := r'------WebKiormBoundaryQcBIkwnOACVsvR8b\r\nContent-Disposition: form-data; name="files"; filename="michael-sum-LEpfefQf4rU-unsplash.jpg"\r\nContent-Type: image/jpeg\r\n\r\n\r\n------WebKitFormBoundaryQcBIkwnOACVsvR8b\r\nContent-Disposition: form-data; name="files"; filename="mikhail-vasilyev-IFxjDdqK_0U-unsplash.jpg"\r\nContent-Type: image/jpeg\r\n\r\n\r\n------WebKitFormBoundaryQcBIkwnOACVsvR8b--\r\n'
218226
boundary := r'----WebKitFormBoundaryQcBIkwnOACVsvR8b'

0 commit comments

Comments
 (0)