Date: Tue, 16 Oct 2012 22:30:33 -0700 (PDT) From: Zhihao Yuan <lichray@gmail.com> To: FreeBSD-gnats-submit@FreeBSD.org Subject: standards/172805: Fix catopen(3)'s EINVAL usage and document EFTYPE Message-ID: <507e4279.8728320a.3464.ffffbdbd@mx.google.com> Resent-Message-ID: <201210170540.q9H5e08k049992@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 172805 >Category: standards >Synopsis: Fix catopen(3)'s EINVAL usage and document EFTYPE >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-standards >State: open >Quarter: >Keywords: >Date-Required: >Class: doc-bug >Submitter-Id: current-users >Arrival-Date: Wed Oct 17 05:40:00 UTC 2012 >Closed-Date: >Last-Modified: >Originator: Zhihao Yuan >Release: FreeBSD 8.3-STABLE amd64 >Organization: Northern Illinois University >Environment: System: FreeBSD elitebook.hp 8.3-STABLE FreeBSD 8.3-STABLE #4 r240363: Tue Sep 11 10:40:15 CDT 2012 lichray@elitebook.hp:/usr/obj/usr/src/sys/HOUKAGO amd64 >Description: 1. catopen("", 0) should set errno to ENOENT; 2. Document EFTYPE. POSIX says nothing about how to report a corrupt catalog. NetBSD and OpenBSD do nothing (errno == 0), while we set EFTYPE. Document it. 3. Fix errno under a rare condition (fstat(2) fails after open(2)). >How-To-Repeat: >Fix: --- catopen3.patch begins here --- diff --git lib/libc/nls/catopen.3 lib/libc/nls/catopen.3 index 7a16ee5..219c2cb 100644 --- lib/libc/nls/catopen.3 +++ lib/libc/nls/catopen.3 @@ -27,7 +27,7 @@ .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .\" .\" $FreeBSD$ -.Dd February 12, 2005 +.Dd October 17, 2012 .Dt CATOPEN 3 .Os .Sh NAME @@ -132,10 +132,13 @@ Otherwise, (nl_catd) -1 is returned and is set to indicate the error. .Sh ERRORS .Bl -tag -width Er +.It Bq Er EFTYPE +The named message catalog is corrupt. .It Bq Er EINVAL Argument .Fa name -does not point to a valid message catalog, or catalog is corrupt. +points to +.Dv NULL . .It Bq Er ENAMETOOLONG An entire path to the message catalog exceeded 1024 characters. .It Bq Er ENOENT @@ -154,4 +157,4 @@ Insufficient memory is available. The .Fn catopen function conforms to -.St -p1003.1-2001 . +.St -p1003.1-2008 . diff --git lib/libc/nls/msgcat.c lib/libc/nls/msgcat.c index 44b1440..2c77788 100644 --- lib/libc/nls/msgcat.c +++ lib/libc/nls/msgcat.c @@ -119,8 +119,10 @@ catopen(const char *name, int type) char path[PATH_MAX]; /* sanity checking */ - if (name == NULL || *name == '\0') + if (name == NULL) NLRETERR(EINVAL); + if (*name == '\0') + NLRETERR(ENOENT); if (strchr(name, '/') != NULL) /* have a pathname */ @@ -367,6 +369,7 @@ load_msgcat(const char *path, const char *name, const char *lang) struct catentry *np; void *data; int fd; + int saved_errno; /* path/name will never be NULL here */ @@ -390,9 +393,10 @@ load_msgcat(const char *path, const char *name, const char *lang) } if (_fstat(fd, &st) != 0) { + saved_errno = errno; _close(fd); - SAVEFAIL(name, lang, EFTYPE); - NLRETERR(EFTYPE); + SAVEFAIL(name, lang, saved_errno); + NLRETERR(saved_errno); } /* @@ -408,7 +412,7 @@ load_msgcat(const char *path, const char *name, const char *lang) if ((data = mmap(0, (size_t)st.st_size, PROT_READ, MAP_FILE|MAP_SHARED, fd, (off_t)0)) == MAP_FAILED) { - int saved_errno = errno; + saved_errno = errno; _close(fd); SAVEFAIL(name, lang, saved_errno); NLRETERR(saved_errno); --- catopen3.patch ends here --- >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?507e4279.8728320a.3464.ffffbdbd>