summaryrefslogtreecommitdiff
path: root/usr.bin/cvs/rcs.c
diff options
context:
space:
mode:
authorJean-Francois Brousseau <jfb@cvs.openbsd.org>2005-04-19 19:22:32 +0000
committerJean-Francois Brousseau <jfb@cvs.openbsd.org>2005-04-19 19:22:32 +0000
commit9321b623276fb2c1e254bb9c9a360e3f5f0f133b (patch)
tree1c11e63cf87cda6f53d04ad035a597e58ea2ef0f /usr.bin/cvs/rcs.c
parent3c5a45320372654a01cd07b83845dd39dcd5eb29 (diff)
add rcs_sym_check() to check the validity of an RCS symbol and
sprinkle some in the other symbol functions
Diffstat (limited to 'usr.bin/cvs/rcs.c')
-rw-r--r--usr.bin/cvs/rcs.c47
1 files changed, 46 insertions, 1 deletions
diff --git a/usr.bin/cvs/rcs.c b/usr.bin/cvs/rcs.c
index b259db4ff1a..602be5f42ea 100644
--- a/usr.bin/cvs/rcs.c
+++ b/usr.bin/cvs/rcs.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rcs.c,v 1.46 2005/04/12 14:40:19 jfb Exp $ */
+/* $OpenBSD: rcs.c,v 1.47 2005/04/19 19:22:31 jfb Exp $ */
/*
* Copyright (c) 2004 Jean-Francois Brousseau <jfb@openbsd.org>
* All rights reserved.
@@ -111,6 +111,10 @@ struct rcs_foo {
#define RCS_TOKLEN(rfp) ((struct rcs_pdata *)rfp->rf_pdata)->rp_tlen
+
+/* invalid characters in RCS symbol names */
+static const char rcs_sym_invch[] = "$,.:;@";
+
#ifdef notyet
static struct rcs_kfl {
char rk_char;
@@ -594,6 +598,11 @@ rcs_sym_add(RCSFILE *rfp, const char *sym, RCSNUM *snum)
{
struct rcs_sym *symp;
+ if (!rcs_sym_check(sym)) {
+ rcs_errno = RCS_ERR_BADSYM;
+ return (NULL);
+ }
+
/* first look for duplication */
TAILQ_FOREACH(symp, &(rfp->rf_symbols), rs_list) {
if (strcmp(symp->rs_name, sym) == 0) {
@@ -643,6 +652,11 @@ rcs_sym_remove(RCSFILE *file, const char *sym)
{
struct rcs_sym *symp;
+ if (!rcs_sym_check(sym)) {
+ rcs_errno = RCS_ERR_BADSYM;
+ return (NULL);
+ }
+
TAILQ_FOREACH(symp, &(file->rf_symbols), rs_list)
if (strcmp(symp->rs_name, sym) == 0)
break;
@@ -676,6 +690,11 @@ rcs_sym_getrev(RCSFILE *file, const char *sym)
RCSNUM *num;
struct rcs_sym *symp;
+ if (!rcs_sym_check(sym)) {
+ rcs_errno = RCS_ERR_BADSYM;
+ return (NULL);
+ }
+
num = NULL;
TAILQ_FOREACH(symp, &(file->rf_symbols), rs_list)
if (strcmp(symp->rs_name, sym) == 0)
@@ -693,6 +712,32 @@ rcs_sym_getrev(RCSFILE *file, const char *sym)
}
/*
+ * rcs_sym_check()
+ *
+ * Check the RCS symbol name <sym> for any unsupported characters.
+ * Returns 1 if the tag is correct, 0 if it isn't valid.
+ */
+int
+rcs_sym_check(const char *sym)
+{
+ int ret;
+ const char *cp;
+
+ ret = 1;
+ cp = sym;
+ if (!isalpha(*cp++))
+ return (0);
+
+ for (; *cp != '\0'; cp++)
+ if (!isgraph(*cp) || (strchr(rcs_sym_invch, *cp) != NULL)) {
+ ret = 0;
+ break;
+ }
+
+ return (ret);
+}
+
+/*
* rcs_lock_getmode()
*
* Retrieve the locking mode of the RCS file <file>.