From: Omar Polo Subject: gotwebd: some tweaks for got_output_repo_tree To: gameoftrees@openbsd.org Date: Fri, 02 Sep 2022 15:56:31 +0200 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 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 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 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)