From patchwork Tue Sep 5 20:25:19 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 810282 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=sourceware.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=libc-alpha-return-84213-incoming=patchwork.ozlabs.org@sourceware.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b="L60WJ9JQ"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3xmytW22Tjz9t2c for ; Wed, 6 Sep 2017 06:26:59 +1000 (AEST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-type:content-transfer-encoding; q=dns; s=default; b=IyVElSMt5ynXeezzvrIpxsQ/zRt552eRLlaNKJr9Vzx mzwbu8m3vbO80MiOJHevgqPoCRnEarw/WNl0f4cxKPrGvQk1XNaTAcqjz3LM7yVz X1ZDMZgNJgvRMJM55C5nNG0yklsKQxBbL0pA7KlydoFU+AD0gU0GgF/u/QGMe/kQ = DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-type:content-transfer-encoding; s=default; bh=K4ZrIniorA0UDyV7WpblIRdAmpk=; b=L60WJ9JQEsmdsGiAN MP82DQFD3WLTZnjcVJH1chFGWkr3+4Mr3BHI6T9uVZNl372qRYY5ToHHAUtkBmM7 cqk6yDzIx5CRe7yD1SQUAsYj3v+LfeIETW1jlbqgQPsKLFmq5rUGjRd3UANErXO2 y+KTL+0NFMKUgGtdfppXgoB/FU= 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-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@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, 5 Sep 2017 17:25:19 -0300 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 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 */ }