summaryrefslogtreecommitdiffstats
path: root/usr.bin/cvs/file.c
diff options
context:
space:
mode:
authorjoris <joris@openbsd.org>2005-09-06 15:29:33 +0000
committerjoris <joris@openbsd.org>2005-09-06 15:29:33 +0000
commitff117408ee6fd39282507c9ef69a1bb7b29096b0 (patch)
tree6bda62632be4678e7ece5da2b66fd5f01f1aca92 /usr.bin/cvs/file.c
parentStep three: remove now unused advmcode*. (diff)
downloadwireguard-openbsd-ff117408ee6fd39282507c9ef69a1bb7b29096b0.tar.xz
wireguard-openbsd-ff117408ee6fd39282507c9ef69a1bb7b29096b0.zip
Make sure entries do not go away when we run through them in the file code.
Fixes corrupt Entry files. Problem found by Mike Pechkin, thanks.
Diffstat (limited to 'usr.bin/cvs/file.c')
-rw-r--r--usr.bin/cvs/file.c36
1 files changed, 17 insertions, 19 deletions
diff --git a/usr.bin/cvs/file.c b/usr.bin/cvs/file.c
index bacda35e99c..c11ccc21e28 100644
--- a/usr.bin/cvs/file.c
+++ b/usr.bin/cvs/file.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: file.c,v 1.116 2005/08/19 13:36:50 joris Exp $ */
+/* $OpenBSD: file.c,v 1.117 2005/09/06 15:29:33 joris Exp $ */
/*
* Copyright (c) 2004 Jean-Francois Brousseau <jfb@openbsd.org>
* All rights reserved.
@@ -837,6 +837,15 @@ cvs_file_getdir(CVSFILE *cf, int flags, int (*cb)(CVSFILE *, void *),
!strcmp(de->d_name, ".."))
continue;
+ len = cvs_path_cat(fpath, de->d_name, pbuf, sizeof(pbuf));
+ if (len >= sizeof(pbuf))
+ goto done;
+
+ if (entf != NULL)
+ ent = cvs_ent_get(entf, de->d_name);
+ else
+ ent = NULL;
+
/*
* Do some filtering on the current directory item.
*/
@@ -844,26 +853,14 @@ cvs_file_getdir(CVSFILE *cf, int flags, int (*cb)(CVSFILE *, void *),
continue;
if (!(flags & CF_RECURSE) && (de->d_type == DT_DIR)) {
- if (entf != NULL)
- (void)cvs_ent_remove(entf, de->d_name);
+ if (ent != NULL)
+ ent->processed = 1;
continue;
}
if ((de->d_type != DT_DIR) && (flags & CF_NOFILES))
continue;
- /*
- * Obtain info about the item.
- */
- len = cvs_path_cat(fpath, de->d_name, pbuf, sizeof(pbuf));
- if (len >= sizeof(pbuf))
- goto done;
-
- if (entf != NULL)
- ent = cvs_ent_get(entf, de->d_name);
- else
- ent = NULL;
-
cfp = cvs_file_lget(pbuf, flags, cf, entf, ent);
if (cfp == NULL) {
cvs_log(LP_ERR, "failed to get '%s'", pbuf);
@@ -892,11 +889,10 @@ cvs_file_getdir(CVSFILE *cf, int flags, int (*cb)(CVSFILE *, void *),
}
/*
- * Remove it from the Entries list to make sure it won't
- * be picked up again when we look at the Entries.
+ * Mark the entry as processed.
*/
- if (entf != NULL)
- (void)cvs_ent_remove(entf, de->d_name);
+ if (ent != NULL)
+ ent->processed = 1;
/*
* If we don't want to keep it, free it
@@ -915,6 +911,8 @@ cvs_file_getdir(CVSFILE *cf, int flags, int (*cb)(CVSFILE *, void *),
* (Follows the same procedure as above ... can we merge them?)
*/
while ((entf != NULL) && ((ent = cvs_ent_next(entf)) != NULL)) {
+ if (ent->processed == 1)
+ continue;
if (!(flags & CF_RECURSE) && (ent->ce_type == CVS_ENT_DIR))
continue;
if ((flags & CF_NOFILES) && (ent->ce_type != CVS_ENT_DIR))