tools/build/*.c: Clean up issues reported by CodeSonar

This code is built without warnings and ignored by Coverity Scan.
CodeSonar found a wide range of issues including buffer overruns,
buffer underruns, questionable type conversions, leaks, etc. This
set of patches addresses all reported issues.
This commit is contained in:
Josh Oguin
2014-11-26 07:52:00 -06:00
committed by Joel Sherrill
parent d4ec0a2d75
commit b164303012
5 changed files with 307 additions and 304 deletions
+66 -74
View File
@@ -1,11 +1,10 @@
#include <stdio.h>
#include <stdlib.h>
/*
* This function will patch binary file
*/
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
static char buf[512];
@@ -25,128 +24,121 @@ usage(void)
printf("<byte1> - byte 1 of patch\n");
printf("<byte2> - byte 1 of patch\n");
printf("<byte3> - byte 1 of patch\n");
return;
}
int
main(int argc, char **argv)
{
int c;
int c;
FILE *ofp, *ifp;
char patch[4], *end;
int patchLen, tmp, i, off, cnt, patched, len, reloc;
char *patch, *end;
int patchLen, tmp, i, off, cnt, patched, len, reloc;
/* parse command line options */
while ((c = getopt(argc, argv, "h")) >= 0)
{
switch (c)
{
case 'h':
usage();
return 0;
default:
usage();
return 1;
}
}
while ((c = getopt(argc, argv, "h")) >= 0) {
switch (c) {
case 'h':
usage();
return 0;
default:
usage();
return 1;
}
}
if(argc < 6)
{
if(argc < 6) {
usage();
return 1;
}
}
/* Let us get offset in file */
reloc = strtol(argv[3], &end, 0);
if(end == argv[3] || off < 0)
{
if (end == argv[3] || reloc < 0) {
fprintf(stderr, "bad reloc value %s\n", argv[3]);
return 1;
}
}
off = strtol(argv[4], &end, 0);
if(end == argv[4] || off < 0 || off < reloc)
{
if (end == argv[4] || off < 0 || off < reloc) {
fprintf(stderr, "bad offset value %s\n", argv[4]);
return 1;
}
}
off -= reloc;
/* Let us get patch */
patchLen = argc - 5;
patch = calloc( patchLen, sizeof(char) );
assert( patch );
for(i=0; i<patchLen; i++)
{
for (i=0; i<patchLen; i++) {
tmp = strtol(argv[5+i], &end, 0);
if(end == argv[4+i] || tmp < 0 || tmp > 0xff)
{
fprintf(stderr, "bad byte value %s\n", argv[5+i]);
return 1;
}
patch[i] = tmp;
}
if (end == argv[4+i]) {
fprintf(stderr, "bad byte value %s\n", argv[5+i]);
free(patch);
return 1;
}
if (tmp < 0 || tmp > 0xff) {
fprintf(stderr, "not a byte value %s\n", argv[5+i]);
free(patch);
return 1;
}
patch[i] = (tmp & 0xff);
}
ifp = fopen(argv[2], "r");
if(ifp == NULL)
{
if (ifp == NULL) {
fprintf(stderr, "unable to open file %s\n", argv[2]);
free(patch);
return 1;
}
}
ofp = fopen(argv[1], "w");
if(ofp == NULL)
{
if (ofp == NULL) {
fprintf(stderr, "unable to open file %s\n", argv[1]);
fclose(ifp);
free(patch);
return 1;
}
}
cnt = 0;
patched = 0;
for(;;)
{
for(;;) {
len = fread(buf, 1, sizeof(buf), ifp);
if(len == 0)
{
break;
}
if(len == 0) {
break;
}
if(cnt <= off && (cnt + len) > off)
{
/* Perform patch */
for(i=0; i<patchLen && (off+i)<(cnt+len); i++)
{
buf[off-cnt+i] = patch[i];
}
patched = 1;
}
else if(cnt > off && cnt < (off + patchLen))
{
/* Perform patch */
for(i=cnt-off; i<patchLen; i++)
{
buf[off-cnt+i] = patch[i];
}
patched = 1;
}
if (cnt <= off && (cnt + len) > off) {
/* Perform patch */
for(i=0; i<patchLen && (off+i)<(cnt+len); i++)
{
buf[off-cnt+i] = patch[i];
}
patched = 1;
} else if(cnt > off && cnt < (off + patchLen)) {
/* Perform patch */
for(i=cnt-off; i<patchLen; i++) {
buf[off-cnt+i] = patch[i];
}
patched = 1;
}
fwrite(buf, 1, len, ofp);
cnt += len;
}
}
fclose(ifp);
fclose(ofp);
free(patch);
if(!patched)
{
if (!patched) {
fprintf(stderr, "warning: offset is beyond input file length\n");
fprintf(stderr, " no patch is performed\n");
}
}
return 0;
}
+11 -17
View File
@@ -125,8 +125,7 @@ int main(
opterr = 0; /* we'll report all errors */
while ((c = getopt(argc, argv, GETOPTARGS)) != EOF)
switch (c)
{
switch (c) {
case 'l': /* line length */
line_length = atoi( optarg );
if ( line_length < 0 || line_length > BUFFER_SIZE )
@@ -150,8 +149,7 @@ int main(
showusage = TRUE;
}
if (showusage)
{
if (showusage) {
(void) fprintf(stderr, "%s", USAGE);
exit(1);
}
@@ -160,9 +158,10 @@ int main(
* traverse and process the arguments
*/
for ( ; argv[optind]; optind++)
for ( ; optind < argc; optind++) {
if (Failed(process(argv[optind])))
rc = FAILURE;
}
return rc;
}
@@ -268,15 +267,11 @@ error(int error_flag, ...)
(void) fflush(stderr);
if (error_flag & (ERR_FATAL | ERR_ABORT))
{
if (error_flag & ERR_FATAL)
{
if (error_flag & (ERR_FATAL | ERR_ABORT)) {
if (error_flag & ERR_FATAL) {
error(0, "fatal error, exiting");
exit(local_errno ? local_errno : 1);
}
else
{
} else {
error(0, "fatal error, aborting");
abort();
}
@@ -291,19 +286,18 @@ getparm(char *s,
{
long val;
if ( ! strchr("0123456789-", *s))
{
if ( !strchr("0123456789-", *s) ) {
error(ERR_FATAL, "'%s' is not a number", s);
return min;
/* does not return */
}
val = strtol(s, (char **) NULL, 0);
if ((val < min) || (val > max))
{
if ((val < min) || (val > max)) {
if (min == max)
error(ERR_FATAL, "%s can only be %ld", s, min);
else
error(ERR_FATAL, "%s must be between %ld and %ld", msg, min, max);
/* does not return */
}
return val;
+9 -5
View File
@@ -189,13 +189,14 @@ process(char *arg)
/*
* Don't count the carriage return.
*/
length = strlen( buffer ) - 1;
length = 0;
if ( *buffer != '\0' )
length = strnlen( buffer, BUFFER_SIZE ) - 1;
if ( buffer[ length ] != '\n' )
error(ERR_ERRNO|ERR_FATAL, "Line %d too long in %s\n", line_number, arg);
while ( isspace( (unsigned char) buffer[ length ] ) )
while ( length && isspace( (unsigned char) buffer[ length ] ) )
buffer[ length-- ] = '\0';
if ( test_only ) {
@@ -208,8 +209,11 @@ process(char *arg)
fclose( in );
if ( !test_only ) {
fclose( out );
rename( outname, arg );
if (out) fclose( out );
rc = rename( outname, arg );
if ( rc != 0 ) {
fprintf( stderr, "Unable to rename %s to %s\n", outname, arg );
}
}
return rc;
}
+123 -110
View File
@@ -55,13 +55,16 @@ int myfgetc(FILE *f)
void process(const char *ifname, const char *ofname)
{
FILE *ifile, *ocfile, *ohfile;
char buf[PATH_MAX], *p;
char obasename[PATH_MAX];
char ocname[PATH_MAX];
char ohname[PATH_MAX];
char buf[PATH_MAX+1], *p;
char obasename[PATH_MAX+1];
char ocname[PATH_MAX+1];
char ohname[PATH_MAX+1];
const char *cp;
size_t len;
ocfile = NULL;
ohfile = NULL;
/* Error check */
if ( !ifname || !ofname ) {
fprintf(stderr, "process has NULL filename\n");
@@ -100,75 +103,84 @@ void process(const char *ifname, const char *ofname)
}
if ( createC ) {
ocfile = fopen(ocname, "wb");
if (ocfile == NULL) {
fprintf(stderr, "cannot open %s for writing\n", ocname);
exit(1);
}
ocfile = fopen(ocname, "wb");
if (ocfile == NULL) {
fprintf(stderr, "cannot open %s for writing\n", ocname);
exit(1);
}
}
if ( createH ) {
ohfile = fopen(ohname, "wb");
if (ohfile == NULL) {
fprintf(stderr, "cannot open %s for writing\n", ohname);
exit(1);
}
ohfile = fopen(ohname, "wb");
if (ohfile == NULL) {
fprintf(stderr, "cannot open %s for writing\n", ohname);
exit(1);
}
}
/* find basename */
char *ifbasename = strdup(ifname);
if ( ifbasename == NULL ) {
fprintf(stderr, "cannot allocate memory\n" );
fclose(ifile);
if ( createC ) { fclose(ocfile); }
if ( createH ) { fclose(ohfile); }
exit(1);
}
ifbasename = basename(ifbasename);
strcpy(buf, ifbasename);
for (p = buf; *p != '\0'; ++p)
if (!isalnum(*p))
for (p = buf; *p != '\0'; ++p) {
if (!isalnum((unsigned char)*p)) /* cast to avoid negative indexing */
*p = '_';
}
if ( createC ) {
/* print C file header */
fprintf(
ocfile,
"/*\n"
" * Declarations for C structure representing binary file %s\n"
" *\n"
" * WARNING: Automatically generated -- do not edit!\n"
" */\n"
"\n"
"#include <sys/types.h>\n"
"\n",
ifbasename
);
/* print C file header */
fprintf(
ocfile,
"/*\n"
" * Declarations for C structure representing binary file %s\n"
" *\n"
" * WARNING: Automatically generated -- do not edit!\n"
" */\n"
"\n"
"#include <sys/types.h>\n"
"\n",
ifbasename
);
/* print structure */
fprintf(
ocfile,
"%s%sunsigned char %s[] = {\n ",
((usestatic) ? "static " : ""),
((useconst) ? "const " : ""),
buf
);
int c, col = 1;
while ((c = myfgetc(ifile)) != EOF) {
if (col >= 78 - 6) {
fprintf(ocfile, "\n ");
col = 1;
}
fprintf(ocfile, "0x%.2x, ", c);
col += 6;
/* print structure */
fprintf(
ocfile,
"%s%sunsigned char %s[] = {\n ",
((usestatic) ? "static " : ""),
((useconst) ? "const " : ""),
buf
);
int c, col = 1;
while ((c = myfgetc(ifile)) != EOF) {
if (col >= 78 - 6) {
fprintf(ocfile, "\n ");
col = 1;
}
fprintf(ocfile, "0x%.2x, ", c);
col += 6;
fprintf(ocfile, "\n};\n");
}
fprintf(ocfile, "\n};\n");
/* print sizeof */
fprintf(
ocfile,
"\n"
"%s%ssize_t %s_size = sizeof(%s);\n",
((usestatic) ? "static " : ""),
((useconst) ? "const " : ""),
buf,
buf
);
/* print sizeof */
fprintf(
ocfile,
"\n"
"%s%ssize_t %s_size = sizeof(%s);\n",
((usestatic) ? "static " : ""),
((useconst) ? "const " : ""),
buf,
buf
);
} /* createC */
/*****************************************************************/
@@ -176,61 +188,61 @@ void process(const char *ifname, const char *ofname)
/*****************************************************************/
if ( createH ) {
/* print H file header */
char hbasename[PATH_MAX];
char* p;
/* Clean up the file name if it is an abs path */
strcpy(
hbasename,
obasename
);
p = hbasename;
while (*p != '\0') {
if (*p < '0' || *p > 'z')
*p = '_';
++p;
}
fprintf(
ohfile,
"/*\n"
" * Extern declarations for C structure representing binary file %s\n"
" *\n"
" * WARNING: Automatically generated -- do not edit!\n"
" */\n"
"\n"
"#ifndef __%s_h\n"
"#define __%s_h\n"
"\n"
"#include <sys/types.h>\n"
"\n",
ifbasename, /* header */
hbasename, /* ifndef */
hbasename /* define */
);
/* print H file header */
char hbasename[PATH_MAX];
char* p;
/* Clean up the file name if it is an abs path */
strcpy(
hbasename,
obasename
);
p = hbasename;
while (*p != '\0') {
if (*p < '0' || *p > 'z')
*p = '_';
++p;
}
fprintf(
ohfile,
"/*\n"
" * Extern declarations for C structure representing binary file %s\n"
" *\n"
" * WARNING: Automatically generated -- do not edit!\n"
" */\n"
"\n"
"#ifndef __%s_h\n"
"#define __%s_h\n"
"\n"
"#include <sys/types.h>\n"
"\n",
ifbasename, /* header */
hbasename, /* ifndef */
hbasename /* define */
);
/* print structure */
fprintf(
ohfile,
"extern %s%sunsigned char %s[];",
((usestatic) ? "static " : ""),
((useconst) ? "const " : ""),
buf
);
/* print sizeof */
fprintf(
ohfile,
"\n"
"extern %s%ssize_t %s_size;\n",
((usestatic) ? "static " : ""),
((useconst) ? "const " : ""),
buf
);
/* print structure */
fprintf(
ohfile,
"extern %s%sunsigned char %s[];",
((usestatic) ? "static " : ""),
((useconst) ? "const " : ""),
buf
);
/* print sizeof */
fprintf(
ohfile,
"\n"
"extern %s%ssize_t %s_size;\n",
((usestatic) ? "static " : ""),
((useconst) ? "const " : ""),
buf
);
fprintf(
ohfile,
"\n"
"#endif\n"
);
fprintf(
ohfile,
"\n"
"#endif\n"
);
} /* createH */
/*****************************************************************/
@@ -240,6 +252,7 @@ void process(const char *ifname, const char *ofname)
fclose(ifile);
if ( createC ) { fclose(ocfile); }
if ( createH ) { fclose(ohfile); }
free(ifbasename);
}
void usage(void)
+98 -98
View File
@@ -36,6 +36,7 @@ usage: unhex [-va] [ -o file ] [ file [file ... ] ]\n\
#include <stdlib.h>
#include <stdarg.h>
#include <errno.h>
#include <assert.h>
#include "config.h"
@@ -71,10 +72,10 @@ typedef unsigned long u32;
* Pick out designated bytes
*/
#define B0(x) ((x) & 0xff)
#define B1(x) B0((x) >> 8)
#define B2(x) B0((x) >> 16)
#define B3(x) B0((x) >> 24)
#define B0(x) (((u32)x) & 0xff)
#define B1(x) B0(((u32)x) >> 8)
#define B2(x) B0(((u32)x) >> 16)
#define B3(x) B0(((u32)x) >> 24)
typedef struct buffer_rec {
u32 dl_destaddr;
@@ -119,9 +120,10 @@ int getnibble(char **p);
int getbyte(char **p);
long getNbytes(char **p, int n);
void badformat(char *s, char *fname, char *msg);
void fix_string_from_gets(char *s, size_t max);
#define get1bytes(p) ((int) getbyte(p))
#define get2bytes(p) ((int) getNbytes(p, 2))
#define get1bytes(p) (getbyte(p))
#define get2bytes(p) getNbytes(p, 2)
#define get3bytes(p) getNbytes(p, 3)
#define get4bytes(p) getNbytes(p, 4)
@@ -140,15 +142,15 @@ int main(
char **argv
)
{
register int c;
int c;
bool showusage = FALSE; /* usage error? */
int rc = 0;
FILE *outfp, *infp;
long base_long = 0;
/*
* figure out invocation leaf-name
*/
if ((progname = strrchr(argv[0], '/')) == (char *) NULL)
progname = argv[0];
else
@@ -159,13 +161,18 @@ int main(
/*
* Check options and arguments.
*/
progname = argv[0];
while ((c = getopt(argc, argv, "F:a:o:vl")) != EOF)
switch (c)
{
while ((c = getopt(argc, argv, "F:a:o:vl")) != EOF) {
switch (c) {
case 'a': /* base address */
base = stol(optarg);
base_long = stol(optarg);
if (base_long < 0) {
(void) fprintf(stderr, "%s", USAGE);
(void) fprintf(stderr, "\n*** base is an illegal value\n" );
exit(1);
}
base = (u32) base_long;
break;
case 'l': /* linear output */
@@ -187,53 +194,47 @@ int main(
case '?':
showusage = TRUE;
}
}
if (showusage)
{
if (showusage) {
(void) fprintf(stderr, "%s", USAGE);
exit(1);
}
if (linear && (base != 0))
{
if (linear && (base != 0)) {
error(0, "-l and -a may not be specified in combination");
exit(1);
}
if (STREQ(outfilename, "-"))
{
if (STREQ(outfilename, "-")) {
outfp = stdout;
outfilename = "stdout";
} else if ((outfp = fopen(outfilename, "w")) == (FILE *) NULL) {
error(-1, "couldn't open '%s' for output", outfilename);
exit(1);
}
else
if ((outfp = fopen(outfilename, "w")) == (FILE *) NULL)
{
error(-1, "couldn't open '%s' for output", outfilename);
exit(1);
}
/*
* Now process the input files (or stdin, if none specified)
*/
if (argv[optind] == (char *) NULL) /* just stdin */
if (argc == optind) /* just stdin */
exit(unhex(stdin, "stdin", outfp, outfilename));
else
for (; (optarg = argv[optind]); optind++)
{
if (STREQ(optarg, "-"))
for (; optind < argc ; optind++) {
optarg = argv[optind];
if (STREQ(optarg, "-")) {
rc += unhex(stdin, "stdin", outfp, outfilename);
else
{
if ((infp = fopen(optarg, "r")) == (FILE *) NULL)
{
} else {
if ((infp = fopen(optarg, "r")) == (FILE *) NULL) {
error(-1, "couldn't open '%s' for input", optarg);
exit(1);
}
rc += unhex(infp, optarg, outfp, outfilename);
fclose(infp);
}
}
fclose(outfp);
return(rc);
}
@@ -260,8 +261,7 @@ unhex(FILE *ifp,
* 'stripffs'
*/
if (FFfill)
{
if (FFfill) {
(void) fseek(ofp, 0, 0);
for (c = FFfill; c > 0; c--)
(void) fputc(0xFF, ofp);
@@ -271,11 +271,9 @@ unhex(FILE *ifp,
* Read the first char from file and determine record types
*/
if ((c = getc(ifp)) != EOF)
{
if ((c = getc(ifp)) != EOF) {
ungetc(c, ifp);
switch(c)
{
switch(c) {
case 'S':
convert_S_records(ifp, inm, ofp, onm);
break;
@@ -292,7 +290,8 @@ unhex(FILE *ifp,
default:
{
char tmp[2];
tmp[0] = c; tmp[1] = 0;
tmp[0] = (char) (c & 0x7f);
tmp[1] = 0;
badformat(tmp, inm, BADFMT);
}
}
@@ -317,21 +316,17 @@ convert_Intel_records(
int incksum;
int c;
int rectype; /* record type */
int len; /* data length of current line */
long len; /* data length of current line */
u32 addr;
u32 base_address = 0;
bool endrecord = FALSE;
buffer_rec tb;
long getBytesStatus;
while ( ! endrecord && (fgets(buff, sizeof(buff), ifp)))
{
while ( !endrecord && (fgets(buff, sizeof(buff), ifp)) ) {
p = &buff[0];
if (p[strlen(p)-1] == '\n') /* get rid of newline */
p[strlen(p)-1] = '\0';
if (p[strlen(p)-1] == '\r') /* get rid of any CR */
p[strlen(p)-1] = '\0';
fix_string_from_gets(p, sizeof(buff));
tb.dl_count = 0;
@@ -342,17 +337,17 @@ convert_Intel_records(
if ((len = getbyte(&p)) == -1) /* record len */
badformat(buff, inm, BADLEN);
if ((addr = get2bytes(&p)) == -1L) /* record addr */
if ((getBytesStatus = get2bytes(&p)) == -1L) /* record addr */
badformat(buff, inm, BADADDR);
addr = (u32) getBytesStatus;
rectype = getbyte(&p);
cksum = len + B0(addr) + B1(addr) + rectype;
switch (rectype)
{
switch (rectype) {
case 0x00: /* normal data record */
tb.dl_destaddr = base_address + addr;
tb.dl_destaddr = (u32) base_address + addr;
while (len--)
{
if ((c = getbyte(&p)) == -1)
@@ -369,15 +364,18 @@ convert_Intel_records(
break;
case 0x02: /* new base */
if ((base_address = get2bytes(&p)) == -1L)
{
long blong;
if ((blong = get2bytes(&p)) == -1L)
badformat(buff, inm, BADBASE);
base_address = (u32) blong;
cksum += B0(base_address) + B1(base_address);
base_address <<= 4;
break;
}
case 0x03: /* seg/off execution start address */
{
u32 seg, off;
long seg, off;
seg = get2bytes(&p);
off = get2bytes(&p);
@@ -423,21 +421,16 @@ convert_S_records(
u8 cksum;
int incksum;
int c;
int len; /* data length of current line */
long len; /* data length of current line */
int rectype; /* record type */
u32 addr;
long addr;
bool endrecord = FALSE;
buffer_rec tb;
while ( ! endrecord && (fgets(buff, sizeof(buff), ifp)))
{
while ( !endrecord && (fgets(buff, sizeof(buff), ifp)) ) {
p = &buff[0];
if (p[strlen(p)-1] == '\n') /* get rid of newline */
p[strlen(p)-1] = '\0';
if (p[strlen(p)-1] == '\r') /* get rid of any CR */
p[strlen(p)-1] = '\0';
fix_string_from_gets(p, sizeof(buff));
tb.dl_count = 0;
@@ -452,8 +445,7 @@ convert_S_records(
badformat(buff, inm, BADLEN);
cksum = len;
switch (rectype)
{
switch (rectype) {
case 0x00: /* comment field, ignored */
goto write_it;
@@ -476,9 +468,8 @@ convert_S_records(
doit:
cksum += B0(addr) + B1(addr) + B2(addr) + B3(addr);
tb.dl_destaddr = addr;
while (len--)
{
tb.dl_destaddr = (u32) addr;
while (len--) {
if ((c = getbyte(&p)) == -1)
badformat(buff, inm, BADDATA);
cksum += c;
@@ -543,33 +534,29 @@ convert_TI_records(
bool eol;
buffer_rec tb;
while ( ! endrecord && (fgets(buff, sizeof(buff), ifp)))
{
while ( ! endrecord && (fgets(buff, sizeof(buff), ifp))) {
p = &buff[0];
if (p[strlen(p)-1] == '\n') /* get rid of newline */
p[strlen(p)-1] = '\0';
if (p[strlen(p)-1] == '\r') /* get rid of any CR */
p[strlen(p)-1] = '\0';
fix_string_from_gets(p, sizeof(buff));
tb.dl_count = 0;
eol = FALSE;
while ( ! eol && ! endrecord)
{
switch (*p++)
{
while ( ! eol && ! endrecord) {
switch (*p++) {
case '9':
if (tb.dl_count)
write_record(&tb, ofp);
tb.dl_destaddr = get2bytes(&p);
tb.dl_destaddr = (u32) get2bytes(&p);
break;
case 'B':
c = getbyte(&p);
assert( c != -1 );
filesum += c;
tb.dl_buf[tb.dl_count++] = c;
c = getbyte(&p);
assert( c != -1 );
filesum += c;
tb.dl_buf[tb.dl_count++] = c;
break;
@@ -596,8 +583,7 @@ void
write_record(buffer_rec *tb,
FILE *fp)
{
if ( ! linear)
{
if ( ! linear) {
if (tb->dl_destaddr < base)
error(ERR_FATAL, "record at address 0x%x precedes base of 0x%x",
tb->dl_destaddr, base);
@@ -615,8 +601,7 @@ getnibble(char **p)
register int val;
**p = toupper(**p);
switch (**p)
{
switch (**p) {
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
val = **p - '0';
@@ -651,15 +636,14 @@ long
getNbytes(char **p,
int n)
{
int t;
long t;
u32 val = 0;
while (n--)
{
while (n--) {
if ((t = getbyte(p)) == -1)
return(-1L);
val <<= 8;
val += t;
val += (u32) t;
}
return(val);
@@ -670,8 +654,10 @@ badformat(char *s,
char *fname,
char *msg)
{
if (s[strlen(s)-1] == '\n') /* get rid of newline */
if ( *s != '\0' ) {
if (s[strlen(s)-1] == '\n') /* get rid of newline */
s[strlen(s)-1] = '\0';
}
error(0, "line '%s'::\n\tfrom file '%s'; %s", s, fname, msg);
exit(1);
}
@@ -719,17 +705,31 @@ error(int error_flag, ...)
(void) fflush(stderr);
if (error_flag & (ERR_FATAL | ERR_ABORT))
{
if (error_flag & ERR_FATAL)
{
if (error_flag & (ERR_FATAL | ERR_ABORT)) {
if (error_flag & ERR_FATAL) {
error(0, "fatal error, exiting");
exit(local_errno ? local_errno : 1);
}
else
{
} else {
error(0, "fatal error, aborting");
abort();
}
}
}
void fix_string_from_gets(char *s, size_t max)
{
size_t len;
assert( s );
if ( *s == '\0' )
return;
len = strnlen( s, max );
if ( s[len - 1] == '\n') /* get rid of newline */
s[len - 1] = '\0';
if ( s[len - 1] == '\r') /* get rid of any CR */
s[len - 1] = '\0';
}