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

From:
Omar Polo <op@omarpolo.com>
Subject:
gotwebd: simplify gotweb_load_got_path
To:
gameoftrees@openbsd.org
Date:
Wed, 31 Aug 2022 18:48:34 +0200

Download raw body.

Thread
landed here why looking for possible leaks.  Still found none, but I
thought we can avoid an extra strdup and simplify the logic by
dropping `opened'.  We either have opened a dir (and so dt is non
NULL) or we haven't.

ok?

diff /home/op/w/got
commit - 794662a4547b17c0243addf37d330d39e0eb5662
path + /home/op/w/got
blob - 72a93ffe88a0fd5d23ee1850893733ac1c37c39c
file + gotwebd/gotweb.c
--- gotwebd/gotweb.c
+++ gotwebd/gotweb.c
@@ -1920,7 +1920,6 @@ gotweb_load_got_path(struct request *c, struct repo_di
 	struct transport *t = c->t;
 	DIR *dt;
 	char *dir_test;
-	int opened = 0;
 
 	if (asprintf(&dir_test, "%s/%s/%s", srv->repos_path, repo_dir->name,
 	    GOTWEB_GIT_DIR) == -1)
@@ -1930,52 +1929,36 @@ gotweb_load_got_path(struct request *c, struct repo_di
 	if (dt == NULL) {
 		free(dir_test);
 	} else {
-		repo_dir->path = strdup(dir_test);
-		if (repo_dir->path == NULL) {
-			opened = 1;
-			error = got_error_from_errno("strdup");
-			goto err;
-		}
-		opened = 1;
+		repo_dir->path = dir_test;
+		dir_test = NULL;
 		goto done;
 	}
 
 	if (asprintf(&dir_test, "%s/%s/%s", srv->repos_path, repo_dir->name,
-	    GOTWEB_GOT_DIR) == -1) {
-		dir_test = NULL;
-		error = got_error_from_errno("asprintf");
-		goto err;
-	}
+	    GOTWEB_GOT_DIR) == -1)
+		return got_error_from_errno("asprintf");
 
 	dt = opendir(dir_test);
 	if (dt == NULL)
 		free(dir_test);
 	else {
-		opened = 1;
 		error = got_error(GOT_ERR_NOT_GIT_REPO);
 		goto err;
 	}
 
 	if (asprintf(&dir_test, "%s/%s", srv->repos_path,
-	    repo_dir->name) == -1) {
-		error = got_error_from_errno("asprintf");
-		dir_test = NULL;
-		goto err;
-	}
+	    repo_dir->name) == -1)
+		return got_error_from_errno("asprintf");
 
-	repo_dir->path = strdup(dir_test);
-	if (repo_dir->path == NULL) {
-		opened = 1;
-		error = got_error_from_errno("strdup");
-		goto err;
-	}
-
 	dt = opendir(dir_test);
 	if (dt == NULL) {
 		error = got_error_path(repo_dir->name, GOT_ERR_NOT_GIT_REPO);
 		goto err;
-	} else
-		opened = 1;
+	} else {
+		repo_dir->path = dir_test;
+		dir_test = NULL;
+	}
+
 done:
 	error = got_repo_open(&t->repo, repo_dir->path, NULL, sock->pack_fds);
 	if (error)
@@ -1994,9 +1977,8 @@ done:
 	error = gotweb_get_clone_url(&repo_dir->url, srv, repo_dir->path);
 err:
 	free(dir_test);
-	if (opened)
-		if (dt != NULL && closedir(dt) == EOF && error == NULL)
-			error = got_error_from_errno("closedir");
+	if (dt != NULL && closedir(dt) == EOF && error == NULL)
+		error = got_error_from_errno("closedir");
 	return error;
 }