Date: Mon, 8 Dec 1997 10:59:08 -0800 (PST) From: mjacob@FreeBSD.ORG To: freebsd-gnats-submit@FreeBSD.ORG Subject: bin/5253: catgets(3) and catclose(3) don't guard against unopened catalogs Message-ID: <199712081859.KAA29352@hub.freebsd.org> Resent-Message-ID: <199712081900.LAA29491@hub.freebsd.org>
index | next in thread | raw e-mail
>Number: 5253
>Category: bin
>Synopsis: catgets(3) and catclose(3) don't guard against unopened catalogs
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Mon Dec 8 11:00:00 PST 1997
>Last-Modified:
>Originator: Matthew Jacob
>Organization:
Feral Software
>Release: 2.2.2
>Environment:
FreeBSD worp.feral.com 2.2.2-RELEASE FreeBSD 2.2.2-RELEASE #21: Mon Aug 11 11:17:23 PDT 1997 root@worp.feral.com:/usr/src/sys/compile/WORP i386
>Description:
catopen(3) defines that a failure to open a message catalog shall
return a nl_catd descriptor of -1.
Most platforms that support catalogs then also handle the case of
a -1 nl_catd descriptor being passed to catgets && catclose (and do
the right thing).
This is mostly a problem for ports of s/w from other systems.
Also, on closer examination, there's a couple other problems in
msgcat.c itself too.
>How-To-Repeat:
Try any catgets or catclose call with -1 as the catalog descriptor.
>Fix:
Index: msgcat.c
===================================================================
RCS file: /home/ncvs/src/lib/libc/nls/msgcat.c,v
retrieving revision 1.11
diff -u -r1.11 msgcat.c
--- msgcat.c 1997/05/10 04:40:40 1.11
+++ msgcat.c 1997/12/08 18:56:22
@@ -85,6 +85,7 @@
__const char *name;
int type;
{
+ nl_catd rv;
char path[MAXPATHLEN];
__const char *catpath = NULL;
char *nlspath;
@@ -93,11 +94,17 @@
char *base, *cptr, *pathP;
struct stat sbuf;
- if (!name || !*name) return(NLERR);
+ if (!name || !*name) {
+ errno = EINVAL;
+ return(NLERR);
+ }
if (strchr(name, '/')) {
catpath = name;
- if (stat(catpath, &sbuf)) return(0);
+ if (stat(catpath, &sbuf)) {
+ /* propagate errno back */
+ return (NLERR);
+ }
} else {
if ((lang = (char *) getenv("LANG")) == NULL)
lang = "C";
@@ -106,7 +113,11 @@
len = strlen(nlspath);
base = cptr = (char *) malloc(len + 2);
- if (!base) return(NLERR);
+ if (!base) {
+ if (errno == 0)
+ errno = ENOMEM;
+ return (NLERR);
+ }
strcpy(cptr, nlspath);
cptr[len] = ':';
cptr[len+1] = '\0';
@@ -137,10 +148,19 @@
}
free(base);
- if (!catpath) return(0);
+ if (!catpath) {
+ errno = ENOENT;
+ return (NLERR);
+ }
}
- return(loadCat(catpath, type));
+ rv = loadCat(catpath, type);
+ if (rv == (nl_catd) 0) {
+ if (errno == 0)
+ errno = ENOENT; /* ?? */
+ rv = NLERR;
+ }
+ return (rv);
}
/*
@@ -244,9 +264,14 @@
char *dflt;
{
MCMsgT *msg;
- MCCatT *cat = (MCCatT *) catd;
+ MCCatT *cat;
char *cptr;
+ if (catd == NLERR) {
+ errno = EBADF;
+ return (-1);
+ }
+ cat = (MCCatT *) catd;
msg = MCGetMsg(MCGetSet(cat, setId), msgId);
if (msg) cptr = msg->msg.str;
else cptr = dflt;
@@ -257,11 +282,20 @@
int _catclose( catd)
nl_catd catd;
{
- MCCatT *cat = (MCCatT *) catd;
+ MCCatT *cat;
+
MCSetT *set;
int i;
- if (!cat) return -1;
+ if (catd == NLERR) {
+ errno = EBADF;
+ return (-1);
+ }
+ cat = (MCCatT *) catd;
+ if (!cat) {
+ errno = EBADF;
+ return -1;
+ }
if (cat->loadType != MCLoadAll) close(cat->fd);
for (i = 0; i < cat->numSets; ++i) {
>Audit-Trail:
>Unformatted:
home |
help
Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199712081859.KAA29352>
