Hi,
The struct rcs_num in rcs(1) had a pointer for rn_id, but the version
in cvs(1) had an array of size RCSNUM_MAX. This patch tries to make
rcs(1) follow cvs(1) here, so rn_id doesn't need to be freed.
As a result the rcsnum_free() function is replaced by one free().
After applying this patch I tried "ci", "co", "ci" (2nd rev), then
"rlog" on a test file and it seemed to work fine. I didn't try
rcsdiff or rcsmerge though. Does this break anything for you?
- Michael
Index: ci.c
===================================================================
RCS file: /cvs/src/usr.bin/rcs/ci.c,v
retrieving revision 1.224
diff -u -p -u -r1.224 ci.c
--- ci.c 4 Jul 2016 01:39:12 -0000 1.224
+++ ci.c 4 Sep 2017 08:21:45 -0000
@@ -314,7 +314,7 @@ checkin_main(int argc, char **argv)
rcs_close(pb.file);
if (rev_str != NULL)
- rcsnum_free(pb.newrev);
+ free(pb.newrev);
pb.newrev = NULL;
}
@@ -400,7 +400,7 @@ checkin_getlogmsg(RCSNUM *rev, RCSNUM *r
rcsnum_tostr(rcsnum_inc(tmprev), nrev, sizeof(nrev));
else
rcsnum_tostr(rev2, nrev, sizeof(nrev));
- rcsnum_free(tmprev);
+ free(tmprev);
if (!(flags & QUIET))
(void)fprintf(stderr, "new revision: %s; "
@@ -635,7 +635,7 @@ skipdesc:
if (fetchlog == 1) {
pb->rcs_msg = checkin_getlogmsg(pb->frev, pb->newrev,
pb->flags);
- rcsnum_free(pb->frev);
+ free(pb->frev);
}
/*
Index: co.c
===================================================================
RCS file: /cvs/src/usr.bin/rcs/co.c,v
retrieving revision 1.123
diff -u -p -u -r1.123 co.c
--- co.c 29 Aug 2017 16:47:33 -0000 1.123
+++ co.c 4 Sep 2017 08:21:45 -0000
@@ -199,7 +199,7 @@ checkout_main(int argc, char **argv)
if (checkout_rev(file, rev, argv[i], flags,
username, author, state, date) < 0) {
rcs_close(file);
- rcsnum_free(rev);
+ free(rev);
ret = 1;
continue;
}
@@ -207,7 +207,7 @@ checkout_main(int argc, char **argv)
if (!(flags & QUIET))
(void)fprintf(stderr, "done\n");
- rcsnum_free(rev);
+ free(rev);
rcs_write(file);
if (flags & PRESERVETIME)
Index: rcs.c
===================================================================
RCS file: /cvs/src/usr.bin/rcs/rcs.c,v
retrieving revision 1.85
diff -u -p -u -r1.85 rcs.c
--- rcs.c 9 May 2016 13:03:55 -0000 1.85
+++ rcs.c 4 Sep 2017 08:21:46 -0000
@@ -165,7 +165,7 @@ rcs_close(RCSFILE *rfp)
while (!TAILQ_EMPTY(&(rfp->rf_symbols))) {
rsp = TAILQ_FIRST(&(rfp->rf_symbols));
TAILQ_REMOVE(&(rfp->rf_symbols), rsp, rs_list);
- rcsnum_free(rsp->rs_num);
+ free(rsp->rs_num);
free(rsp->rs_name);
free(rsp);
}
@@ -173,13 +173,13 @@ rcs_close(RCSFILE *rfp)
while (!TAILQ_EMPTY(&(rfp->rf_locks))) {
rlp = TAILQ_FIRST(&(rfp->rf_locks));
TAILQ_REMOVE(&(rfp->rf_locks), rlp, rl_list);
- rcsnum_free(rlp->rl_num);
+ free(rlp->rl_num);
free(rlp->rl_name);
free(rlp);
}
- rcsnum_free(rfp->rf_head);
- rcsnum_free(rfp->rf_branch);
+ free(rfp->rf_head);
+ free(rfp->rf_branch);
if (rfp->rf_file != NULL)
fclose(rfp->rf_file);
@@ -579,7 +579,7 @@ rcs_sym_remove(RCSFILE *file, const char
TAILQ_REMOVE(&(file->rf_symbols), symp, rs_list);
free(symp->rs_name);
- rcsnum_free(symp->rs_num);
+ free(symp->rs_num);
free(symp);
/* not synced anymore */
@@ -738,7 +738,7 @@ rcs_lock_remove(RCSFILE *file, const cha
}
TAILQ_REMOVE(&(file->rf_locks), lkp, rl_list);
- rcsnum_free(lkp->rl_num);
+ free(lkp->rl_num);
free(lkp->rl_name);
free(lkp);
@@ -1228,10 +1228,10 @@ rcs_rev_remove(RCSFILE *rf, RCSNUM *rev)
if (rcs_head_set(rf, prevrdp->rd_num) < 0)
errx(1, "rcs_head_set failed");
} else if (nextrdp != NULL) {
- rcsnum_free(nextrdp->rd_next);
+ free(nextrdp->rd_next);
nextrdp->rd_next = rcsnum_alloc();
} else {
- rcsnum_free(rf->rf_head);
+ free(rf->rf_head);
rf->rf_head = NULL;
}
@@ -1292,7 +1292,7 @@ rcs_findrev(RCSFILE *rfp, RCSNUM *rev)
frev = rdp->rd_next;
}
- rcsnum_free(brev);
+ free(brev);
return (rdp);
}
@@ -1405,8 +1405,8 @@ rcs_freedelta(struct rcs_delta *rdp)
{
struct rcs_branch *rb;
- rcsnum_free(rdp->rd_num);
- rcsnum_free(rdp->rd_next);
+ free(rdp->rd_num);
+ free(rdp->rd_next);
free(rdp->rd_author);
free(rdp->rd_locker);
@@ -1416,7 +1416,7 @@ rcs_freedelta(struct rcs_delta *rdp)
while ((rb = TAILQ_FIRST(&(rdp->rd_branches))) != NULL) {
TAILQ_REMOVE(&(rdp->rd_branches), rb, rb_list);
- rcsnum_free(rb->rb_num);
+ free(rb->rb_num);
free(rb);
}
Index: rcs.h
===================================================================
RCS file: /cvs/src/usr.bin/rcs/rcs.h,v
retrieving revision 1.18
diff -u -p -u -r1.18 rcs.h
--- rcs.h 29 Aug 2017 16:47:33 -0000 1.18
+++ rcs.h 4 Sep 2017 08:21:46 -0000
@@ -148,7 +148,7 @@ struct rcs_kw {
typedef struct rcs_num {
u_int rn_len;
- u_int16_t *rn_id;
+ u_int16_t rn_id[RCSNUM_MAXLEN];
} RCSNUM;
struct rcs_access {
@@ -259,7 +259,6 @@ RCSNUM *rcsnum_parse(const char *);
RCSNUM *rcsnum_brtorev(const RCSNUM *);
RCSNUM *rcsnum_revtobr(const RCSNUM *);
RCSNUM *rcsnum_inc(RCSNUM *);
-void rcsnum_free(RCSNUM *);
int rcsnum_addmagic(RCSNUM *);
int rcsnum_aton(const char *, const char **, RCSNUM *);
char *rcsnum_tostr(const RCSNUM *, char *, size_t);
Index: rcsdiff.c
===================================================================
RCS file: /cvs/src/usr.bin/rcs/rcsdiff.c,v
retrieving revision 1.84
diff -u -p -u -r1.84 rcsdiff.c
--- rcsdiff.c 2 Nov 2015 16:45:21 -0000 1.84
+++ rcsdiff.c 4 Sep 2017 08:21:46 -0000
@@ -250,8 +250,8 @@ rcsdiff_main(int argc, char **argv)
status = rcsdiff_rev(file, rev1, rev2, dflags);
rcs_close(file);
- rcsnum_free(rev1);
- rcsnum_free(rev2);
+ free(rev1);
+ free(rev2);
rev1 = rev2 = NULL;
}
Index: rcsmerge.c
===================================================================
RCS file: /cvs/src/usr.bin/rcs/rcsmerge.c,v
retrieving revision 1.57
diff -u -p -u -r1.57 rcsmerge.c
--- rcsmerge.c 26 Aug 2016 09:02:54 -0000 1.57
+++ rcsmerge.c 4 Sep 2017 08:21:46 -0000
@@ -174,8 +174,8 @@ rcsmerge_main(int argc, char **argv)
out:
rcs_close(file);
- rcsnum_free(rev1);
- rcsnum_free(rev2);
+ free(rev1);
+ free(rev2);
return (status);
}
Index: rcsnum.c
===================================================================
RCS file: /cvs/src/usr.bin/rcs/rcsnum.c,v
retrieving revision 1.20
diff -u -p -u -r1.20 rcsnum.c
--- rcsnum.c 29 Aug 2017 16:47:33 -0000 1.20
+++ rcsnum.c 4 Sep 2017 08:21:46 -0000
@@ -51,9 +51,8 @@ rcsnum_alloc(void)
{
RCSNUM *rnp;
- rnp = xmalloc(sizeof(*rnp));
+ rnp = xcalloc(1, sizeof(*rnp));
rnp->rn_len = 0;
- rnp->rn_id = NULL;
return (rnp);
}
@@ -89,7 +88,7 @@ rcsnum_parse(const char *str)
num = rcsnum_alloc();
if (rcsnum_aton(str, &ep, num) < 0 || *ep != '\0') {
- rcsnum_free(num);
+ free(num);
num = NULL;
if (*ep != '\0')
rcs_errno = RCS_ERR_BADNUM;
@@ -99,20 +98,6 @@ rcsnum_parse(const char *str)
}
/*
- * rcsnum_free()
- *
- * Free an RCSNUM structure previously allocated with rcsnum_alloc().
- */
-void
-rcsnum_free(RCSNUM *rn)
-{
- if (rn == NULL)
- return;
- free(rn->rn_id);
- free(rn);
-}
-
-/*
* rcsnum_tostr()
*
* Format the RCS number <nump> into a human-readable dot-separated
@@ -244,9 +229,6 @@ rcsnum_aton(const char *str, const char
const char *sp;
char *s;
- if (nump->rn_id == NULL)
- nump->rn_id = xmalloc(sizeof(*(nump->rn_id)));
-
nump->rn_len = 0;
nump->rn_id[0] = 0;
@@ -261,8 +243,6 @@ rcsnum_aton(const char *str, const char
}
nump->rn_len++;
- nump->rn_id = xreallocarray(nump->rn_id,
- nump->rn_len + 1, sizeof(*(nump->rn_id)));
nump->rn_id[nump->rn_len] = 0;
continue;
}
@@ -275,7 +255,7 @@ rcsnum_aton(const char *str, const char
}
if (ep != NULL)
- *ep = sp;
+ *(const char **)ep = sp;
/*
* Handle "magic" RCS branch numbers.
@@ -313,7 +293,7 @@ rcsnum_aton(const char *str, const char
* so the .0. is removed.
*/
if (!strncmp(s, RCS_MAGIC_BRANCH,
- strlen(RCS_MAGIC_BRANCH))) {
+ sizeof(RCS_MAGIC_BRANCH) - 1)) {
nump->rn_id[nump->rn_len - 1] =
nump->rn_id[nump->rn_len];
nump->rn_len--;
@@ -324,8 +304,6 @@ rcsnum_aton(const char *str, const char
/* We can't have a single-digit rcs number. */
if (nump->rn_len == 0) {
nump->rn_len++;
- nump->rn_id = xreallocarray(nump->rn_id,
- nump->rn_len + 1, sizeof(*(nump->rn_id)));
nump->rn_id[nump->rn_len] = 0;
}
@@ -334,8 +312,6 @@ rcsnum_aton(const char *str, const char
rcsnum_aton_failed:
nump->rn_len = 0;
- free(nump->rn_id);
- nump->rn_id = NULL;
return (-1);
}
@@ -404,6 +380,5 @@ rcsnum_brtorev(const RCSNUM *brnum)
static void
rcsnum_setsize(RCSNUM *num, u_int len)
{
- num->rn_id = xreallocarray(num->rn_id, len, sizeof(*(num->rn_id)));
num->rn_len = len;
}
Index: rcsparse.c
===================================================================
RCS file: /cvs/src/usr.bin/rcs/rcsparse.c,v
retrieving revision 1.16
diff -u -p -u -r1.16 rcsparse.c
--- rcsparse.c 26 Aug 2016 09:02:54 -0000 1.16
+++ rcsparse.c 4 Sep 2017 08:21:46 -0000
@@ -343,7 +343,7 @@ rcsparse_free(RCSFILE *rfp)
free(pdp->rp_buf);
if (pdp->rp_token == RCS_TYPE_REVISION)
- rcsnum_free(pdp->rp_value.rev);
+ free(pdp->rp_value.rev);
free(pdp);
}
@@ -557,12 +557,12 @@ rcsparse_textrevision(RCSFILE *rfp, stru
if (rdp == NULL) {
rcsparse_warnx(rfp, "delta for revision \"%s\" not found",
pdp->rp_buf);
- rcsnum_free(pdp->rp_value.rev);
+ free(pdp->rp_value.rev);
return (1);
}
pdp->rp_delta = rdp;
- rcsnum_free(pdp->rp_value.rev);
+ free(pdp->rp_value.rev);
return (0);
}
@@ -1027,7 +1027,7 @@ rcsparse_token(RCSFILE *rfp, int allowed
return (0);
}
if (datenum->rn_len != 6) {
- rcsnum_free(datenum);
+ free(datenum);
rcsparse_warnx(rfp, "invalid date \"%s\"", pdp->rp_buf);
return (0);
}
@@ -1039,7 +1039,7 @@ rcsparse_token(RCSFILE *rfp, int allowed
pdp->rp_value.date.tm_hour = datenum->rn_id[3];
pdp->rp_value.date.tm_min = datenum->rn_id[4];
pdp->rp_value.date.tm_sec = datenum->rn_id[5];
- rcsnum_free(datenum);
+ free(datenum);
break;
case RCS_TYPE_NUMBER:
pdp->rp_value.rev = rcsnum_parse(pdp->rp_buf);
@@ -1057,7 +1057,7 @@ rcsparse_token(RCSFILE *rfp, int allowed
return (0);
}
if (!RCSNUM_ISBRANCH(pdp->rp_value.rev)) {
- rcsnum_free(pdp->rp_value.rev);
+ free(pdp->rp_value.rev);
rcsparse_warnx(rfp, "expected branch, got \"%s\"",
pdp->rp_buf);
return (0);
@@ -1077,7 +1077,7 @@ rcsparse_token(RCSFILE *rfp, int allowed
pdp->rp_value.rev = rcsnum_parse(pdp->rp_buf);
if (pdp->rp_value.rev != NULL) {
if (RCSNUM_ISBRANCH(pdp->rp_value.rev)) {
- rcsnum_free(pdp->rp_value.rev);
+ free(pdp->rp_value.rev);
rcsparse_warnx(rfp,
"expected revision, got \"%s\"",
pdp->rp_buf);
Index: rcsprog.c
===================================================================
RCS file: /cvs/src/usr.bin/rcs/rcsprog.c,v
retrieving revision 1.161
diff -u -p -u -r1.161 rcsprog.c
--- rcsprog.c 4 Jul 2016 01:39:12 -0000 1.161
+++ rcsprog.c 4 Sep 2017 08:21:46 -0000
@@ -365,11 +365,11 @@ rcs_main(int argc, char **argv)
warnx("failed to set logmsg for `%s' to `%s'",
logstr, logmsg);
rcs_close(file);
- rcsnum_free(logrev);
+ free(logrev);
continue;
}
- rcsnum_free(logrev);
+ free(logrev);
}
/* entries to add from <oldfile> */
@@ -464,7 +464,7 @@ rcs_main(int argc, char **argv)
if (rcs_lock_add(file, username, rev) != -1 &&
!(rcsflags & QUIET))
(void)fprintf(stderr, "%s locked\n", rev_str);
- rcsnum_free(rev);
+ free(rev);
}
if (rcsflags & RCSPROG_UFLAG) {
@@ -501,7 +501,7 @@ rcs_main(int argc, char **argv)
(void)fprintf(stderr,
"%s unlocked\n", rev_str);
}
- rcsnum_free(rev);
+ free(rev);
}
if (orange != NULL) {
Index: rlog.c
===================================================================
RCS file: /cvs/src/usr.bin/rcs/rlog.c,v
retrieving revision 1.74
diff -u -p -u -r1.74 rlog.c
--- rlog.c 16 Oct 2016 13:35:51 -0000 1.74
+++ rlog.c 4 Sep 2017 08:21:46 -0000
@@ -566,7 +566,7 @@ rlog_rev_print(struct rcs_delta *rdp)
branch = rcsnum_revtobr(rb->rb_num);
(void)rcsnum_tostr(branch, numb, sizeof(numb));
printf(" %s;", numb);
- rcsnum_free(branch);
+ free(branch);
}
printf("\n");
}