aboutsummaryrefslogtreecommitdiff
path: root/url.ha
diff options
context:
space:
mode:
authorRunxi Yu <me@runxiyu.org>2025-03-15 13:19:21 +0800
committerRunxi Yu <me@runxiyu.org>2025-03-15 13:24:27 +0800
commit3b20dfb6dd79c02aa6889df9e86327a54a036249 (patch)
treee5a59d91755d3144294ed4eca1a65652edff817d /url.ha
parentHandle all errors from handlereq (diff)
downloadforge-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.ha17
1 files changed, 13 insertions, 4 deletions
diff --git a/url.ha b/url.ha
index 784f602..6c4ef79 100644
--- a/url.ha
+++ b/url.ha
@@ -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];
};