From 3355827fb55a22d9b8064ab55c5f26650f1b1148 Mon Sep 17 00:00:00 2001
From: Runxi Yu <me@runxiyu.org>
Date: Sat, 15 Mar 2025 15:05:12 +0800
Subject: [PATCH] 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.

---
 url.ha | 6 ++----

diff --git a/url.ha b/url.ha
index 6c4ef792d4b2f98ad30379b98674d112bff650bf..1c511ba1bb2b73eb4ff88ee8cb7b77e2c55082e4 100644
--- a/url.ha
+++ b/url.ha
@@ -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 @@ 		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]);
-			};
+			strings::freeall(sp[.. i - 1]);
 			return uri::invalid;
 		};
 	};

-- 
2.48.1