Date: Mon, 2 Jul 2001 22:17:24 -0400 (EDT) From: Mike Barcroft <mike@q9media.com> To: Bruce Evans <bde@zeta.org.au> Cc: audit@FreeBSD.org Subject: Re: src/bin/ed patch Message-ID: <200107030217.f632HOT06228@coffee.q9media.com>
next in thread | raw e-mail | index | archive | help
Bruce Evans <bde@zeta.org.au> writes:
> > Why not just add a switch in /etc/{defaults/,}make.conf to allow one
> > to control the visibility of RCSIDs? What concern is it of ours if the
> > other BSDs embed RCSIDs unconditionally?
>
> It would be silly to have a switch to fully control FreeBSD rcsids if
> OtherBSD rcsids get embedded (in object files) unconditionally.
Maybe it's not a simple as I think it is. Would we not just wrap the
__RCSID macros in <sys/cdefs.h> with #ifndef NO_RCSIDS ? Are there
other requirements I'm not aware of? If this is all that's required
we should be able to patch our tree and send diffs off to OtherBSD.
> Why change the original copyright string (source and oupput format)?
> The copyright normally goes in a separate "#ifdef lint".
Fixed. Fixed.
> > ...
> > @@ -1385,12 +1377,13 @@
> > {
> > char *hup = NULL; /* hup filename */
> > char *s;
> > + char ed_hup[] = "ed.hup";
> > int n;
> >
> > if (!sigactive)
> > quit(1);
> > sigflags &= ~(1 << (signo - 1));
> > - if (addr_last && write_file("ed.hup", "w", 1, addr_last) < 0 &&
> > + if (addr_last && write_file(ed_hup, "w", 1, addr_last) < 0 &&
> > (s = getenv("HOME")) != NULL &&
> > (n = strlen(s)) + 8 <= PATH_MAX && /* "ed.hup" + '/' */
> > (hup = (char *) malloc(n + 10)) != NULL) {
>
> The correct fix is to declare write_file()'s first arg as const.
The write_file() routine calls strip_escapes(), which needs to modify
the filename before fopen()ing it. I'm not sure how it worked
originally as a const. Probably because it doesn't have any escapes
that it needs to strip.
> BTW, I think we're only seeing the tip of the iceberg for constant
> poisoning of function args. -Wwrite-strings triggers a few warnings
> for "char *" args, but there are zillions of interfaces that take
> pointers to data that is not changed by the interface yet not declared
> const. Change a top-level interface to declare things as const and
> the poison will spread to lower levels.
I did a little investigation and the code is a nightmare. It makes
all kinds of assumptions that don't work in a const-capable world. I
added a few more consts where it was possible without re-writing all
the callers.
While I was there, I corrected some other small things that were
bugging my eyes (specificly: sprintf and register).
An updated version of my patch is available at the end of this message
and also at: http://testbed.q9media.net/freebsd/ed.20010702.patch
Best regards,
Mike Barcroft
-----------------------------------------------------------------------
ed.20010702.patch
o Correctly define rcsid [requested by bde].
o Add consts where appropriate.
o Rename some variables that are shadowing global declarations.
o Remove register storage-classes.
o sprintf -> snprintf
o Set WARNS?=2
Index: ed/Makefile
===================================================================
RCS file: /home/ncvs/src/bin/ed/Makefile,v
retrieving revision 1.18
diff -u -r1.18 Makefile
--- ed/Makefile 2000/02/29 11:39:24 1.18
+++ ed/Makefile 2001/07/03 01:32:26
@@ -1,6 +1,7 @@
# $FreeBSD: src/bin/ed/Makefile,v 1.18 2000/02/29 11:39:24 markm Exp $
PROG= ed
+WARNS?= 2
SRCS= buf.c cbc.c glbl.c io.c main.c re.c sub.c undo.c
LINKS= ${BINDIR}/ed ${BINDIR}/red
MLINKS= ed.1 red.1
Index: ed/buf.c
===================================================================
RCS file: /home/ncvs/src/bin/ed/buf.c,v
retrieving revision 1.17
diff -u -r1.17 buf.c
--- ed/buf.c 1999/08/27 23:14:12 1.17
+++ ed/buf.c 2001/07/03 01:32:26
@@ -27,12 +27,8 @@
*/
#ifndef lint
-#if 0
-static char * const rcsid = "@(#)buf.c,v 1.4 1994/02/01 00:34:35 alm Exp";
-#else
-static char * const rcsid =
+static const char rcsid[] =
"$FreeBSD: src/bin/ed/buf.c,v 1.17 1999/08/27 23:14:12 peter Exp $";
-#endif
#endif /* not lint */
#include <sys/file.h>
@@ -65,7 +61,8 @@
sfseek = lp->seek;
if (fseek(sfp, sfseek, SEEK_SET) < 0) {
fprintf(stderr, "%s\n", strerror(errno));
- sprintf(errmsg, "cannot seek temp file");
+ snprintf(errmsg, sizeof(errmsg),
+ "cannot seek temp file");
return NULL;
}
}
@@ -73,7 +70,7 @@
REALLOC(sfbuf, sfbufsz, len + 1, NULL);
if ((ct = fread(sfbuf, sizeof(char), len, sfp)) < 0 || ct != len) {
fprintf(stderr, "%s\n", strerror(errno));
- sprintf(errmsg, "cannot read temp file");
+ snprintf(errmsg, sizeof(errmsg), "cannot read temp file");
return NULL;
}
sfseek += len; /* update file position */
@@ -84,24 +81,24 @@
/* put_sbuf_line: write a line of text to the scratch file and add a line node
to the editor buffer; return a pointer to the end of the text */
-char *
+const char *
put_sbuf_line(cs)
- char *cs;
+ const char *cs;
{
line_t *lp;
int len, ct;
- char *s;
+ const char *s;
if ((lp = (line_t *) malloc(sizeof(line_t))) == NULL) {
fprintf(stderr, "%s\n", strerror(errno));
- sprintf(errmsg, "out of memory");
+ snprintf(errmsg, sizeof(errmsg), "out of memory");
return NULL;
}
/* assert: cs is '\n' terminated */
for (s = cs; *s != '\n'; s++)
;
if (s - cs >= LINECHARS) {
- sprintf(errmsg, "line too long");
+ snprintf(errmsg, sizeof(errmsg), "line too long");
return NULL;
}
len = s - cs;
@@ -109,7 +106,8 @@
if (seek_write) {
if (fseek(sfp, 0L, SEEK_END) < 0) {
fprintf(stderr, "%s\n", strerror(errno));
- sprintf(errmsg, "cannot seek temp file");
+ snprintf(errmsg, sizeof(errmsg),
+ "cannot seek temp file");
return NULL;
}
sfseek = ftell(sfp);
@@ -119,7 +117,7 @@
if ((ct = fwrite(cs, sizeof(char), len, sfp)) < 0 || ct != len) {
sfseek = -1;
fprintf(stderr, "%s\n", strerror(errno));
- sprintf(errmsg, "cannot write temp file");
+ snprintf(errmsg, sizeof(errmsg), "cannot write temp file");
return NULL;
}
lp->len = len;
@@ -155,7 +153,7 @@
while (cp != lp && (cp = cp->q_forw) != &buffer_head)
n++;
if (n && cp == &buffer_head) {
- sprintf(errmsg, "invalid address");
+ snprintf(errmsg, sizeof(errmsg), "invalid address");
return ERR;
}
return n;
@@ -229,7 +227,8 @@
if (sfp) {
if (fclose(sfp) < 0) {
fprintf(stderr, "%s: %s\n", sfn, strerror(errno));
- sprintf(errmsg, "cannot close temp file");
+ snprintf(errmsg, sizeof(errmsg),
+ "cannot close temp file");
return ERR;
}
sfp = NULL;
Index: ed/cbc.c
===================================================================
RCS file: /home/ncvs/src/bin/ed/cbc.c,v
retrieving revision 1.13
diff -u -r1.13 cbc.c
--- ed/cbc.c 2001/03/05 02:15:37 1.13
+++ ed/cbc.c 2001/07/03 01:32:26
@@ -33,17 +33,11 @@
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
- *
- * from: @(#)bdes.c 5.5 (Berkeley) 6/27/91
*/
#ifndef lint
-#if 0
-static char * const rcsid = "@(#)cbc.c,v 1.2 1994/02/01 00:34:36 alm Exp";
-#else
-static char * const rcsid =
+static const char rcsid[] =
"$FreeBSD: src/bin/ed/cbc.c,v 1.13 2001/03/05 02:15:37 kris Exp $";
-#endif
#endif /* not lint */
#include <sys/types.h>
@@ -183,7 +177,7 @@
int
get_keyword()
{
- register char *p; /* used to obtain the key */
+ char *p; /* used to obtain the key */
Desbuf msgbuf; /* I/O buffer */
/*
@@ -209,9 +203,9 @@
*/
void
des_error(s)
- char *s; /* the message */
+ const char *s; /* the message */
{
- (void)sprintf(errmsg, "%s", s ? s : strerror(errno));
+ (void)snprintf(errmsg, sizeof(errmsg), "%s", s ? s : strerror(errno));
}
/*
@@ -250,23 +244,23 @@
* convert the key to a bit pattern
*/
void
-expand_des_key(obuf, ibuf)
+expand_des_key(obuf, kbuf)
char *obuf; /* bit pattern */
- char *ibuf; /* the key itself */
+ char *kbuf; /* the key itself */
{
- register int i, j; /* counter in a for loop */
+ int i, j; /* counter in a for loop */
int nbuf[64]; /* used for hex/key translation */
/*
* leading '0x' or '0X' == hex key
*/
- if (ibuf[0] == '0' && (ibuf[1] == 'x' || ibuf[1] == 'X')) {
- ibuf = &ibuf[2];
+ if (kbuf[0] == '0' && (kbuf[1] == 'x' || kbuf[1] == 'X')) {
+ kbuf = &kbuf[2];
/*
* now translate it, bombing on any illegal hex digit
*/
- for (i = 0; ibuf[i] && i < 16; i++)
- if ((nbuf[i] = hex_to_binary((int) ibuf[i], 16)) == -1)
+ for (i = 0; kbuf[i] && i < 16; i++)
+ if ((nbuf[i] = hex_to_binary((int) kbuf[i], 16)) == -1)
des_error("bad hex digit in key");
while (i < 16)
nbuf[i++] = 0;
@@ -280,13 +274,13 @@
/*
* leading '0b' or '0B' == binary key
*/
- if (ibuf[0] == '0' && (ibuf[1] == 'b' || ibuf[1] == 'B')) {
- ibuf = &ibuf[2];
+ if (kbuf[0] == '0' && (kbuf[1] == 'b' || kbuf[1] == 'B')) {
+ kbuf = &kbuf[2];
/*
* now translate it, bombing on any illegal binary digit
*/
- for (i = 0; ibuf[i] && i < 16; i++)
- if ((nbuf[i] = hex_to_binary((int) ibuf[i], 2)) == -1)
+ for (i = 0; kbuf[i] && i < 16; i++)
+ if ((nbuf[i] = hex_to_binary((int) kbuf[i], 2)) == -1)
des_error("bad binary digit in key");
while (i < 64)
nbuf[i++] = 0;
@@ -300,7 +294,7 @@
/*
* no special leader -- ASCII
*/
- (void)strncpy(obuf, ibuf, 8);
+ (void)strncpy(obuf, kbuf, 8);
}
/*****************
@@ -321,8 +315,8 @@
set_des_key(buf)
Desbuf buf; /* key block */
{
- register int i, j; /* counter in a for loop */
- register int par; /* parity counter */
+ int i, j; /* counter in a for loop */
+ int par; /* parity counter */
/*
* if the parity is not preserved, flip it
@@ -391,20 +385,20 @@
char *msgbuf; /* I/O buffer */
FILE *fp; /* input file descriptor */
{
- Desbuf ibuf; /* temp buffer for initialization vector */
- register int n; /* number of bytes actually read */
- register int c; /* used to test for EOF */
+ Desbuf tbuf; /* temp buffer for initialization vector */
+ int n; /* number of bytes actually read */
+ int c; /* used to test for EOF */
int inverse = 1; /* 0 to encrypt, 1 to decrypt */
if ((n = READ(BUFFER(msgbuf), 8, fp)) == 8) {
/*
* do the transformation
*/
- MEMCPY(BUFFER(ibuf), BUFFER(msgbuf), 8);
+ MEMCPY(BUFFER(tbuf), BUFFER(msgbuf), 8);
DES_XFORM(UBUFFER(msgbuf));
for (c = 0; c < 8; c++)
UCHAR(msgbuf, c) ^= UCHAR(ivec, c);
- MEMCPY(BUFFER(ivec), BUFFER(ibuf), 8);
+ MEMCPY(BUFFER(ivec), BUFFER(tbuf), 8);
/*
* if the last one, handle it specially
*/
Index: ed/ed.h
===================================================================
RCS file: /home/ncvs/src/bin/ed/ed.h,v
retrieving revision 1.14
diff -u -r1.14 ed.h
--- ed/ed.h 2001/05/29 18:03:13 1.14
+++ ed/ed.h 2001/07/03 01:32:27
@@ -105,7 +105,7 @@
#define STRTOL(i, p) { \
if (((i = strtol(p, &p, 10)) == LONG_MIN || i == LONG_MAX) && \
errno == ERANGE) { \
- sprintf(errmsg, "number out of range"); \
+ snprintf(errmsg, sizeof(errmsg), "number out of range"); \
i = 0; \
return ERR; \
} \
@@ -121,14 +121,14 @@
if ((b) != NULL) { \
if ((ts = (char *) realloc((b), ti += max((i), MINBUFSZ))) == NULL) { \
fprintf(stderr, "%s\n", strerror(errno)); \
- sprintf(errmsg, "out of memory"); \
+ snprintf(errmsg, sizeof(errmsg), "out of memory"); \
SPL0(); \
return err; \
} \
} else { \
if ((ts = (char *) malloc(ti += max((i), MINBUFSZ))) == NULL) { \
fprintf(stderr, "%s\n", strerror(errno)); \
- sprintf(errmsg, "out of memory"); \
+ snprintf(errmsg, sizeof(errmsg), "out of memory"); \
SPL0(); \
return err; \
} \
@@ -146,7 +146,7 @@
SPL1(); \
if ((ts = (char *) realloc((b), ti += max((i), MINBUFSZ))) == NULL) { \
fprintf(stderr, "%s\n", strerror(errno)); \
- sprintf(errmsg, "out of memory"); \
+ snprintf(errmsg, sizeof(errmsg), "out of memory"); \
SPL0(); \
return err; \
} \
@@ -190,7 +190,7 @@
/* Local Function Declarations */
void add_line_node __P((line_t *));
int append_lines __P((long));
-int apply_subst_template __P((char *, regmatch_t *, int, int));
+int apply_subst_template __P((const char *, regmatch_t *, int, int));
int build_active_list __P((int));
int cbc_decode __P((char *, FILE *));
int cbc_encode __P((char *, int, FILE *));
@@ -200,7 +200,7 @@
int close_sbuf __P((void));
int copy_lines __P((long));
int delete_lines __P((long, long));
-void des_error __P((char *));
+void des_error __P((const char *));
int display_lines __P((long, long, int));
line_t *dup_line_node __P((line_t *));
int exec_command __P((void));
@@ -236,16 +236,16 @@
int join_lines __P((long, long));
int mark_line_node __P((line_t *, int));
int move_lines __P((long));
-line_t *next_active_node __P(());
+line_t *next_active_node __P((void));
long next_addr __P((void));
int open_sbuf __P((void));
char *parse_char_class __P((char *));
int pop_undo_stack __P((void));
undo_t *push_undo_stack __P((int, long, long));
int put_des_char __P((int, FILE *));
-char *put_sbuf_line __P((char *));
-int put_stream_line __P((FILE *, char *, int));
-int put_tty_line __P((char *, int, long, int));
+const char *put_sbuf_line __P((const char *));
+int put_stream_line __P((FILE *, const char *, int));
+int put_tty_line __P((const char *, int, long, int));
void quit __P((int));
long read_file __P((char *, long));
long read_stream __P((FILE *, long));
@@ -259,7 +259,7 @@
char *translit_text __P((char *, int, int, int));
void unmark_line_node __P((line_t *));
void unset_active_nodes __P((line_t *, line_t *));
-long write_file __P((char *, char *, long, long));
+long write_file __P((char *, const char *, long, long));
long write_stream __P((FILE *, long, long));
/* global buffers */
@@ -278,7 +278,7 @@
/* global vars */
extern long addr_last;
extern long current_addr;
-extern char errmsg[];
+extern char errmsg[PATH_MAX + 40];
extern long first_addr;
extern int lineno;
extern long second_addr;
Index: ed/glbl.c
===================================================================
RCS file: /home/ncvs/src/bin/ed/glbl.c,v
retrieving revision 1.10
diff -u -r1.10 glbl.c
--- ed/glbl.c 2000/10/16 07:06:35 1.10
+++ ed/glbl.c 2001/07/03 01:32:27
@@ -27,12 +27,8 @@
*/
#ifndef lint
-#if 0
-static char * const rcsid = "@(#)glob.c,v 1.1 1994/02/01 00:34:40 alm Exp";
-#else
-static char * const rcsid =
+static const char rcsid[] =
"$FreeBSD: src/bin/ed/glbl.c,v 1.10 2000/10/16 07:06:35 brian Exp $";
-#endif
#endif /* not lint */
#include <sys/types.h>
@@ -55,7 +51,7 @@
char delimiter;
if ((delimiter = *ibufp) == ' ' || delimiter == '\n') {
- sprintf(errmsg, "invalid pattern delimiter");
+ snprintf(errmsg, sizeof(errmsg), "invalid pattern delimiter");
return ERR;
} else if ((pat = get_compiled_pattern()) == NULL)
return ERR;
@@ -115,13 +111,15 @@
if (n < 0)
return ERR;
else if (n == 0) {
- sprintf(errmsg, "unexpected end-of-file");
+ snprintf(errmsg, sizeof(errmsg),
+ "unexpected end-of-file");
return ERR;
} else if (n == 1 && !strcmp(ibuf, "\n"))
continue;
else if (n == 2 && !strcmp(ibuf, "&\n")) {
if (cmd == NULL) {
- sprintf(errmsg, "no previous command");
+ snprintf(errmsg, sizeof(errmsg),
+ "no previous command");
return ERR;
} else cmd = ocmd;
} else if ((cmd = get_extended_line(&n, 0)) == NULL)
@@ -166,7 +164,8 @@
if ((ts = (line_t **) realloc(active_list,
(ti += MINBUFSZ) * sizeof(line_t **))) == NULL) {
fprintf(stderr, "%s\n", strerror(errno));
- sprintf(errmsg, "out of memory");
+ snprintf(errmsg, sizeof(errmsg),
+ "out of memory");
SPL0();
return ERR;
}
@@ -175,7 +174,8 @@
if ((ts = (line_t **) malloc((ti += MINBUFSZ) *
sizeof(line_t **))) == NULL) {
fprintf(stderr, "%s\n", strerror(errno));
- sprintf(errmsg, "out of memory");
+ snprintf(errmsg, sizeof(errmsg),
+ "out of memory");
SPL0();
return ERR;
}
Index: ed/io.c
===================================================================
RCS file: /home/ncvs/src/bin/ed/io.c,v
retrieving revision 1.10
diff -u -r1.10 io.c
--- ed/io.c 1999/08/27 23:14:14 1.10
+++ ed/io.c 2001/07/03 01:32:27
@@ -26,12 +26,8 @@
*/
#ifndef lint
-#if 0
-static char * const rcsid = "@(#)io.c,v 1.1 1994/02/01 00:34:41 alm Exp";
-#else
-static char * const rcsid =
+static const char rcsid[] =
"$FreeBSD: src/bin/ed/io.c,v 1.10 1999/08/27 23:14:14 peter Exp $";
-#endif
#endif /* not lint */
#include "ed.h"
@@ -52,13 +48,13 @@
fp = (*fn == '!') ? popen(fn + 1, "r") : fopen(strip_escapes(fn), "r");
if (fp == NULL) {
fprintf(stderr, "%s: %s\n", fn, strerror(errno));
- sprintf(errmsg, "cannot open input file");
+ snprintf(errmsg, sizeof(errmsg), "cannot open input file");
return ERR;
} else if ((size = read_stream(fp, n)) < 0)
return ERR;
else if (((*fn == '!') ? pclose(fp) : fclose(fp)) < 0) {
fprintf(stderr, "%s: %s\n", fn, strerror(errno));
- sprintf(errmsg, "cannot close input file");
+ snprintf(errmsg, sizeof(errmsg), "cannot close input file");
return ERR;
}
fprintf(stdout, !scripted ? "%lu\n" : "", size);
@@ -128,8 +124,8 @@
get_stream_line(fp)
FILE *fp;
{
- register int c;
- register int i = 0;
+ int c;
+ int i = 0;
while (((c = des ? get_des_char(fp) : getc(fp)) != EOF || (!feof(fp) &&
!ferror(fp))) && c != '\n') {
@@ -142,7 +138,7 @@
sbuf[i++] = c;
else if (ferror(fp)) {
fprintf(stderr, "%s\n", strerror(errno));
- sprintf(errmsg, "cannot read input file");
+ snprintf(errmsg, sizeof(errmsg), "cannot read input file");
return ERR;
} else if (i) {
sbuf[i++] = '\n';
@@ -157,7 +153,7 @@
long
write_file(fn, mode, n, m)
char *fn;
- char *mode;
+ const char *mode;
long n;
long m;
{
@@ -167,13 +163,13 @@
fp = (*fn == '!') ? popen(fn+1, "w") : fopen(strip_escapes(fn), mode);
if (fp == NULL) {
fprintf(stderr, "%s: %s\n", fn, strerror(errno));
- sprintf(errmsg, "cannot open output file");
+ snprintf(errmsg, sizeof(errmsg), "cannot open output file");
return ERR;
} else if ((size = write_stream(fp, n, m)) < 0)
return ERR;
else if (((*fn == '!') ? pclose(fp) : fclose(fp)) < 0) {
fprintf(stderr, "%s: %s\n", fn, strerror(errno));
- sprintf(errmsg, "cannot close output file");
+ snprintf(errmsg, sizeof(errmsg), "cannot close output file");
return ERR;
}
fprintf(stdout, !scripted ? "%lu\n" : "", size);
@@ -217,13 +213,13 @@
int
put_stream_line(fp, s, len)
FILE *fp;
- char *s;
+ const char *s;
int len;
{
while (len--)
if ((des ? put_des_char(*s++, fp) : fputc(*s++, fp)) < 0) {
fprintf(stderr, "%s\n", strerror(errno));
- sprintf(errmsg, "cannot write file");
+ snprintf(errmsg, sizeof(errmsg), "cannot write file");
return ERR;
}
return 0;
@@ -256,7 +252,8 @@
if ((n = get_tty_line()) < 0)
return NULL;
else if (n == 0 || ibuf[n - 1] != '\n') {
- sprintf(errmsg, "unexpected end-of-file");
+ snprintf(errmsg, sizeof(errmsg),
+ "unexpected end-of-file");
return NULL;
}
REALLOC(cvbuf, cvbufsz, l + n, NULL);
@@ -278,8 +275,8 @@
int
get_tty_line()
{
- register int oi = 0;
- register int i = 0;
+ int oi = 0;
+ int i = 0;
int c;
for (;;)
@@ -297,7 +294,8 @@
case EOF:
if (ferror(stdin)) {
fprintf(stderr, "stdin: %s\n", strerror(errno));
- sprintf(errmsg, "cannot read stdin");
+ snprintf(errmsg, sizeof(errmsg),
+ "cannot read stdin");
clearerr(stdin);
ibufp = NULL;
return ERR;
@@ -325,7 +323,7 @@
/* put_tty_line: print text to stdout */
int
put_tty_line(s, l, n, gflag)
- char *s;
+ const char *s;
int l;
long n;
int gflag;
Index: ed/main.c
===================================================================
RCS file: /home/ncvs/src/bin/ed/main.c,v
retrieving revision 1.20
diff -u -r1.20 main.c
--- ed/main.c 2001/06/28 22:06:27 1.20
+++ ed/main.c 2001/07/03 01:32:27
@@ -27,18 +27,14 @@
*/
#ifndef lint
-static char * const copyright =
+static const char copyright[] =
"@(#) Copyright (c) 1993 Andrew Moore, Talke Studio. \n\
All rights reserved.\n";
#endif /* not lint */
#ifndef lint
-#if 0
-static char * const rcsid = "@(#)main.c,v 1.1 1994/02/01 00:34:42 alm Exp";
-#else
-static char * const rcsid =
+static const char rcsid[] =
"$FreeBSD: src/bin/ed/main.c,v 1.20 2001/06/28 22:06:27 dd Exp $";
-#endif
#endif /* not lint */
/*
@@ -100,8 +96,8 @@
long current_addr; /* current address in editor buffer */
long addr_last; /* last address in editor buffer */
int lineno; /* script line number */
-char *prompt; /* command-line prompt */
-char *dps = "*"; /* default command-line prompt */
+const char *prompt; /* command-line prompt */
+const char *dps = "*"; /* default command-line prompt */
const char usage[] = "usage: %s [-] [-sx] [-p string] [name]\n";
@@ -169,7 +165,7 @@
#endif
{
fputs("\n?\n", stderr);
- sprintf(errmsg, "interrupt");
+ snprintf(errmsg, sizeof(errmsg), "interrupt");
} else {
init_buffers();
sigactive = 1; /* enable signal handlers */
@@ -183,7 +179,8 @@
} else if (argc) {
fputs("?\n", stderr);
if (**argv == '\0')
- sprintf(errmsg, "invalid filename");
+ snprintf(errmsg, sizeof(errmsg),
+ "invalid filename");
if (!isatty(0))
quit(2);
}
@@ -201,7 +198,8 @@
} else if (n == 0) {
if (modified && !scripted) {
fputs("?\n", stderr);
- sprintf(errmsg, "warning: file modified");
+ snprintf(errmsg, sizeof(errmsg),
+ "warning: file modified");
if (!isatty(0)) {
fprintf(stderr, garrulous ?
"script, line %d: %s\n" :
@@ -216,7 +214,8 @@
quit(0);
} else if (ibuf[n - 1] != '\n') {
/* discard line */
- sprintf(errmsg, "unexpected end-of-file");
+ snprintf(errmsg, sizeof(errmsg),
+ "unexpected end-of-file");
clearerr(stdin);
status = ERR;
continue;
@@ -234,7 +233,8 @@
case EMOD:
modified = 0;
fputs("?\n", stderr); /* give warning */
- sprintf(errmsg, "warning: file modified");
+ snprintf(errmsg, sizeof(errmsg),
+ "warning: file modified");
if (!isatty(0)) {
fprintf(stderr, garrulous ?
"script, line %d: %s\n" :
@@ -293,14 +293,16 @@
#define SKIP_BLANKS() while (isspace((unsigned char)*ibufp) && *ibufp != '\n') ibufp++
-#define MUST_BE_FIRST() \
- if (!first) { sprintf(errmsg, "invalid address"); return ERR; }
+#define MUST_BE_FIRST() if (!first) { \
+ snprintf(errmsg, sizeof(errmsg), "invalid address"); \
+ return ERR; \
+}
/* next_addr: return the next line address in the command buffer */
long
next_addr()
{
- char *hd;
+ const char *hd;
long addr = current_addr;
long n;
int first = 1;
@@ -364,7 +366,8 @@
if (ibufp == hd)
return EOF;
else if (addr < 0 || addr_last < addr) {
- sprintf(errmsg, "invalid address");
+ snprintf(errmsg, sizeof(errmsg),
+ "invalid address");
return ERR;
} else
return addr;
@@ -383,10 +386,10 @@
if (extract_addr_range() < 0) \
return ERR; \
else if (addr_cnt == 0) { \
- sprintf(errmsg, "destination expected"); \
+ snprintf(errmsg, sizeof(errmsg), "destination expected"); \
return ERR; \
} else if (second_addr < 0 || addr_last < second_addr) { \
- sprintf(errmsg, "invalid address"); \
+ snprintf(errmsg, sizeof(errmsg), "invalid address"); \
return ERR; \
} \
addr = second_addr; \
@@ -402,7 +405,7 @@
if (extract_addr_range() < 0) \
return ERR; \
if (second_addr < 0 || addr_last < second_addr) { \
- sprintf(errmsg, "invalid address"); \
+ snprintf(errmsg, sizeof(errmsg), "invalid address"); \
return ERR; \
} \
addr = second_addr; \
@@ -430,7 +433,7 @@
} \
} while (!done); \
if (*ibufp++ != '\n') { \
- sprintf(errmsg, "invalid command suffix"); \
+ snprintf(errmsg, sizeof(errmsg), "invalid command suffix"); \
return ERR; \
} \
}
@@ -499,10 +502,11 @@
/* fall through */
case 'E':
if (addr_cnt > 0) {
- sprintf(errmsg, "unexpected address");
+ snprintf(errmsg, sizeof(errmsg), "unexpected address");
return ERR;
} else if (!isspace((unsigned char)*ibufp)) {
- sprintf(errmsg, "unexpected command suffix");
+ snprintf(errmsg, sizeof(errmsg),
+ "unexpected command suffix");
return ERR;
} else if ((fnp = get_filename()) == NULL)
return ERR;
@@ -517,7 +521,7 @@
if (*fnp && *fnp != '!') strcpy(old_filename, fnp);
#ifdef BACKWARDS
if (*fnp == '\0' && *old_filename == '\0') {
- sprintf(errmsg, "no current filename");
+ snprintf(errmsg, sizeof(errmsg), "no current filename");
return ERR;
}
#endif
@@ -529,15 +533,16 @@
break;
case 'f':
if (addr_cnt > 0) {
- sprintf(errmsg, "unexpected address");
+ snprintf(errmsg, sizeof(errmsg), "unexpected address");
return ERR;
} else if (!isspace((unsigned char)*ibufp)) {
- sprintf(errmsg, "unexpected command suffix");
+ snprintf(errmsg, sizeof(errmsg),
+ "unexpected command suffix");
return ERR;
} else if ((fnp = get_filename()) == NULL)
return ERR;
else if (*fnp == '!') {
- sprintf(errmsg, "invalid redirection");
+ snprintf(errmsg, sizeof(errmsg), "invalid redirection");
return ERR;
}
GET_COMMAND_SUFFIX();
@@ -549,7 +554,8 @@
case 'G':
case 'V':
if (isglobal) {
- sprintf(errmsg, "cannot nest global commands");
+ snprintf(errmsg, sizeof(errmsg),
+ "cannot nest global commands");
return ERR;
} else if (check_addr_range(1, addr_last) < 0)
return ERR;
@@ -563,7 +569,8 @@
break;
case 'h':
if (addr_cnt > 0) {
- sprintf(errmsg, "unexpected address");
+ snprintf(errmsg, sizeof(errmsg),
+ "unexpected address");
return ERR;
}
GET_COMMAND_SUFFIX();
@@ -571,7 +578,8 @@
break;
case 'H':
if (addr_cnt > 0) {
- sprintf(errmsg, "unexpected address");
+ snprintf(errmsg, sizeof(errmsg),
+ "unexpected address");
return ERR;
}
GET_COMMAND_SUFFIX();
@@ -580,7 +588,7 @@
break;
case 'i':
if (second_addr == 0) {
- sprintf(errmsg, "invalid address");
+ snprintf(errmsg, sizeof(errmsg), "invalid address");
return ERR;
}
GET_COMMAND_SUFFIX();
@@ -600,7 +608,7 @@
case 'k':
c = *ibufp++;
if (second_addr == 0) {
- sprintf(errmsg, "invalid address");
+ snprintf(errmsg, sizeof(errmsg), "invalid address");
return ERR;
}
GET_COMMAND_SUFFIX();
@@ -620,7 +628,7 @@
return ERR;
GET_THIRD_ADDR(addr);
if (first_addr <= addr && addr < second_addr) {
- sprintf(errmsg, "invalid destination");
+ snprintf(errmsg, sizeof(errmsg), "invalid destination");
return ERR;
}
GET_COMMAND_SUFFIX();
@@ -646,7 +654,7 @@
break;
case 'P':
if (addr_cnt > 0) {
- sprintf(errmsg, "unexpected address");
+ snprintf(errmsg, sizeof(errmsg), "unexpected address");
return ERR;
}
GET_COMMAND_SUFFIX();
@@ -655,7 +663,7 @@
case 'q':
case 'Q':
if (addr_cnt > 0) {
- sprintf(errmsg, "unexpected address");
+ snprintf(errmsg, sizeof(errmsg), "unexpected address");
return ERR;
}
GET_COMMAND_SUFFIX();
@@ -663,7 +671,8 @@
break;
case 'r':
if (!isspace((unsigned char)*ibufp)) {
- sprintf(errmsg, "unexpected command suffix");
+ snprintf(errmsg, sizeof(errmsg),
+ "unexpected command suffix");
return ERR;
} else if (addr_cnt == 0)
second_addr = addr_last;
@@ -675,7 +684,7 @@
strcpy(old_filename, fnp);
#ifdef BACKWARDS
if (*fnp == '\0' && *old_filename == '\0') {
- sprintf(errmsg, "no current filename");
+ snprintf(errmsg, sizeof(errmsg), "no current filename");
return ERR;
}
#endif
@@ -710,18 +719,21 @@
break;
default:
if (sflags) {
- sprintf(errmsg, "invalid command suffix");
+ snprintf(errmsg, sizeof(errmsg),
+ "invalid command suffix");
return ERR;
}
}
} while (sflags && *ibufp != '\n');
if (sflags && !pat) {
- sprintf(errmsg, "no previous substitution");
+ snprintf(errmsg, sizeof(errmsg),
+ "no previous substitution");
return ERR;
} else if (sflags & SGG)
sgnum = 0; /* override numeric arg */
if (*ibufp != '\n' && *(ibufp + 1) == '\n') {
- sprintf(errmsg, "invalid pattern delimiter");
+ snprintf(errmsg, sizeof(errmsg),
+ "invalid pattern delimiter");
return ERR;
}
tpat = pat;
@@ -782,7 +794,7 @@
break;
case 'u':
if (addr_cnt > 0) {
- sprintf(errmsg, "unexpected address");
+ snprintf(errmsg, sizeof(errmsg), "unexpected address");
return ERR;
}
GET_COMMAND_SUFFIX();
@@ -796,7 +808,8 @@
ibufp++;
}
if (!isspace((unsigned char)*ibufp)) {
- sprintf(errmsg, "unexpected command suffix");
+ snprintf(errmsg, sizeof(errmsg),
+ "unexpected command suffix");
return ERR;
} else if ((fnp = get_filename()) == NULL)
return ERR;
@@ -809,7 +822,7 @@
strcpy(old_filename, fnp);
#ifdef BACKWARDS
if (*fnp == '\0' && *old_filename == '\0') {
- sprintf(errmsg, "no current filename");
+ snprintf(errmsg, sizeof(errmsg), "no current filename");
return ERR;
}
#endif
@@ -823,14 +836,14 @@
break;
case 'x':
if (addr_cnt > 0) {
- sprintf(errmsg, "unexpected address");
+ snprintf(errmsg, sizeof(errmsg), "unexpected address");
return ERR;
}
GET_COMMAND_SUFFIX();
#ifdef DES
des = get_keyword();
#else
- sprintf(errmsg, "crypt unavailable");
+ snprintf(errmsg, sizeof(errmsg), "crypt unavailable");
return ERR;
#endif
break;
@@ -855,7 +868,7 @@
break;
case '!':
if (addr_cnt > 0) {
- sprintf(errmsg, "unexpected address");
+ snprintf(errmsg, sizeof(errmsg), "unexpected address");
return ERR;
} else if ((sflags = get_shell_command()) < 0)
return ERR;
@@ -874,7 +887,7 @@
return ERR;
break;
default:
- sprintf(errmsg, "unknown command");
+ snprintf(errmsg, sizeof(errmsg), "unknown command");
return ERR;
}
return gflag;
@@ -892,7 +905,7 @@
}
if (first_addr > second_addr || 1 > first_addr ||
second_addr > addr_last) {
- sprintf(errmsg, "invalid address");
+ snprintf(errmsg, sizeof(errmsg), "invalid address");
return ERR;
}
return 0;
@@ -923,7 +936,7 @@
return n;
}
} while (n != current_addr);
- sprintf(errmsg, "no match");
+ snprintf(errmsg, sizeof(errmsg), "no match");
return ERR;
}
@@ -940,7 +953,7 @@
if (*ibufp != '\n') {
SKIP_BLANKS();
if (*ibufp == '\n') {
- sprintf(errmsg, "invalid filename");
+ snprintf(errmsg, sizeof(errmsg), "invalid filename");
return NULL;
} else if ((ibufp = get_extended_line(&n, 1)) == NULL)
return NULL;
@@ -952,13 +965,13 @@
printf("%s\n", shcmd + 1);
return shcmd;
} else if (n > PATH_MAX - 1) {
- sprintf(errmsg, "filename too long");
+ snprintf(errmsg, sizeof(errmsg), "filename too long");
return NULL;
}
}
#ifndef BACKWARDS
else if (*old_filename == '\0') {
- sprintf(errmsg, "no current filename");
+ snprintf(errmsg, sizeof(errmsg), "no current filename");
return NULL;
}
#endif
@@ -983,7 +996,7 @@
int j = 0;
if (red) {
- sprintf(errmsg, "shell access restricted");
+ snprintf(errmsg, sizeof(errmsg), "shell access restricted");
return ERR;
} else if ((s = ibufp = get_extended_line(&j, 1)) == NULL)
return ERR;
@@ -1008,7 +1021,8 @@
else if (shcmd == NULL)
#endif
{
- sprintf(errmsg, "no previous command");
+ snprintf(errmsg, sizeof(errmsg),
+ "no previous command");
return ERR;
} else {
REALLOC(buf, n, i + shcmdi, ERR);
@@ -1019,7 +1033,8 @@
break;
case '%':
if (*old_filename == '\0') {
- sprintf(errmsg, "no current filename");
+ snprintf(errmsg, sizeof(errmsg),
+ "no current filename");
return ERR;
}
j = strlen(s = strip_escapes(old_filename));
@@ -1043,8 +1058,8 @@
long n;
{
int l;
- char *lp = ibuf;
- char *eot;
+ const char *lp = ibuf;
+ const char *eot;
undo_t *up = NULL;
for (current_addr = n;;) {
@@ -1246,7 +1261,7 @@
char *s;
if (!from) {
- sprintf(errmsg, "invalid address");
+ snprintf(errmsg, sizeof(errmsg), "invalid address");
return ERR;
}
ep = get_addressed_line_node(INC_MOD(to, addr_last));
@@ -1273,7 +1288,7 @@
int n;
{
if (!islower((unsigned char)n)) {
- sprintf(errmsg, "invalid mark character");
+ snprintf(errmsg, sizeof(errmsg), "invalid mark character");
return ERR;
} else if (mark[n - 'a'] == NULL)
markno++;
@@ -1288,7 +1303,7 @@
int n;
{
if (!islower((unsigned char)n)) {
- sprintf(errmsg, "invalid mark character");
+ snprintf(errmsg, sizeof(errmsg), "invalid mark character");
return ERR;
}
return get_line_node_addr(mark[n - 'a']);
@@ -1319,7 +1334,7 @@
if ((np = (line_t *) malloc(sizeof(line_t))) == NULL) {
fprintf(stderr, "%s\n", strerror(errno));
- sprintf(errmsg, "out of memory");
+ snprintf(errmsg, sizeof(errmsg), "out of memory");
return NULL;
}
np->seek = lp->seek;
@@ -1385,12 +1400,13 @@
{
char *hup = NULL; /* hup filename */
char *s;
+ char ed_hup[] = "ed.hup";
int n;
if (!sigactive)
quit(1);
sigflags &= ~(1 << (signo - 1));
- if (addr_last && write_file("ed.hup", "w", 1, addr_last) < 0 &&
+ if (addr_last && write_file(ed_hup, "w", 1, addr_last) < 0 &&
(s = getenv("HOME")) != NULL &&
(n = strlen(s)) + 8 <= PATH_MAX && /* "ed.hup" + '/' */
(hup = (char *) malloc(n + 10)) != NULL) {
@@ -1444,7 +1460,7 @@
char *s;
{
if (red && (*s == '!' || !strcmp(s, "..") || strchr(s, '/'))) {
- sprintf(errmsg, "shell access restricted");
+ snprintf(errmsg, sizeof(errmsg), "shell access restricted");
return 0;
}
return 1;
Index: ed/re.c
===================================================================
RCS file: /home/ncvs/src/bin/ed/re.c,v
retrieving revision 1.16
diff -u -r1.16 re.c
--- ed/re.c 2001/05/29 18:03:14 1.16
+++ ed/re.c 2001/07/03 01:32:27
@@ -27,12 +27,8 @@
*/
#ifndef lint
-#if 0
-static char * const rcsid = "@(#)re.c,v 1.6 1994/02/01 00:34:43 alm Exp";
-#else
-static char * const rcsid =
+static const char rcsid[] =
"$FreeBSD: src/bin/ed/re.c,v 1.16 2001/05/29 18:03:14 imp Exp $";
-#endif
#endif /* not lint */
#include "ed.h"
@@ -54,10 +50,11 @@
int n;
if ((delimiter = *ibufp) == ' ') {
- sprintf(errmsg, "invalid pattern delimiter");
+ snprintf(errmsg, sizeof(errmsg), "invalid pattern delimiter");
return NULL;
} else if (delimiter == '\n' || *++ibufp == '\n' || *ibufp == delimiter) {
- if (!exp) sprintf(errmsg, "no previous pattern");
+ if (!exp)
+ snprintf(errmsg, sizeof(errmsg), "no previous pattern");
return exp;
} else if ((exps = extract_pattern(delimiter)) == NULL)
return NULL;
@@ -66,7 +63,7 @@
regfree(exp);
else if ((exp = (pattern_t *) malloc(sizeof(pattern_t))) == NULL) {
fprintf(stderr, "%s\n", strerror(errno));
- sprintf(errmsg, "out of memory");
+ snprintf(errmsg, sizeof(errmsg), "out of memory");
return NULL;
}
patlock = 0;
@@ -97,13 +94,15 @@
break;
case '[':
if ((nd = parse_char_class(++nd)) == NULL) {
- sprintf(errmsg, "unbalanced brackets ([])");
+ snprintf(errmsg, sizeof(errmsg),
+ "unbalanced brackets ([])");
return NULL;
}
break;
case '\\':
if (*++nd == '\n') {
- sprintf(errmsg, "trailing backslash (\\)");
+ snprintf(errmsg, sizeof(errmsg),
+ "trailing backslash (\\)");
return NULL;
}
break;
Index: ed/sub.c
===================================================================
RCS file: /home/ncvs/src/bin/ed/sub.c,v
retrieving revision 1.12
diff -u -r1.12 sub.c
--- ed/sub.c 1999/08/27 23:14:15 1.12
+++ ed/sub.c 2001/07/03 01:32:27
@@ -27,12 +27,8 @@
*/
#ifndef lint
-#if 0
-static char * const rcsid = "@(#)sub.c,v 1.1 1994/02/01 00:34:44 alm Exp";
-#else
-static char * const rcsid =
+static const char rcsid[] =
"$FreeBSD: src/bin/ed/sub.c,v 1.12 1999/08/27 23:14:15 peter Exp $";
-#endif
#endif /* not lint */
#include "ed.h"
@@ -86,7 +82,9 @@
if (*ibufp == '%' && *(ibufp + 1) == delimiter) {
ibufp++;
- if (!rhbuf) sprintf(errmsg, "no previous substitution");
+ if (!rhbuf)
+ snprintf(errmsg, sizeof(errmsg),
+ "no previous substitution");
return rhbuf;
}
while (*ibufp != delimiter) {
@@ -124,8 +122,8 @@
int kth;
{
undo_t *up;
- char *txt;
- char *eot;
+ const char *txt;
+ const char *eot;
long lc;
long xa = current_addr;
int nsubs = 0;
@@ -163,7 +161,7 @@
}
current_addr = xa;
if (nsubs == 0 && !(gflag & GLB)) {
- sprintf(errmsg, "no match");
+ snprintf(errmsg, sizeof(errmsg), "no match");
return ERR;
} else if ((gflag & (GPR | GLS | GNP)) &&
display_lines(current_addr, current_addr, gflag) < 0)
@@ -222,7 +220,8 @@
i = eot - txt;
REALLOC(rbuf, rbufsz, off + i + 2, ERR);
if (i > 0 && !rm[0].rm_eo && (gflag & GSG)) {
- sprintf(errmsg, "infinite substitution loop");
+ snprintf(errmsg, sizeof(errmsg),
+ "infinite substitution loop");
return ERR;
}
if (isbinary)
@@ -238,7 +237,7 @@
return offset to end of modified text */
int
apply_subst_template(boln, rm, off, re_nsub)
- char *boln;
+ const char *boln;
regmatch_t *rm;
int off;
int re_nsub;
Index: ed/undo.c
===================================================================
RCS file: /home/ncvs/src/bin/ed/undo.c,v
retrieving revision 1.9
diff -u -r1.9 undo.c
--- ed/undo.c 1999/08/27 23:14:15 1.9
+++ ed/undo.c 2001/07/03 01:32:27
@@ -26,12 +26,8 @@
*/
#ifndef lint
-#if 0
-static char * const rcsid = "@(#)undo.c,v 1.1 1994/02/01 00:34:44 alm Exp";
-#else
-static char * const rcsid =
+static const char rcsid[] =
"$FreeBSD: src/bin/ed/undo.c,v 1.9 1999/08/27 23:14:15 peter Exp $";
-#endif
#endif /* not lint */
#include "ed.h"
@@ -55,7 +51,7 @@
if (ustack == NULL &&
(ustack = (undo_t *) malloc((usize = USIZE) * sizeof(undo_t))) == NULL) {
fprintf(stderr, "%s\n", strerror(errno));
- sprintf(errmsg, "out of memory");
+ snprintf(errmsg, sizeof(errmsg), "out of memory");
return NULL;
}
#endif
@@ -70,7 +66,7 @@
}
/* out of memory - release undo stack */
fprintf(stderr, "%s\n", strerror(errno));
- sprintf(errmsg, "out of memory");
+ snprintf(errmsg, sizeof(errmsg), "out of memory");
clear_undo_stack();
free(ustack);
ustack = NULL;
@@ -98,7 +94,7 @@
long o_addr_last = addr_last;
if (u_current_addr == -1 || u_addr_last == -1) {
- sprintf(errmsg, "nothing to undo");
+ snprintf(errmsg, sizeof(errmsg), "nothing to undo");
return ERR;
} else if (u_p)
modified = 1;
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-audit" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200107030217.f632HOT06228>
