diff options
author | Jean-Francois Brousseau <jfb@cvs.openbsd.org> | 2005-04-19 19:22:32 +0000 |
---|---|---|
committer | Jean-Francois Brousseau <jfb@cvs.openbsd.org> | 2005-04-19 19:22:32 +0000 |
commit | 9321b623276fb2c1e254bb9c9a360e3f5f0f133b (patch) | |
tree | 1c11e63cf87cda6f53d04ad035a597e58ea2ef0f /usr.bin/cvs/rcs.c | |
parent | 3c5a45320372654a01cd07b83845dd39dcd5eb29 (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.c | 47 |
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>. |