summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Stoeckmann <tobias@cvs.openbsd.org>2008-01-10 09:37:27 +0000
committerTobias Stoeckmann <tobias@cvs.openbsd.org>2008-01-10 09:37:27 +0000
commitac6fcbbef14bd3e4ade42734955fce5a4605ecd7 (patch)
tree64fc032014b8dfeed60e3de7f7066a11daab350b
parenta108fb9651b376c2877c0f89839515474f0e08bc (diff)
RCS files without head keyword mustn't segfault our implementation. Only
command that supports such files is "cvs status", therefore properly handle them in all other commands, too.
-rw-r--r--usr.bin/cvs/add.c8
-rw-r--r--usr.bin/cvs/commit.c5
-rw-r--r--usr.bin/cvs/file.c8
-rw-r--r--usr.bin/cvs/import.c5
-rw-r--r--usr.bin/cvs/rcs.c53
-rw-r--r--usr.bin/cvs/status.c13
6 files changed, 77 insertions, 15 deletions
diff --git a/usr.bin/cvs/add.c b/usr.bin/cvs/add.c
index 6a9a4c8e432..663883c54a1 100644
--- a/usr.bin/cvs/add.c
+++ b/usr.bin/cvs/add.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: add.c,v 1.82 2007/09/23 11:19:24 joris Exp $ */
+/* $OpenBSD: add.c,v 1.83 2008/01/10 09:37:26 tobias Exp $ */
/*
* Copyright (c) 2006 Joris Vink <joris@openbsd.org>
* Copyright (c) 2005, 2006 Xavier Santolaria <xsa@openbsd.org>
@@ -257,6 +257,9 @@ add_file(struct cvs_file *cf)
if (cf->file_rcs != NULL) {
head = rcs_head_get(cf->file_rcs);
+ if (head == NULL)
+ fatal("RCS head empty or missing in %s\n",
+ cf->file_rcs->rf_path);
rcsnum_tostr(head, revbuf, sizeof(revbuf));
rcsnum_free(head);
}
@@ -278,6 +281,9 @@ add_file(struct cvs_file *cf)
/* Restore the file. */
head = rcs_head_get(cf->file_rcs);
+ if (head == NULL)
+ fatal("RCS head empty or missing in %s\n",
+ cf->file_rcs->rf_path);
cvs_checkout_file(cf, head, NULL, 0);
rcsnum_free(head);
diff --git a/usr.bin/cvs/commit.c b/usr.bin/cvs/commit.c
index 1a8bc470599..b388e5bdbb9 100644
--- a/usr.bin/cvs/commit.c
+++ b/usr.bin/cvs/commit.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: commit.c,v 1.115 2007/10/08 14:13:13 joris Exp $ */
+/* $OpenBSD: commit.c,v 1.116 2008/01/10 09:37:26 tobias Exp $ */
/*
* Copyright (c) 2006 Joris Vink <joris@openbsd.org>
* Copyright (c) 2006 Xavier Santolaria <xsa@openbsd.org>
@@ -299,6 +299,9 @@ cvs_commit_local(struct cvs_file *cf)
&& cf->file_rcs != NULL && cf->file_rcs->rf_dead == 1)) {
rrev = rcs_head_get(cf->file_rcs);
crev = rcs_head_get(cf->file_rcs);
+ if (crev == NULL || rrev == NULL)
+ fatal("RCS head empty or missing in %s\n",
+ cf->file_rcs->rf_path);
tag = cvs_directory_tag;
if (cf->file_ent != NULL && cf->file_ent->ce_tag != NULL)
diff --git a/usr.bin/cvs/file.c b/usr.bin/cvs/file.c
index 9e6f27660b1..df2aa365ae5 100644
--- a/usr.bin/cvs/file.c
+++ b/usr.bin/cvs/file.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: file.c,v 1.205 2007/11/09 16:21:24 tobias Exp $ */
+/* $OpenBSD: file.c,v 1.206 2008/01/10 09:37:26 tobias Exp $ */
/*
* Copyright (c) 2006 Joris Vink <joris@openbsd.org>
* Copyright (c) 2004 Jean-Francois Brousseau <jfb@openbsd.org>
@@ -670,9 +670,11 @@ cvs_file_classify(struct cvs_file *cf, const char *tag)
cf->file_rcs)) != NULL) {
rcsnum_tostr(cf->file_rcsrev, r1, sizeof(r1));
} else {
- notag = 1;
cf->file_rcsrev = rcs_head_get(cf->file_rcs);
- cf->file_flags &= ~FILE_HAS_TAG;
+ if (cf->file_rcsrev != NULL) {
+ notag = 1;
+ cf->file_flags &= ~FILE_HAS_TAG;
+ }
}
} else if (cf->file_ent != NULL && cf->file_ent->ce_tag != NULL) {
cf->file_rcsrev = rcsnum_alloc();
diff --git a/usr.bin/cvs/import.c b/usr.bin/cvs/import.c
index b0ee976a11a..59a636906be 100644
--- a/usr.bin/cvs/import.c
+++ b/usr.bin/cvs/import.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: import.c,v 1.77 2007/09/22 16:01:22 joris Exp $ */
+/* $OpenBSD: import.c,v 1.78 2008/01/10 09:37:26 tobias Exp $ */
/*
* Copyright (c) 2006 Joris Vink <joris@openbsd.org>
*
@@ -326,6 +326,9 @@ import_update(struct cvs_file *cf)
newrev = rcsnum_inc(rev);
} else {
hrev = rcs_head_get(cf->file_rcs);
+ if (hrev == NULL)
+ fatal("RCS head empty or missing in %s\n",
+ cf->file_rcs->rf_path);
d = import_get_rcsdiff(cf, hrev);
rcsnum_free(hrev);
newrev = rcsnum_brtorev(brev);
diff --git a/usr.bin/cvs/rcs.c b/usr.bin/cvs/rcs.c
index 0fc30994ff9..37dd91ca340 100644
--- a/usr.bin/cvs/rcs.c
+++ b/usr.bin/cvs/rcs.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rcs.c,v 1.233 2008/01/10 09:35:02 tobias Exp $ */
+/* $OpenBSD: rcs.c,v 1.234 2008/01/10 09:37:26 tobias Exp $ */
/*
* Copyright (c) 2004 Jean-Francois Brousseau <jfb@openbsd.org>
* All rights reserved.
@@ -543,6 +543,9 @@ rcs_head_get(RCSFILE *file)
struct rcs_delta *rdp;
RCSNUM *rev, *rootrev;
+ if (file->rf_head == NULL)
+ return NULL;
+
rev = rcsnum_alloc();
if (file->rf_branch != NULL) {
/* we have a default branch, use that to calculate the
@@ -3297,10 +3300,30 @@ rcs_kwexp_line(char *rcsfile, struct rcs_delta *rdp, struct cvs_lines *lines,
size_t i;
/* $Log: rcs.c,v $
+ /* Revision 1.234 2008/01/10 09:37:26 tobias
+ /* RCS files without head keyword mustn't segfault our implementation. Only
+ /* command that supports such files is "cvs status", therefore properly handle
+ /* them in all other commands, too.
+ /*
/* Revision 1.233 2008/01/10 09:35:02 tobias
- /* Added support for keyword $Log$. In order to support $Log$, new lines have
+ /* Added support for keyword $Log: rcs.c,v $
+ /* Added support for keyword Revision 1.234 2008/01/10 09:37:26 tobias
+ /* Added support for keyword RCS files without head keyword mustn't segfault our implementation. Only
+ /* Added support for keyword command that supports such files is "cvs status", therefore properly handle
+ /* Added support for keyword them in all other commands, too.
+ /* Added support for keyword. In order to support $Log: rcs.c,v $
+ /* Added support for keyword $Log$. In order to support Revision 1.234 2008/01/10 09:37:26 tobias
+ /* Added support for keyword $Log$. In order to support RCS files without head keyword mustn't segfault our implementation. Only
+ /* Added support for keyword $Log$. In order to support command that supports such files is "cvs status", therefore properly handle
+ /* Added support for keyword $Log$. In order to support them in all other commands, too.
+ /* Added support for keyword $Log$. In order to support, new lines have
/* to be added which mustn't be expanded again (this log message for example
- /* would loop forever due to $Log$ keywords in it).
+ /* would loop forever due to $Log: rcs.c,v $
+ /* would loop forever due to Revision 1.234 2008/01/10 09:37:26 tobias
+ /* would loop forever due to RCS files without head keyword mustn't segfault our implementation. Only
+ /* would loop forever due to command that supports such files is "cvs status", therefore properly handle
+ /* would loop forever due to them in all other commands, too.
+ /* would loop forever due to keywords in it).
/* line */
if (!(kwtype & RCS_KW_FULLPATH))
(void)strlcat(expbuf,
@@ -3386,10 +3409,30 @@ rcs_kwexp_line(char *rcsfile, struct rcs_delta *rdp, struct cvs_lines *lines,
/*
* This is just another hairy mess, but it must
* be done: All characters behind $Log: rcs.c,v $
+ * be done: All characters behind Revision 1.234 2008/01/10 09:37:26 tobias
+ * be done: All characters behind RCS files without head keyword mustn't segfault our implementation. Only
+ * be done: All characters behind command that supports such files is "cvs status", therefore properly handle
+ * be done: All characters behind them in all other commands, too.
+ * be done: All characters behind
* be done: All characters behind Revision 1.233 2008/01/10 09:35:02 tobias
- * be done: All characters behind Added support for keyword $Log$. In order to support $Log$, new lines have
+ * be done: All characters behind Added support for keyword $Log: rcs.c,v $
+ * be done: All characters behind Added support for keyword Revision 1.234 2008/01/10 09:37:26 tobias
+ * be done: All characters behind Added support for keyword RCS files without head keyword mustn't segfault our implementation. Only
+ * be done: All characters behind Added support for keyword command that supports such files is "cvs status", therefore properly handle
+ * be done: All characters behind Added support for keyword them in all other commands, too.
+ * be done: All characters behind Added support for keyword. In order to support $Log: rcs.c,v $
+ * be done: All characters behind Added support for keyword $Log$. In order to support Revision 1.234 2008/01/10 09:37:26 tobias
+ * be done: All characters behind Added support for keyword $Log$. In order to support RCS files without head keyword mustn't segfault our implementation. Only
+ * be done: All characters behind Added support for keyword $Log$. In order to support command that supports such files is "cvs status", therefore properly handle
+ * be done: All characters behind Added support for keyword $Log$. In order to support them in all other commands, too.
+ * be done: All characters behind Added support for keyword $Log$. In order to support, new lines have
* be done: All characters behind to be added which mustn't be expanded again (this log message for example
- * be done: All characters behind would loop forever due to $Log$ keywords in it).
+ * be done: All characters behind would loop forever due to $Log: rcs.c,v $
+ * be done: All characters behind would loop forever due to Revision 1.234 2008/01/10 09:37:26 tobias
+ * be done: All characters behind would loop forever due to RCS files without head keyword mustn't segfault our implementation. Only
+ * be done: All characters behind would loop forever due to command that supports such files is "cvs status", therefore properly handle
+ * be done: All characters behind would loop forever due to them in all other commands, too.
+ * be done: All characters behind would loop forever due to keywords in it).
* be done: All characters behind will be
* written in a new line next to log messages.
* But that's not enough, we have to strip all
diff --git a/usr.bin/cvs/status.c b/usr.bin/cvs/status.c
index 7a9efef391d..82faa18cdde 100644
--- a/usr.bin/cvs/status.c
+++ b/usr.bin/cvs/status.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: status.c,v 1.77 2007/09/22 16:01:22 joris Exp $ */
+/* $OpenBSD: status.c,v 1.78 2008/01/10 09:37:26 tobias Exp $ */
/*
* Copyright (c) 2006 Joris Vink <joris@openbsd.org>
* Copyright (c) 2005, 2006 Xavier Santolaria <xsa@openbsd.org>
@@ -132,6 +132,10 @@ cvs_status_local(struct cvs_file *cf)
return;
}
+ head = rcs_head_get(cf->file_rcs);
+ if (head == NULL && cf->file_status != FILE_REMOVE_ENTRY)
+ return;
+
cvs_printf("%s\n", CVS_STATUS_SEP);
status = status_tab[cf->file_status];
@@ -141,6 +145,7 @@ cvs_status_local(struct cvs_file *cf)
if (cf->file_status == FILE_LOST ||
cf->file_status == FILE_UNKNOWN ||
+ cf->file_status == FILE_REMOVE_ENTRY ||
(cf->file_rcs != NULL && cf->in_attic == 1 && cf->fd == -1)) {
(void)xsnprintf(buf, sizeof(buf), "no file %s\t",
cf->file_name);
@@ -153,7 +158,8 @@ cvs_status_local(struct cvs_file *cf)
if (cf->file_ent == NULL) {
(void)xsnprintf(buf, sizeof(buf),
"No entry for %s", cf->file_name);
- } else if (cf->file_status == FILE_ADDED) {
+ } else if (cf->file_status == FILE_ADDED ||
+ cf->file_status == FILE_REMOVE_ENTRY) {
len = strlcpy(buf, "New file!", sizeof(buf));
if (len >= sizeof(buf))
fatal("cvs_status_local: truncation");
@@ -181,12 +187,11 @@ cvs_status_local(struct cvs_file *cf)
cvs_printf(" Working revision:\t%s\n", buf);
buf[0] = '\0';
- if (cf->file_rcs == NULL) {
+ if (cf->file_rcs == NULL || head == NULL) {
len = strlcat(buf, "No revision control file", sizeof(buf));
if (len >= sizeof(buf))
fatal("cvs_status_local: truncation");
} else {
- head = rcs_head_get(cf->file_rcs);
rcsnum_tostr(head, revbuf, sizeof(revbuf));
rcsnum_free(head);
(void)xsnprintf(buf, sizeof(buf), "%s\t%s", revbuf,