"GOT", but the "O" is a cute, smiling pufferfish. Index | Thread | Search

From:
Omar Polo <op@omarpolo.com>
Subject:
gotwebd: some tweaks for got_output_repo_tree
To:
gameoftrees@openbsd.org
Date:
Fri, 02 Sep 2022 15:56:31 +0200

Download raw body.

Thread
no leaks this time, but some clarifications.  spotted while trying to
understand why the memory consumption grows after fetching the tag
pages many times in a row.

-----------------------------------------------
commit 91a935ebd8cecad8754778a8eb429f3ce7883dff
from: Omar Polo <op@omarpolo.com>
date: Fri Sep  2 13:54:34 2022 UTC
 
 gotwebd: avoid extra variable in got_output_repo_tree
 
 in_repo_path was used only to build a path, it's then assigned to path
 (which is NULL at that point.)  Just asprintf into path.
 
diff 4a962942057bae9fbd47916e75d554fb52e0ec37 91a935ebd8cecad8754778a8eb429f3ce7883dff
commit - 4a962942057bae9fbd47916e75d554fb52e0ec37
commit + 91a935ebd8cecad8754778a8eb429f3ce7883dff
blob - 5ea76c0eefd10ebe0ddf57279275a15c27edd525
blob + f500314c106449c5c3d6cfec055ece7d261e05bb
--- gotwebd/got_operations.c
+++ gotwebd/got_operations.c
@@ -817,7 +817,7 @@ got_output_repo_tree(struct request *c)
 	struct repo_dir *repo_dir = t->repo_dir;
 	const char *name, *index_page_str, *folder;
 	char *id_str = NULL, *escaped_name = NULL;
-	char *path = NULL, *in_repo_path = NULL, *modestr = NULL;
+	char *path = NULL, *modestr = NULL;
 	int nentries, i, r;
 
 	TAILQ_INIT(&refs);
@@ -831,11 +831,9 @@ got_output_repo_tree(struct request *c)
 			goto done;
 		}
 	} else {
-		error = got_repo_map_path(&in_repo_path, repo, repo_dir->path);
+		error = got_repo_map_path(&path, repo, repo_dir->path);
 		if (error)
 			goto done;
-		free(path);
-		path = in_repo_path;
 	}
 
 	error = got_repo_match_object_id(&commit_id, NULL, rc->commit_id,

-----------------------------------------------
commit ea12a359808085ba4a77be8e51b3e37d3f1d4dc0
from: Omar Polo <op@omarpolo.com>
date: Fri Sep  2 13:54:34 2022 UTC
 
 gotwebd: avoid extra strdups in got_output_repo_tree
 
diff 91a935ebd8cecad8754778a8eb429f3ce7883dff ea12a359808085ba4a77be8e51b3e37d3f1d4dc0
commit - 91a935ebd8cecad8754778a8eb429f3ce7883dff
commit + ea12a359808085ba4a77be8e51b3e37d3f1d4dc0
blob - f500314c106449c5c3d6cfec055ece7d261e05bb
blob + c87fec28cbaed7e09bb1e40fe6bcd3e295ca5940
--- gotwebd/got_operations.c
+++ gotwebd/got_operations.c
@@ -816,8 +816,7 @@ got_output_repo_tree(struct request *c)
 	struct got_tree_object *tree = NULL;
 	struct repo_dir *repo_dir = t->repo_dir;
 	const char *name, *index_page_str, *folder;
-	char *id_str = NULL, *escaped_name = NULL;
-	char *path = NULL, *modestr = NULL;
+	char *id_str = NULL, *escaped_name = NULL, *path = NULL;
 	int nentries, i, r;
 
 	TAILQ_INIT(&refs);
@@ -859,6 +858,7 @@ got_output_repo_tree(struct request *c)
 	folder = qs->folder ? qs->folder : "";
 
 	for (i = 0; i < nentries; i++) {
+		const char *modestr;
 		struct got_tree_entry *te;
 		mode_t mode;
 
@@ -868,41 +868,17 @@ got_output_repo_tree(struct request *c)
 		if (error)
 			goto done;
 
-		modestr = strdup("");
-		if (modestr == NULL) {
-			error = got_error_from_errno("strdup");
-			goto done;
-		}
 		mode = got_tree_entry_get_mode(te);
-		if (got_object_tree_entry_is_submodule(te)) {
-			free(modestr);
-			modestr = strdup("$");
-			if (modestr == NULL) {
-				error = got_error_from_errno("strdup");
-				goto done;
-			}
-		} else if (S_ISLNK(mode)) {
-			free(modestr);
-			modestr = strdup("@");
-			if (modestr == NULL) {
-				error = got_error_from_errno("strdup");
-				goto done;
-			}
-		} else if (S_ISDIR(mode)) {
-			free(modestr);
-			modestr = strdup("/");
-			if (modestr == NULL) {
-				error = got_error_from_errno("strdup");
-				goto done;
-			}
-		} else if (mode & S_IXUSR) {
-			free(modestr);
-			modestr = strdup("*");
-			if (modestr == NULL) {
-				error = got_error_from_errno("strdup");
-				goto done;
-			}
-		}
+		if (got_object_tree_entry_is_submodule(te))
+			modestr = "$";
+		else if (S_ISLNK(mode))
+			modestr = "@";
+		else if (S_ISDIR(mode))
+			modestr = "/";
+		else if (mode & S_IXUSR)
+			modestr = "*";
+		else
+			modestr = "";
 
 		name = got_tree_entry_get_name(te);
 		error = gotweb_escape_html(&escaped_name, name);
@@ -949,15 +925,12 @@ got_output_repo_tree(struct request *c)
 		}
 		free(id_str);
 		id_str = NULL;
-		free(modestr);
-		modestr = NULL;
 		free(escaped_name);
 		escaped_name = NULL;
 	}
 done:
 	free(escaped_name);
 	free(id_str);
-	free(modestr);
 	free(path);
 	got_ref_list_free(&refs);
 	if (commit)

-----------------------------------------------
commit 2658afb7cf641e2cc35c4c7816049fde1a014f81 (leaks)
from: Omar Polo <op@omarpolo.com>
date: Fri Sep  2 13:54:34 2022 UTC
 
 gotwebd: kill unused id_str in got_output_repo_tree
 
diff ea12a359808085ba4a77be8e51b3e37d3f1d4dc0 2658afb7cf641e2cc35c4c7816049fde1a014f81
commit - ea12a359808085ba4a77be8e51b3e37d3f1d4dc0
commit + 2658afb7cf641e2cc35c4c7816049fde1a014f81
blob - c87fec28cbaed7e09bb1e40fe6bcd3e295ca5940
blob + 14d7cbf7261ca9171a51aa4286a2d0870ffcf937
--- gotwebd/got_operations.c
+++ gotwebd/got_operations.c
@@ -816,7 +816,7 @@ got_output_repo_tree(struct request *c)
 	struct got_tree_object *tree = NULL;
 	struct repo_dir *repo_dir = t->repo_dir;
 	const char *name, *index_page_str, *folder;
-	char *id_str = NULL, *escaped_name = NULL, *path = NULL;
+	char *escaped_name = NULL, *path = NULL;
 	int nentries, i, r;
 
 	TAILQ_INIT(&refs);
@@ -864,10 +864,6 @@ got_output_repo_tree(struct request *c)
 
 		te = got_object_tree_get_entry(tree, i);
 
-		error = got_object_id_str(&id_str, got_tree_entry_get_id(te));
-		if (error)
-			goto done;
-
 		mode = got_tree_entry_get_mode(te);
 		if (got_object_tree_entry_is_submodule(te))
 			modestr = "$";
@@ -923,14 +919,11 @@ got_output_repo_tree(struct request *c)
 			if (r == -1)
 				goto done;
 		}
-		free(id_str);
-		id_str = NULL;
 		free(escaped_name);
 		escaped_name = NULL;
 	}
 done:
 	free(escaped_name);
-	free(id_str);
 	free(path);
 	got_ref_list_free(&refs);
 	if (commit)