From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-oa1-x33.google.com (mail-oa1-x33.google.com [IPv6:2001:4860:4864:20::33]) by sourceware.org (Postfix) with ESMTPS id 7AC8A385840F for ; Thu, 31 Mar 2022 10:56:34 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 7AC8A385840F Received: by mail-oa1-x33.google.com with SMTP id 586e51a60fabf-de3eda6b5dso24981536fac.0 for ; Thu, 31 Mar 2022 03:56:34 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:to:references:from:in-reply-to :content-transfer-encoding; bh=qhQGuljMiA75OpNlXYmuZPOtkp8ezIuDJE2RB4AGLjc=; b=DZhn0/6Pb43TLQc9YEC/UP1mRR4G9ZK4aDBsA6dOUUSPkeMFCshHC/9jM7soQCZkZX VHho0BdVs8U6Ed2XsvkgRv1S53ZbL2l/bIzOBfs45VZY4n5uIV5/cTZK4Lxfk5Vc/Jcd SbQM7BYGMR+Vk0yCy4WIkDg0YboL9kiy3Vl/oJpT9oZV9nctBoJyIZNJfVPhrWebALbj pPtY9l8Tso5ll8o2Ar9MatZubanwzOc3M88rQwrIFKK4V0IIO8SlDPuG2d7rZQGygeGj QjE2G87KlsthwVtiRqVN76CLSpYeUjrN/sHnaILyRRsCgdVkh22m6sKzwbnNqNP9G+3Z 3Q4A== X-Gm-Message-State: AOAM532dkaSVZYTD/cw8P1ZfscH3pHOP5wWwOmkRN3ZYVDaZPRazzyiV 3QQpniaZ2dLItBvwzlh+9r1SKBAGJq3+Cg== X-Google-Smtp-Source: ABdhPJx2/HMXjmpZNcsEEJ5BOrmCdsfUZ1e9kHExbrcWUkx5XkWCANVqOEmZjR77nr4Sl+Y3H0CdsQ== X-Received: by 2002:a05:6870:a788:b0:de:c1c1:ac07 with SMTP id x8-20020a056870a78800b000dec1c1ac07mr2289696oao.68.1648724193143; Thu, 31 Mar 2022 03:56:33 -0700 (PDT) Received: from ?IPV6:2804:431:c7cb:a6c0:4bba:d935:c74c:f625? ([2804:431:c7cb:a6c0:4bba:d935:c74c:f625]) by smtp.gmail.com with ESMTPSA id y7-20020a4a6247000000b00324e9bf46adsm7327048oog.41.2022.03.31.03.56.31 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 31 Mar 2022 03:56:32 -0700 (PDT) Message-ID: Date: Thu, 31 Mar 2022 07:56:29 -0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.7.0 Subject: Re: posix/glob.c: update from gnulib Content-Language: en-US To: DJ Delorie , libc-alpha@sourceware.org References: From: Adhemerval Zanella In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-12.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, NICE_REPLY_A, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 31 Mar 2022 10:56:36 -0000 On 30/03/2022 18:55, DJ Delorie via Libc-alpha wrote: > > Copied from gnulib/lib/glob.c in order to fix rhbz 1982608 > > Used config.h instead of libc-config.h > > The #ifdef around #define dirfd() was changed to #undef due to > conflicts between glibc's internal and external definitions of > dirfd(). This has been reported to gnulib. Could you create a bug report to track this? If I recall correctly from gnulib discussion, this came from an issue with XFS. Would be possible to craft a regression test? > > diff --git a/posix/glob.c b/posix/glob.c > index a2b5aabada..19b876f9f0 100644 > --- a/posix/glob.c > +++ b/posix/glob.c > @@ -28,6 +28,7 @@ > #include > > #include > +#include > #include > #include > #include > @@ -56,6 +57,8 @@ > # define sysconf(id) __sysconf (id) > # define closedir(dir) __closedir (dir) > # define opendir(name) __opendir (name) > +# undef dirfd > +# define dirfd(str) __dirfd (str) > # define readdir(str) __readdir64 (str) > # define getpwnam_r(name, bufp, buf, len, res) \ > __getpwnam_r (name, bufp, buf, len, res) > @@ -69,11 +72,8 @@ > # ifndef GLOB_LSTAT > # define GLOB_LSTAT gl_lstat > # endif > -# ifndef GLOB_STAT64 > -# define GLOB_STAT64 __stat64 > -# endif > -# ifndef GLOB_LSTAT64 > -# define GLOB_LSTAT64 __lstat64 > +# ifndef GLOB_FSTATAT64 > +# define GLOB_FSTATAT64 __fstatat64 > # endif > # include > #else /* !_LIBC */ > @@ -88,8 +88,7 @@ > # define struct_stat struct stat > # define struct_stat64 struct stat > # define GLOB_LSTAT gl_lstat > -# define GLOB_STAT64 stat > -# define GLOB_LSTAT64 lstat > +# define GLOB_FSTATAT64 fstatat > #endif /* _LIBC */ > > #include > @@ -215,7 +214,8 @@ glob_lstat (glob_t *pglob, int flags, const char *fullname) > } ust; > return (__glibc_unlikely (flags & GLOB_ALTDIRFUNC) > ? pglob->GLOB_LSTAT (fullname, &ust.st) > - : GLOB_LSTAT64 (fullname, &ust.st64)); > + : GLOB_FSTATAT64 (AT_FDCWD, fullname, &ust.st64, > + AT_SYMLINK_NOFOLLOW)); > } > > /* Set *R = A + B. Return true if the answer is mathematically > @@ -257,7 +257,8 @@ is_dir (char const *filename, int flags, glob_t const *pglob) > struct_stat64 st64; > return (__glibc_unlikely (flags & GLOB_ALTDIRFUNC) > ? pglob->gl_stat (filename, &st) == 0 && S_ISDIR (st.st_mode) > - : GLOB_STAT64 (filename, &st64) == 0 && S_ISDIR (st64.st_mode)); > + : (GLOB_FSTATAT64 (AT_FDCWD, filename, &st64, 0) == 0 > + && S_ISDIR (st64.st_mode))); > } > > /* Find the end of the sub-pattern in a brace expression. */ > @@ -747,6 +748,8 @@ __glob (const char *pattern, int flags, int (*errfunc) (const char *, int), > else > { > #ifndef WINDOWS32 > + /* Recognize ~user as a shorthand for the specified user's home > + directory. */ > char *end_name = strchr (dirname, '/'); > char *user_name; > int malloc_user_name = 0; > @@ -885,7 +888,22 @@ __glob (const char *pattern, int flags, int (*errfunc) (const char *, int), > } > scratch_buffer_free (&pwtmpbuf); > } > -#endif /* !WINDOWS32 */ > +#else /* WINDOWS32 */ > + /* On native Windows, access to a user's home directory > + (via GetUserProfileDirectory) or to a user's environment > + variables (via ExpandEnvironmentStringsForUser) requires > + the credentials of the user. Therefore we cannot support > + the ~user syntax on this platform. > + Handling ~user specially (and treat it like plain ~) if > + user is getenv ("USERNAME") would not be a good idea, > + since it would make people think that ~user is supported > + in general. */ > + if (flags & GLOB_TILDE_CHECK) > + { > + retval = GLOB_NOMATCH; > + goto out; > + } > +#endif /* WINDOWS32 */ > } > } > > @@ -1266,6 +1284,8 @@ glob_in_dir (const char *pattern, const char *directory, int flags, > { > size_t dirlen = strlen (directory); > void *stream = NULL; > + struct scratch_buffer s; > + scratch_buffer_init (&s); > # define GLOBNAMES_MEMBERS(nnames) \ > struct globnames *next; size_t count; char *name[nnames]; > struct globnames { GLOBNAMES_MEMBERS (FLEXIBLE_ARRAY_MEMBER) }; > @@ -1337,6 +1357,7 @@ glob_in_dir (const char *pattern, const char *directory, int flags, > } > else > { > + int dfd = dirfd (stream); > int fnm_flags = ((!(flags & GLOB_PERIOD) ? FNM_PERIOD : 0) > | ((flags & GLOB_NOESCAPE) ? FNM_NOESCAPE : 0)); > flags |= GLOB_MAGCHAR; > @@ -1364,8 +1385,32 @@ glob_in_dir (const char *pattern, const char *directory, int flags, > if (flags & GLOB_ONLYDIR) > switch (readdir_result_type (d)) > { > - case DT_DIR: case DT_LNK: case DT_UNKNOWN: break; > default: continue; > + case DT_DIR: break; > + case DT_LNK: case DT_UNKNOWN: > + /* The filesystem was too lazy to give us a hint, > + so we have to do it the hard way. */ > + if (__glibc_unlikely (dfd < 0 || flags & GLOB_ALTDIRFUNC)) > + { > + size_t namelen = strlen (d.name); > + size_t need = dirlen + 1 + namelen + 1; > + if (s.length < need > + && !scratch_buffer_set_array_size (&s, need, 1)) > + goto memory_error; > + char *p = mempcpy (s.data, directory, dirlen); > + *p = '/'; > + p += p[-1] != '/'; > + memcpy (p, d.name, namelen + 1); > + if (! is_dir (s.data, flags, pglob)) > + continue; > + } > + else > + { > + struct_stat64 st64; > + if (! (GLOB_FSTATAT64 (dfd, d.name, &st64, 0) == 0 > + && S_ISDIR (st64.st_mode))) > + continue; > + } > } > > if (fnmatch (pattern, d.name, fnm_flags) == 0) > @@ -1497,5 +1542,6 @@ glob_in_dir (const char *pattern, const char *directory, int flags, > __set_errno (save); > } > > + scratch_buffer_free (&s); > return result; > } >