diff options
author | Runxi Yu <me@runxiyu.org> | 2025-03-15 13:19:21 +0800 |
---|---|---|
committer | Runxi Yu <me@runxiyu.org> | 2025-03-15 13:24:27 +0800 |
commit | 3b20dfb6dd79c02aa6889df9e86327a54a036249 (patch) | |
tree | e5a59d91755d3144294ed4eca1a65652edff817d /url.ha | |
parent | Handle all errors from handlereq (diff) | |
download | forge-3b20dfb6dd79c02aa6889df9e86327a54a036249.tar.gz forge-3b20dfb6dd79c02aa6889df9e86327a54a036249.tar.zst forge-3b20dfb6dd79c02aa6889df9e86327a54a036249.zip |
Fix indirect memory leak when segments_from_path fails
Diffstat (limited to '')
-rw-r--r-- | url.ha | 17 |
1 files changed, 13 insertions, 4 deletions
@@ -4,10 +4,19 @@ use strings; use net::uri; -// The result must be freed with strings::freeall; -fn segments_from_path(s: str) ([]str | nomem | net::uri::invalid) = { +// The result must be freed with strings::freeall. +fn segments_from_path(s: str) ([]str | nomem | uri::invalid) = { let sp: []str = strings::split(s, "/")?; - for (let i = 1z; i < len(sp); i += 1) - sp[i - 1] = net::uri::percent_decode(sp[i])?; + for (let i = 1z; i < len(sp); i += 1) { + match (uri::percent_decode(sp[i])) { + case let s: str => + sp[i - 1] = s; + case uri::invalid => + for (let j = 0z; j < i - 1; j += 1) { + free(sp[j]); + }; + return uri::invalid; + }; + }; return sp[.. len(sp) - 1]; }; |