diff options
author | Runxi Yu <me@runxiyu.org> | 2025-03-15 15:05:12 +0800 |
---|---|---|
committer | Runxi Yu <me@runxiyu.org> | 2025-03-15 15:05:12 +0800 |
commit | 3355827fb55a22d9b8064ab55c5f26650f1b1148 (patch) | |
tree | cf8199793e504abf02b4aee0dce4b3c517a7be38 /url.ha | |
parent | Fix indirect memory leak when segments_from_path fails (diff) | |
download | forge-3355827fb55a22d9b8064ab55c5f26650f1b1148.tar.gz forge-3355827fb55a22d9b8064ab55c5f26650f1b1148.tar.zst forge-3355827fb55a22d9b8064ab55c5f26650f1b1148.zip |
Fix memory leak in segments_from_path again
Use freeall on a sub-slice instead of looping; previous behavior also
leaks the memory used by the sp slice itself.
Diffstat (limited to '')
-rw-r--r-- | url.ha | 6 |
1 files changed, 2 insertions, 4 deletions
@@ -4,7 +4,7 @@ use strings; use net::uri; -// The result must be freed with strings::freeall. +// The result, if not erroring out, 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) { @@ -12,9 +12,7 @@ fn segments_from_path(s: str) ([]str | nomem | uri::invalid) = { case let s: str => sp[i - 1] = s; case uri::invalid => - for (let j = 0z; j < i - 1; j += 1) { - free(sp[j]); - }; + strings::freeall(sp[.. i - 1]); return uri::invalid; }; }; |