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

From:
Stefan Sperling <stsp@stsp.name>
Subject:
stop using got_repo_map_path() in gotwebd
To:
gameoftrees@openbsd.org
Date:
Fri, 11 Apr 2025 15:38:51 +0200

Download raw body.

Thread
got_repo_map_path() is supposed to figure out whether an input path
corresponds to an on-disk file in a non-bare git repository, and map
such paths to in-repository paths. In other cases it will just return
the input path as-is.

Since gotwebd only deals with repository-relative input paths in the
first place, it can just use input paths from query strings as-is.

Avoids realpath errors seen in my gotwebd server logs, such as:
  gotweb_render_blame: got_output_file_blame: realpath: template/tmpl.c: \
    Permission denied
With the blame page showing a header but no file content.

ok?

M  gotwebd/got_operations.c  |  11+  44-

1 file changed, 11 insertions(+), 44 deletions(-)

commit - eaef053d0e02ef1c9fc0f3b86e402e87ba085efa
commit + 4dac45af0751f575663d09d961ea68e0026064cd
blob - f60b86ed8bb810bc93dbee821cc7991a64152284
blob + 0910b7745841a7f283764674dfa9ff44f77044a2
--- gotwebd/got_operations.c
+++ gotwebd/got_operations.c
@@ -339,7 +339,7 @@ got_get_repo_commits(struct request *c, size_t limit)
 	struct got_repository *repo = t->repo;
 	struct querystring *qs = t->qs;
 	struct repo_dir *repo_dir = t->repo_dir;
-	char *in_repo_path = NULL, *repo_path = NULL, *file_path = NULL;
+	char *repo_path = NULL, *file_path = NULL;
 	int chk_next = 0;
 
 	if (limit == 0)
@@ -382,10 +382,6 @@ got_get_repo_commits(struct request *c, size_t limit)
 			goto done;
 	}
 
-	error = got_repo_map_path(&in_repo_path, repo, repo_path);
-	if (error)
-		goto done;
-
 	error = got_ref_list(&refs, repo, NULL, got_ref_cmp_by_name, NULL);
 	if (error)
 		goto done;
@@ -395,7 +391,7 @@ got_get_repo_commits(struct request *c, size_t limit)
 		if (error)
 			goto done;
 	} else {
-		error = got_commit_graph_open(&graph, in_repo_path, 0);
+		error = got_commit_graph_open(&graph, "/", 0);
 		if (error)
 			goto done;
 	}
@@ -456,7 +452,6 @@ got_get_repo_commits(struct request *c, size_t limit)
 	if (graph)
 		got_commit_graph_close(graph);
 	got_ref_list_free(&refs);
-	free(in_repo_path);
 	free(file_path);
 	free(repo_path);
 	free(id);
@@ -478,7 +473,7 @@ got_get_repo_tags(struct request *c, size_t limit)
 	struct querystring *qs = t->qs;
 	struct repo_dir *repo_dir = t->repo_dir;
 	struct got_tag_object *tag = NULL;
-	char *in_repo_path = NULL, *repo_path = NULL, *id_str = NULL;
+	char *repo_path = NULL, *id_str = NULL;
 	char *tag_commit = NULL, *tag_commit0 = NULL;
 	char *commit_msg = NULL, *commit_msg0 = NULL;
 	int chk_next = 0, chk_multi = 1, commit_found = 0;
@@ -523,10 +518,6 @@ got_get_repo_tags(struct request *c, size_t limit)
 		}
 	}
 
-	error = got_repo_map_path(&in_repo_path, repo, repo_path);
-	if (error)
-		goto done;
-
 	error = got_ref_list(&refs, repo, "refs/tags", got_ref_cmp_tags,
 	   repo);
 	if (error)
@@ -683,7 +674,6 @@ got_get_repo_tags(struct request *c, size_t limit)
 		got_object_tag_close(tag);
 	got_ref_list_free(&refs);
 	free(commit_msg0);
-	free(in_repo_path);
 	free(repo_path);
 	free(id);
 	free(id_str);
@@ -704,10 +694,9 @@ got_output_repo_tree(struct request *c, char **readme,
 	struct got_reflist_head refs;
 	struct got_tree_object *tree = NULL;
 	struct got_tree_entry *te;
-	struct repo_dir *repo_dir = t->repo_dir;
 	const char *name;
 	mode_t mode;
-	char *escaped_name = NULL, *path = NULL;
+	char *escaped_name = NULL;
 	int nentries, i;
 
 	TAILQ_INIT(&refs);
@@ -715,18 +704,6 @@ got_output_repo_tree(struct request *c, char **readme,
 
 	rc = TAILQ_FIRST(&t->repo_commits);
 
-	if (qs->folder != NULL) {
-		path = strdup(qs->folder);
-		if (path == NULL) {
-			error = got_error_from_errno("strdup");
-			goto done;
-		}
-	} else {
-		error = got_repo_map_path(&path, repo, repo_dir->path);
-		if (error)
-			goto done;
-	}
-
 	error = got_repo_match_object_id(&commit_id, NULL, rc->commit_id,
 	    GOT_OBJ_TYPE_COMMIT, &refs, repo);
 	if (error)
@@ -736,7 +713,8 @@ got_output_repo_tree(struct request *c, char **readme,
 	if (error)
 		goto done;
 
-	error = got_object_id_by_path(&tree_id, repo, commit, path);
+	error = got_object_id_by_path(&tree_id, repo, commit,
+	    qs->folder ? qs->folder : "/");
 	if (error)
 		goto done;
 
@@ -765,7 +743,6 @@ got_output_repo_tree(struct request *c, char **readme,
 	}
  done:
 	free(escaped_name);
-	free(path);
 	got_ref_list_free(&refs);
 	if (commit)
 		got_object_commit_close(commit);
@@ -794,7 +771,7 @@ got_open_blob_for_output(struct got_blob_object **blob
 	struct got_object_id *commit_id = NULL;
 	struct got_object_id *blob_id = NULL;
 	struct got_reflist_head refs;
-	char *path = NULL, *in_repo_path = NULL;
+	char *path = NULL;
 	int obj_type;
 
 	TAILQ_INIT(&refs);
@@ -814,10 +791,6 @@ got_open_blob_for_output(struct got_blob_object **blob
 		goto done;
 	}
 
-	error = got_repo_map_path(&in_repo_path, repo, path);
-	if (error)
-		goto done;
-
 	if (commitstr == NULL)
 		commitstr = GOT_REF_HEAD;
 
@@ -830,7 +803,7 @@ got_open_blob_for_output(struct got_blob_object **blob
 	if (error)
 		goto done;
 
-	error = got_object_id_by_path(&blob_id, repo, commit, in_repo_path);
+	error = got_object_id_by_path(&blob_id, repo, commit, path);
 	if (error)
 		goto done;
 
@@ -874,7 +847,6 @@ got_open_blob_for_output(struct got_blob_object **blob
 	}
 
 	got_ref_list_free(&refs);
-	free(in_repo_path);
 	free(commit_id);
 	free(blob_id);
 	free(path);
@@ -1013,7 +985,7 @@ got_output_file_blame(struct request *c, got_render_bl
 	struct got_commit_object *commit = NULL;
 	struct got_reflist_head refs;
 	struct got_blob_object *blob = NULL;
-	char *path = NULL, *in_repo_path = NULL;
+	char *path = NULL;
 	struct blame_cb_args bca;
 	int i, obj_type, blobfd = -1, fd1 = -1, fd2 = -1;
 	off_t filesize;
@@ -1029,10 +1001,6 @@ got_output_file_blame(struct request *c, got_render_bl
 		goto done;
 	}
 
-	error = got_repo_map_path(&in_repo_path, repo, path);
-	if (error)
-		goto done;
-
 	error = got_repo_match_object_id(&commit_id, NULL, qs->commit,
 	    GOT_OBJ_TYPE_COMMIT, &refs, repo);
 	if (error)
@@ -1042,7 +1010,7 @@ got_output_file_blame(struct request *c, got_render_bl
 	if (error)
 		goto done;
 
-	error = got_object_id_by_path(&obj_id, repo, commit, in_repo_path);
+	error = got_object_id_by_path(&obj_id, repo, commit, path);
 	if (error)
 		goto done;
 
@@ -1107,7 +1075,7 @@ got_output_file_blame(struct request *c, got_render_bl
 	if (error)
 		goto done;
 
-	error = got_blame(in_repo_path, commit_id, repo,
+	error = got_blame(path, commit_id, repo,
 	    GOT_DIFF_ALGORITHM_PATIENCE, got_gotweb_blame_cb, &bca, NULL, NULL,
 	    fd1, fd2, f1, f2);
 
@@ -1146,7 +1114,6 @@ got_output_file_blame(struct request *c, got_render_bl
 		got_object_commit_close(commit);
 	if (blob)
 		got_object_blob_close(blob);
-	free(in_repo_path);
 	free(commit_id);
 	free(obj_id);
 	free(path);