Date: Sat, 20 May 2000 22:20:49 -0700 (PDT) From: douzzer@mega.nu To: freebsd-gnats-submit@FreeBSD.org Subject: kern/18704: GLOB_ERR not handled correctly by glob() Message-ID: <20000521052049.BD73A37B580@hub.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 18704 >Category: kern >Synopsis: GLOB_ERR not handled correctly by glob() >Confidential: no >Severity: serious >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Sat May 20 22:30:01 PDT 2000 >Closed-Date: >Last-Modified: >Originator: Daniel Pouzzner >Release: 4.0-RELEASE >Organization: >Environment: FreeBSD mega 4.0-RELEASE FreeBSD 4.0-RELEASE #10: Mon Apr 24 19:27:08 EDT 2000 douzzer@mega:/usr/src/sys/compile/MEGA i386 >Description: glob() (and internal funcs) never checks GLOB_ERR unless an error handler pointer is passed. Even with a handler, GLOB_ERR is only partially implemented, and conditions which should activate the semantic do not. Finally, conditions which should not activate the semantic do, rendering GLOB_ERR far less useful than it should be (a TODO identifying this problem was in the source tree, and I implemented the fix). >How-To-Repeat: Do that math :-P glob("/secretdir/*",GLOB_ERR,0,&globbuf) where /secretdir is not accessible - should result in negative return value, but does not. >Fix: The following context diff was pasted from emacs - tabs are intact. *** /usr/src/lib/libc/gen/glob.c Fri Feb 20 02:54:56 1998 --- /tmp/glob.c Sun May 21 01:19:24 2000 *************** *** 532,540 **** for (anymeta = 0;;) { if (*pattern == EOS) { /* End of pattern? */ *pathend = EOS; ! if (g_lstat(pathbuf, &sb, pglob)) ! return(0); ! if (((pglob->gl_flags & GLOB_MARK) && pathend[-1] != SEP) && (S_ISDIR(sb.st_mode) || (S_ISLNK(sb.st_mode) && --- 532,543 ---- for (anymeta = 0;;) { if (*pattern == EOS) { /* End of pattern? */ *pathend = EOS; ! if (g_lstat(pathbuf, &sb, pglob)) { ! if (pglob->gl_flags & GLOB_ERR) ! return GLOB_ABEND; ! else ! return(0); ! } if (((pglob->gl_flags & GLOB_MARK) && pathend[-1] != SEP) && (S_ISDIR(sb.st_mode) || (S_ISLNK(sb.st_mode) && *************** *** 589,599 **** errno = 0; if ((dirp = g_opendir(pathbuf, pglob)) == NULL) { ! /* TODO: don't call for ENOENT or ENOTDIR? */ if (pglob->gl_errfunc) { g_Ctoc(pathbuf, buf); ! if (pglob->gl_errfunc(buf, errno) || ! pglob->gl_flags & GLOB_ERR) return (GLOB_ABEND); } return(0); --- 592,602 ---- errno = 0; if ((dirp = g_opendir(pathbuf, pglob)) == NULL) { ! if ((pglob->gl_flags & GLOB_ERR) && (errno != ENOENT) && (errno != ENOTDIR)) ! return GLOB_ABEND; if (pglob->gl_errfunc) { g_Ctoc(pathbuf, buf); ! if (pglob->gl_errfunc(buf, errno)) return (GLOB_ABEND); } return(0); >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20000521052049.BD73A37B580>