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: 111743 Delivered-To: patch@linaro.org Received: by 10.140.94.166 with SMTP id g35csp3323773qge; Tue, 5 Sep 2017 13:27:03 -0700 (PDT) X-Received: by 10.84.194.131 with SMTP id h3mr5636559pld.202.1504643223093; Tue, 05 Sep 2017 13:27:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1504643223; cv=none; d=google.com; s=arc-20160816; b=holTohaSnsm73n3HWjvVKTbc405YaB+3iORj3DHrBfQKnq0GmlwQ3p1Qjg+n/ywcay UVD9nTHesvELZnDDrUtAK7NrrNSKPu8zGYCdS6/KfQxnQfdSzDQNqE1vPINsCPz5O+V1 H9BCBytiXUmXHinfwhSgTYH1MiE0BEk5TED6/1pW51UKsTOTuH6obIw1LIuveVMkQQcP fqH/ALQwLuXbE9LECn0ywUTXEnWv5kcJuq0AD8p00G5AidjD96xl9lVmDfZ7GpLL80sM J3iS9bS6qVvcTXw2e41TacvXH8Fd+ndzz7fzOEGv69F2hJLR0CbcNHrYptkSZUjYZnMN Jxww== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:delivered-to:sender:list-help :list-post:list-archive:list-subscribe:list-unsubscribe:list-id :precedence:mailing-list:dkim-signature:domainkey-signature :arc-authentication-results; bh=cRQPchhIXMogBPuGPpsjboir3fNQqjdAR5wB7sWk+4I=; b=e7itXM1qu2e1+Ytmn/QNMX0ynbc6KMcofKxu37rePIpEq6gCxAMoGDHfdhi5mFBLI9 UQ0zb2WOqod6PLAqEjV97D2qDieefK/IArYGB6d6eCk4gPus7q8C5eRUCsTo8jf2qCcu +khJa5Ioc0qmV+goMs7RxDn04QktQXT/u1xzBPLk1jflaBdpt4l+1idOXdj7iep64WMp Fz+tqcxnKks4GX+0rF0/0W68DUFi1KSEbMP4ziCDy4vFnW2aH30waYfApvvzovLNm/lC PiGJfRZf650ttf6CiBf01hejsFnpWAT8m3mbB9JM/MCAnyg6V/rWchavlpXtlPzjtKnf evZA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=DFp36rve; spf=pass (google.com: domain of libc-alpha-return-84213-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-84213-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id q13si765143pgn.679.2017.09.05.13.27.02 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 05 Sep 2017 13:27:03 -0700 (PDT) Received-SPF: pass (google.com: domain of libc-alpha-return-84213-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@sourceware.org header.s=default header.b=DFp36rve; spf=pass (google.com: domain of libc-alpha-return-84213-patch=linaro.org@sourceware.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=libc-alpha-return-84213-patch=linaro.org@sourceware.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org 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=AS83+XcSmCLuTbnj305yVqD3cuZKb2OP2Dg0ymqQVor KHHDZlOVduqsC6iVlay2d02GYZZZCksoHwqQ9azr7VRvZyHAG79UcEJIPAYQE0Ix YfN1S8DkymhkSBbS8rlB/Qgl4dLZgDRuKlow7QMskfaNsCBlpMVfiuY7dt+iKrqc = 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=DFp36rveCLDUtpSaB gHT9Az1Jc0cYPjUSFjLKTeDR1TdujQU0dPANNg0V60V32gyksix1WX/Qvji83Vb4 6yety1N2W+n7/UALOVkq16g6uaOtwSMVqR9c843T7UKkgaw+GLzNQSssYM1DTcMy /qCPH8gZ3MVsMJcURoogpWQ45w= 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(-) -- 2.7.4 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 */ }