From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 49565 invoked by alias); 5 Sep 2017 20:25:54 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Received: (qmail 49068 invoked by uid 89); 5 Sep 2017 20:25:52 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.4 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,RCVD_IN_DNSWL_NONE,RCVD_IN_SORBS_SPAM,SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-qt0-f177.google.com X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=cRQPchhIXMogBPuGPpsjboir3fNQqjdAR5wB7sWk+4I=; b=hEPxWBoOzudli4JehLA/B7xW10tc39zbi19lxXlNjRkvzBbkO7iuVFduBpFNX2dnsA 0nJ7lkpXDEAMF8oIBFOzBjQQ1yHTwEML2/XB2IL58ynB1bBazQp6RKkbVcUc5yg6zc89 T7hEqVi6e8wewESRrW2Wr/qaNhqEkfr5/RHN9Stoz2w9vsPSyQNmZ7AzJlC2ACjy8MW6 uTx1Lwuvs9je2a9K6tYxO//zdUbzvPWcBwamLKjqEFqnIfEO6DetTV9U/lK1VX2SK789 09tL/8t3AUQiLCaze9l7v52UqfS74ajDRJAtgzffpln8SQwSMRqxsIe6aU/8Mdv9oRzs 4c5w== X-Gm-Message-State: AHPjjUglRqUPdsrYzyCZr3VnbR2tHfO738wp80EXGw8QOALHe9VNGkJ1 AxSxdebvb2cnw+4T5BftoA== X-Google-Smtp-Source: ADKCNb4fcYHioi8FyMqK7yBjGIJXG4RelwrHnM9wOg1aabXkBRJ3/yQXfYIPmHNOXKdLtTIPGp2Usw== X-Received: by 10.200.22.201 with SMTP id y9mr422204qtk.115.1504643142902; Tue, 05 Sep 2017 13:25:42 -0700 (PDT) From: Adhemerval Zanella To: libc-alpha@sourceware.org Cc: Paul Eggert Subject: [PATCH 6/9] posix: fix glob bugs with long login names Date: Tue, 05 Sep 2017 20:25:00 -0000 Message-Id: <1504643122-14874-7-git-send-email-adhemerval.zanella@linaro.org> In-Reply-To: <1504643122-14874-1-git-send-email-adhemerval.zanella@linaro.org> References: <1504643122-14874-1-git-send-email-adhemerval.zanella@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-SW-Source: 2017-09/txt/msg00208.txt.bz2 Current glob implementation allows unlimited user name for home directory construction on GLOB_TILDE case. To accomplish it glob either construct a name on stack if size are small enough (based on current alloca_used) or in heap otherwise. This patch simplifies storage allocation by using the same scratch buffer for both get_rlogin_r and getpwnam_r. This also syncs with gnulib commit 064df0b (glob: fix bugs with long login names). Checked on x86_64-linux-gnu and on a build using build-many-glibcs.py for all major architectures. * posix/glob.c (GET_LOGIN_NAME_MAX): Remove. (glob): Use the same scratch buffer for both getlogin_r and getpwnam_r. Don’t require preallocation of the login name. This simplifies storage allocation, and corrects the handling of long login names. --- ChangeLog | 7 +++++ posix/glob.c | 88 +++++++++++++++++++++--------------------------------------- 2 files changed, 37 insertions(+), 58 deletions(-) diff --git a/posix/glob.c b/posix/glob.c index 340cf08..2c8a3dc 100644 --- a/posix/glob.c +++ b/posix/glob.c @@ -75,12 +75,6 @@ #include #include #include - -#ifdef _SC_LOGIN_NAME_MAX -# define GET_LOGIN_NAME_MAX() sysconf (_SC_LOGIN_NAME_MAX) -#else -# define GET_LOGIN_NAME_MAX() (-1) -#endif static const char *next_brace_sub (const char *begin, int flags) __THROWNL; @@ -611,67 +605,45 @@ glob (const char *pattern, int flags, int (*errfunc) (const char *, int), else home_dir = "c:/users/default"; /* poor default */ #else - int success; - char *name; - int malloc_name = 0; - size_t buflen = GET_LOGIN_NAME_MAX () + 1; - - if (buflen == 0) - /* 'sysconf' does not support _SC_LOGIN_NAME_MAX. Try - a moderate value. */ - buflen = 20; - if (glob_use_alloca (alloca_used, buflen)) - name = alloca_account (buflen, alloca_used); - else + int err; + struct passwd *p; + struct passwd pwbuf; + struct scratch_buffer s; + scratch_buffer_init (&s); + while (true) { - name = malloc (buflen); - if (name == NULL) + p = NULL; + err = __getlogin_r (s.data, s.length); + if (err == 0) { - retval = GLOB_NOSPACE; - goto out; - } - malloc_name = 1; - } - - success = __getlogin_r (name, buflen) == 0; - if (success) - { - struct passwd *p; - struct scratch_buffer pwtmpbuf; - scratch_buffer_init (&pwtmpbuf); # if defined HAVE_GETPWNAM_R || defined _LIBC - struct passwd pwbuf; - - while (getpwnam_r (name, &pwbuf, - pwtmpbuf.data, pwtmpbuf.length, &p) - == ERANGE) - { - if (!scratch_buffer_grow (&pwtmpbuf)) - { - retval = GLOB_NOSPACE; - goto out; - } - } + size_t ssize = strlen (s.data) + 1; + err = getpwnam_r (s.data, &pwbuf, s.data + ssize, + s.length - ssize, &p); # else - p = getpwnam (name); + p = getpwnam (s.data); + if (p == NULL) + err = errno; # endif - if (p != NULL) + } + if (err != ERANGE) + break; + if (!scratch_buffer_grow (&s)) { - home_dir = strdup (p->pw_dir); - malloc_home_dir = 1; - if (home_dir == NULL) - { - scratch_buffer_free (&pwtmpbuf); - retval = GLOB_NOSPACE; - goto out; - } + retval = GLOB_NOSPACE; + goto out; } - scratch_buffer_free (&pwtmpbuf); } - else + if (err == 0) + { + home_dir = strdup (p->pw_dir); + malloc_home_dir = 1; + } + scratch_buffer_free (&s); + if (err == 0 && home_dir == NULL) { - if (__glibc_unlikely (malloc_name)) - free (name); + retval = GLOB_NOSPACE; + goto out; } #endif /* WINDOWS32 */ } -- 2.7.4