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

From:
"Omar Polo" <op@omarpolo.com>
Subject:
readdir() checks for . and ..
To:
gameoftrees@openbsd.org
Date:
Sat, 31 May 2025 19:37:32 +0200

Download raw body.

Thread
decided to take a look due to other patches in other places :)

out of these, the only place where I feel like the "." and ".." checks
were missing is in write_tree() -- all the others use
got_repo_is_packidx_filename() which will obviously fail for those
entries.

what do you think?

diff /home/op/w/got
path + /home/op/w/got
commit - a068a093ed454b5cfd537a6916f6b32c18a541b6
blob - 8d2c4a28815971860618446c5701073d301b1ee6
file + lib/repository.c
--- lib/repository.c
+++ lib/repository.c
@@ -1466,6 +1466,10 @@ got_repo_list_packidx(struct got_pathlist_head *packid
 	repo->pack_path_mtime.tv_nsec = sb.st_mtim.tv_nsec;
 
 	while ((dent = readdir(packdir)) != NULL) {
+		if (strcmp(dent->d_name, ".") == 0 ||
+		    strcmp(dent->d_name, "..") == 0)
+			continue;
+
 		if (!got_repo_is_packidx_filename(dent->d_name, dent->d_namlen,
 		    repo->algo))
 			continue;
@@ -2404,6 +2408,10 @@ write_tree(struct got_object_id **new_tree_id, const c
 			goto done;
 		}
 
+		if (strcmp(de->d_name, ".") == 0 ||
+		    strcmp(de->d_name, "..") == 0)
+			continue;
+
 		err = got_path_dirent_type(&type, path_dir, de);
 		if (err)
 			goto done;
@@ -2612,6 +2620,10 @@ got_repo_get_packfile_info(int *npackfiles, int *nobje
 	}
 
 	while ((dent = readdir(packdir)) != NULL) {
+		if (strcmp(dent->d_name, ".") == 0 ||
+		    strcmp(dent->d_name, "..") == 0)
+			continue;
+
 		if (!got_repo_is_packidx_filename(dent->d_name, dent->d_namlen,
 		    repo->algo))
 			continue;
commit - a068a093ed454b5cfd537a6916f6b32c18a541b6
blob - 6bb4d83c2ec663c885893601aafb2d48f211c031
file + lib/repository_admin.c
--- lib/repository_admin.c
+++ lib/repository_admin.c
@@ -1675,6 +1675,10 @@ got_repo_remove_lonely_packidx(struct got_repository *
 				goto done;
 		}
 
+		if (strcmp(dent->d_name, ".") == 0 ||
+		    strcmp(dent->d_name, "..") == 0)
+			continue;
+
 		if (!got_repo_is_packidx_filename(dent->d_name, dent->d_namlen,
 		    got_repo_get_object_format(repo)))
 			continue;