Plug failure memory leaks
Use issetugid now
PR: 3492
This commit is contained in:
ache 1997-05-10 04:28:17 +00:00
parent 66ef383d7a
commit d4628da608

View File

@ -1,4 +1,4 @@
/* $Id: msgcat.c,v 1.8 1997/03/24 06:15:07 imp Exp $ */
/* $Id: msgcat.c,v 1.9 1997/03/25 05:36:37 imp Exp $ */
/***********************************************************
Copyright 1990, by Alfalfa Software Incorporated, Cambridge, Massachusetts.
@ -87,7 +87,7 @@ int type;
{
char path[MAXPATHLEN];
__const char *catpath = NULL;
char *nlspath, *tmppath = NULL;
char *nlspath;
char *lang;
long len;
char *base, *cptr, *pathP;
@ -101,11 +101,8 @@ int type;
} else {
if ((lang = (char *) getenv("LANG")) == NULL)
lang = "C";
/* XXX Should really be issetguid(), but we don't have that */
if ((nlspath = (char *) getenv("NLSPATH")) == NULL ||
getuid() != geteuid() || getgid() != getegid()) {
if ((nlspath = (char *) getenv("NLSPATH")) == NULL || issetugid())
nlspath = "/usr/share/nls/%L/%N.cat:/usr/share/nls/%N/%L:/usr/local/share/nls/%L/%N.cat:/usr/local/share/nls/%N/%L";
}
len = strlen(nlspath);
base = cptr = (char *) malloc(len + 2);
@ -139,7 +136,6 @@ int type;
}
}
free(base);
if (tmppath) free(tmppath);
if (!catpath) return(0);
}
@ -287,8 +283,8 @@ nl_catd catd;
/* Note that only malloc failures are allowed to return an error */
#define ERRNAME "Message Catalog System"
#define CORRUPT() {fprintf(stderr, "%s: corrupt file.\n", ERRNAME); return(0);}
#define NOSPACE() {fprintf(stderr, "%s: no more memory.\n", ERRNAME); return(NLERR);}
#define CORRUPT() {fprintf(stderr, "%s: corrupt file.\n", ERRNAME); free(cat); return(0);}
#define NOSPACE() {fprintf(stderr, "%s: no more memory.\n", ERRNAME); free(cat); return(NLERR);}
static nl_catd loadCat( catpath, type)
__const char *catpath;
@ -305,22 +301,25 @@ int type;
cat->loadType = type;
if ((cat->fd = open(catpath, O_RDONLY)) < 0) {
free(cat);
return(0);
}
fcntl(cat->fd, F_SETFD, FD_CLOEXEC);
(void)fcntl(cat->fd, F_SETFD, FD_CLOEXEC);
if (read(cat->fd, &header, sizeof(header)) != sizeof(header)) CORRUPT();
if (strncmp(header.magic, MCMagic, MCMagicLen) != 0) CORRUPT();
if (header.majorVer != MCMajorVer) {
free(cat);
fprintf(stderr, "%s: %s is version %ld, we need %ld.\n", ERRNAME,
catpath, header.majorVer, MCMajorVer);
return(0);
}
if (header.numSets <= 0) {
free(cat);
fprintf(stderr, "%s: %s has %ld sets!\n", ERRNAME, catpath,
header.numSets);
return(0);
@ -332,11 +331,13 @@ int type;
nextSet = header.firstSet;
for (i = 0; i < cat->numSets; ++i) {
if (lseek(cat->fd, nextSet, 0) == -1) CORRUPT();
if (lseek(cat->fd, nextSet, 0) == -1)
{free(cat->sets); CORRUPT();}
/* read in the set header */
set = cat->sets + i;
if (read(cat->fd, set, sizeof(*set)) != sizeof(*set)) CORRUPT();
if (read(cat->fd, set, sizeof(*set)) != sizeof(*set))
{free(cat->sets); CORRUPT();}
/* if it's invalid, skip over it (and backup 'i') */
@ -349,6 +350,7 @@ int type;
if (cat->loadType == MCLoadAll) {
nl_catd res;
if ((res = loadSet(cat, set)) <= 0) {
free(cat->sets);
if (res == -1) NOSPACE();
CORRUPT();
}
@ -372,15 +374,23 @@ MCSetT *set;
/* Get the data */
if (lseek(cat->fd, set->data.off, 0) == -1) return(0);
if ((set->data.str = (char *) malloc(set->dataLen)) == NULL) return(-1);
if (read(cat->fd, set->data.str, set->dataLen) != set->dataLen) return(0);
if (read(cat->fd, set->data.str, set->dataLen) != set->dataLen) {
free(set->data.str); return(0);
}
/* Get the messages */
if (lseek(cat->fd, set->u.firstMsg, 0) == -1) return(0);
if ((set->u.msgs = (MCMsgT *) malloc(sizeof(MCMsgT) * set->numMsgs)) == NULL) return(-1);
if (lseek(cat->fd, set->u.firstMsg, 0) == -1) {
free(set->data.str); return(0);
}
if ((set->u.msgs = (MCMsgT *) malloc(sizeof(MCMsgT) * set->numMsgs)) == NULL) {
free(set->data.str); return(-1);
}
for (i = 0; i < set->numMsgs; ++i) {
msg = set->u.msgs + i;
if (read(cat->fd, msg, sizeof(*msg)) != sizeof(*msg)) return(0);
if (read(cat->fd, msg, sizeof(*msg)) != sizeof(*msg)) {
free(set->u.msgs); free(set->data.str); return(0);
}
if (msg->invalid) {
--i;
continue;
@ -390,8 +400,3 @@ MCSetT *set;
set->invalid = False;
return(1);
}