From patchwork Thu Apr 29 15:32:01 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Han-Wen Nienhuys X-Patchwork-Id: 12231493 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 51478C43460 for ; Thu, 29 Apr 2021 15:32:15 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 20C246141E for ; Thu, 29 Apr 2021 15:32:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240450AbhD2PdB (ORCPT ); Thu, 29 Apr 2021 11:33:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54614 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233420AbhD2PdA (ORCPT ); Thu, 29 Apr 2021 11:33:00 -0400 Received: from mail-wr1-x42a.google.com (mail-wr1-x42a.google.com [IPv6:2a00:1450:4864:20::42a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 3EBF7C06138B for ; Thu, 29 Apr 2021 08:32:12 -0700 (PDT) Received: by mail-wr1-x42a.google.com with SMTP id l2so15063354wrm.9 for ; Thu, 29 Apr 2021 08:32:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:in-reply-to:references:from:date:subject:mime-version :content-transfer-encoding:fcc:to:cc; bh=he8jYxd5pGLBa9SivbXsw4UrQ8VucJjI2q2qnfYUPoo=; b=GW/XSjxL3GabwY8Fus41+y+4i5I1p1E9lql3OJ0CsRygfJhCE3WmpT/msUdIIBZFby rlRQYzminhVGe79SXN361UJUqcCWkYjIFq4C72wZkNLZy/lcyM1lmCTYFENcCEtQv9tX JmijlVotk3m8FfEKydDZXmhVB7n31kAPk/OUD1yOr+NG0b2TOtlrUZR+Gzkr3IoN0vkS nfI4gM+Qf28ZNgf/fwwOWlqYi2y8bi8gdQkmr769tHXUPokdaTZ6DvuXkPupoDeN2gWU v9w+669kf3p531wwE0l3QgrmAfmTiChO9q/k70I5w+DjRVGGuVg6u4NRzgL8VGNCVrZb aVbg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:mime-version:content-transfer-encoding:fcc:to:cc; bh=he8jYxd5pGLBa9SivbXsw4UrQ8VucJjI2q2qnfYUPoo=; b=Mn/g7apWcBRfmq79iZSGE57evAGmh1ic13xoVfsYYcHqUi5tnf5BTyVJ773wDRaVnO LkCnxLOj44u2bpsjLpIJYGjBC7fvLtJcOie9aVzYegaZHU/EFaF21hnLxGlH6KwfWH/N 6ecOKqAvURbieEP/mWa6lhQzsL2+ClyO8Ox5EVHs/OMk687Qflc5w/KIQ/YWm+OsW0kx 4oS181QWUrzApE1p4DinYMOTmXoE7m9eU1RRJY1iIes2TinVXX4pP9NYlfdaioqozEoh 2BMF4GRnLJ2mxRyTr1uuV4bLpdOqRSKe8xsLo7jd73YeySB1PZevxOO8LUv9KOZkTwKn IzVg== X-Gm-Message-State: AOAM530uOuzFfcQnzfse5X16dJLdUccFHgwRcBF1AaIYwpAVnGNVXHLw PHL9XWl6CVqRDORzBvPWmkHfWVoYOd0= X-Google-Smtp-Source: ABdhPJwbY+VH5IiUUYliS+o30K/bUmjOdY3F0k1YtujR2hvEsyuqELsOe9FE0NdHu3FcTvAYkZy9MA== X-Received: by 2002:a05:6000:1561:: with SMTP id 1mr472816wrz.72.1619710331058; Thu, 29 Apr 2021 08:32:11 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id q19sm11030856wmc.44.2021.04.29.08.32.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Apr 2021 08:32:10 -0700 (PDT) Message-Id: <7e8181e77d409af7595e357ad233b7781e026b78.1619710329.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Thu, 29 Apr 2021 15:32:01 +0000 Subject: [PATCH 1/8] refs: remove EINVAL specification from the errno sideband in read_raw_ref_fn MIME-Version: 1.0 Fcc: Sent To: git@vger.kernel.org Cc: Han-Wen Nienhuys , Han-Wen Nienhuys Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Han-Wen Nienhuys From: Han-Wen Nienhuys A grep for EINVAL */*c reveals that no code inspects EINVAL after reading references. The files ref backend does use EINVAL so parse_loose_ref_contents() can communicate to lock_raw_ref() about garbage following the hex SHA1, or a short read in files_read_raw_ref(), but the files backend does not call into refs_read_raw_ref(), so its EINVAL sideband error is unused. As the errno sideband is unintuitive and error-prone, remove EINVAL value, as a step towards getting rid of the errno sideband altogether. Spotted by Ævar Arnfjörð Bjarmason . Signed-off-by: Han-Wen Nienhuys --- refs/refs-internal.h | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/refs/refs-internal.h b/refs/refs-internal.h index 467f4b3c936d..29728a339fed 100644 --- a/refs/refs-internal.h +++ b/refs/refs-internal.h @@ -617,11 +617,10 @@ typedef int reflog_expire_fn(struct ref_store *ref_store, * properly-formatted or even safe reference name. NEITHER INPUT NOR * OUTPUT REFERENCE NAMES ARE VALIDATED WITHIN THIS FUNCTION. * - * Return 0 on success. If the ref doesn't exist, set errno to ENOENT - * and return -1. If the ref exists but is neither a symbolic ref nor - * an object ID, it is broken; set REF_ISBROKEN in type, set errno to - * EINVAL, and return -1. If there is another error reading the ref, - * set errno appropriately and return -1. + * Return 0 on success. If the ref doesn't exist, set errno to ENOENT and return + * -1. If the ref exists but is neither a symbolic ref nor an object ID, it is + * broken; set REF_ISBROKEN in type, and return -1. If there is another error + * reading the ref, set errno appropriately and return -1. * * Backend-specific flags might be set in type as well, regardless of * outcome. From patchwork Thu Apr 29 15:32:02 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Han-Wen Nienhuys X-Patchwork-Id: 12231495 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B2E01C433B4 for ; Thu, 29 Apr 2021 15:32:16 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7AF686141E for ; Thu, 29 Apr 2021 15:32:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240603AbhD2PdB (ORCPT ); Thu, 29 Apr 2021 11:33:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54624 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234590AbhD2PdA (ORCPT ); Thu, 29 Apr 2021 11:33:00 -0400 Received: from mail-wr1-x42a.google.com (mail-wr1-x42a.google.com [IPv6:2a00:1450:4864:20::42a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D8DC3C06138C for ; Thu, 29 Apr 2021 08:32:12 -0700 (PDT) Received: by mail-wr1-x42a.google.com with SMTP id h4so58326575wrt.12 for ; Thu, 29 Apr 2021 08:32:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=dAjq7gpUAKf+nhWN3RaxzK79Jrd7riKdpJvlhkjm5+k=; b=gH/+OlwVSZ2bxMcvQv7424w6GAjswnpuGix9kPLxxmtRzkEKiqOXCCioilID2ad69n NnXdtYubl4yoRNP0VyoIuOqNro+TBmGkYgI9U+99Eh1B77ZcbKiqXkbGEZ/NZ9jI5njR yTdxR1HfjUHXYIg/Q8OPcoMIFCojKOHMznYwkhqTipIS3qoIQUIrf3ns5rppsdZ4Y+sA 5zlp3UwOnFJ6er9AwotIK6nVK56yWiiXm/ac5bdgRspSHMTf7jJ689a2P1HCDzXUEkVL kUIQ+yY1bhUBa4lzjbDLUYZXNFNTLxMBZYPdecbeSna7CGGD/tRtXLXAwj/9X/Z6e+Q4 PI3g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=dAjq7gpUAKf+nhWN3RaxzK79Jrd7riKdpJvlhkjm5+k=; b=C5sWeXLd+3ECm1tPzf1Uhk393oXQ58WYq7D7mTJKDmwniqxd839utCWjk7fffeSTAR 350lgctO3T0zr8dedHi6cZgJuzfGVXHaTZ138ShBRDEBWNbo+deoFmwPTy8KLK/+tQ8X VY8htAEBJVJvWmZRHOqf/9OMJ/krwuuQOBabrNIILwHpVS5D/iDTwHYGR+qQRylqCNZr PAP7rFSdar5QrkQXGEJmO/o1qIoaWgncLAwLlR/swSU79IAeH6RLPpKz6ZG0fLl6oq9s 43wPzOPbaNwf3tC0eSoH7GRKhZfgoKBoN8i15EOaWP90Ufz8WS4UkhSZRp6Y3hZ/uylr rUYg== X-Gm-Message-State: AOAM531JjoRh6dvBh7T7ogxWlpF3jsXSOdMt4+CscJlk87xOlw+TN6MX fS8IpMm+UYwbZuEgHTbNNNV4nGRaeT0= X-Google-Smtp-Source: ABdhPJzkh1k6KRNpcDHgL/1/SsAhCwHzzYSDLMQ/Gt3VwLCz7Cj+YYOllWaQJzIoEx0vODhDTntuHQ== X-Received: by 2002:a05:6000:1843:: with SMTP id c3mr368437wri.361.1619710331646; Thu, 29 Apr 2021 08:32:11 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id t7sm5447099wrw.60.2021.04.29.08.32.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Apr 2021 08:32:11 -0700 (PDT) Message-Id: In-Reply-To: References: Date: Thu, 29 Apr 2021 15:32:02 +0000 Subject: [PATCH 2/8] refs/files-backend: stop setting errno from lock_ref_oid_basic Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Han-Wen Nienhuys , Han-Wen Nienhuys Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Han-Wen Nienhuys From: Han-Wen Nienhuys Errno is a global variable written by almost all system calls, and therefore it is hard to reason about its state. It's also useless for user-visible errors, as it leaves no place to report the offending file and/or syscall. For the copy/rename support, calls to lock_ref_oid_basic() in this file are followed by: * lock_ref_oid_basic (copy/rename rollback error path) * write_ref_to_lockfile (both in the rollback path and the success path of copy/rename) These calls do not inspect the incoming errno. As they perform I/O, they can clobber errno. For this reason, callers cannot reliably observe the errno that lock_ref_oid_basic() generated, so it is unsound for programmatic use. For files_create_symref() and files_reflog_expire(), grepping over callers showed no callers inspecting errno. Signed-off-by: Han-Wen Nienhuys --- refs/files-backend.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/refs/files-backend.c b/refs/files-backend.c index 119972ee16f8..c9511da1d387 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -910,7 +910,6 @@ static int create_reflock(const char *path, void *cb) /* * Locks a ref returning the lock on success and NULL on failure. - * On failure errno is set to something meaningful. */ static struct ref_lock *lock_ref_oid_basic(struct files_ref_store *refs, const char *refname, @@ -922,7 +921,6 @@ static struct ref_lock *lock_ref_oid_basic(struct files_ref_store *refs, { struct strbuf ref_file = STRBUF_INIT; struct ref_lock *lock; - int last_errno = 0; int mustexist = (old_oid && !is_null_oid(old_oid)); int resolve_flags = RESOLVE_REF_NO_RECURSE; int resolved; @@ -949,7 +947,6 @@ static struct ref_lock *lock_ref_oid_basic(struct files_ref_store *refs, * to remain. */ if (remove_empty_directories(&ref_file)) { - last_errno = errno; if (!refs_verify_refname_available( &refs->base, refname, extras, skip, err)) @@ -962,7 +959,7 @@ static struct ref_lock *lock_ref_oid_basic(struct files_ref_store *refs, &lock->old_oid, type); } if (!resolved) { - last_errno = errno; + int last_errno = errno; if (last_errno != ENOTDIR || !refs_verify_refname_available(&refs->base, refname, extras, skip, err)) @@ -981,20 +978,17 @@ static struct ref_lock *lock_ref_oid_basic(struct files_ref_store *refs, if (is_null_oid(&lock->old_oid) && refs_verify_refname_available(refs->packed_ref_store, refname, extras, skip, err)) { - last_errno = ENOTDIR; goto error_return; } lock->ref_name = xstrdup(refname); if (raceproof_create_file(ref_file.buf, create_reflock, &lock->lk)) { - last_errno = errno; unable_to_lock_message(ref_file.buf, errno, err); goto error_return; } if (verify_lock(&refs->base, lock, old_oid, mustexist, err)) { - last_errno = errno; goto error_return; } goto out; @@ -1005,7 +999,6 @@ static struct ref_lock *lock_ref_oid_basic(struct files_ref_store *refs, out: strbuf_release(&ref_file); - errno = last_errno; return lock; } From patchwork Thu Apr 29 15:32:03 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Han-Wen Nienhuys X-Patchwork-Id: 12231501 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 94FE0C433ED for ; Thu, 29 Apr 2021 15:32:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 60D906141E for ; Thu, 29 Apr 2021 15:32:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240704AbhD2PdF (ORCPT ); Thu, 29 Apr 2021 11:33:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54634 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240633AbhD2PdC (ORCPT ); Thu, 29 Apr 2021 11:33:02 -0400 Received: from mail-wm1-x32c.google.com (mail-wm1-x32c.google.com [IPv6:2a00:1450:4864:20::32c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 9CB26C06138B for ; Thu, 29 Apr 2021 08:32:14 -0700 (PDT) Received: by mail-wm1-x32c.google.com with SMTP id 4-20020a05600c26c4b0290146e1feccd8so461347wmv.1 for ; Thu, 29 Apr 2021 08:32:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=vFNPC/ar/55c7fYck2p9D0HsDvz0YDdC5jhUU2AIqrk=; b=WEHGhaDKaDrar2gpEZFwkx/ElSBsgD2C1XBgKFuzkg2+tD2PKzsiL3RiZnuPedfdhG VXiV6HS+9qF4VYe0h6oiBRlKB/hJFl0x61p10fqF8hT3HQW3mXov5WateuUckTqy8UGP Oz4C2m07UKOTbm3ujgT0CshKU9VEZQYpvaVcNlRXd6L+PNqfPuXAsQIhwkKDBE67nAFx C7MYUg1+KAcIu9VuBfpsHqEyNilSY1Wx6E01NuGABIL99LiOWmN6Lyn7WIJSGmkQI6T9 HH6qx0mCsKOCeG9HVuwfPikIhWP9LBjJ25mbASA3OgL7ePRHHz/L5B6eA51PnAQloqR9 sohg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=vFNPC/ar/55c7fYck2p9D0HsDvz0YDdC5jhUU2AIqrk=; b=m7zQFd594fXfjyFDWfc5VmRhNFamxZMnQXc1UIVV81bG8DXmUo2OEyFEPLRneaen93 7UMwjYgh8i+BF6HrsXP1SagC8iHvK9nVAZv6a6ZEDpKrD4GTyYyXVF/JtGarsNOrYCSF OIza5/hdRsKhe+h/SCm4dEuWyPI2Zaliat2LmUd4fQ0tSClspxucf5RvUBAG/Y2dWDcE GR+2hwgCrk9WhYLJ6sU95U12J6YFQahMQaE9/gaWbORZOY0JjQY9sqnC0Uj/rF4Xrq6g bi45R+T4vNe3YLNpGwYGmOxBlPizReXxQoQYx35QyFBxRKPZIOXrkul41vPoMaJ72Vh2 X1wA== X-Gm-Message-State: AOAM531rz12/I1d2UpWzX1p1mICuKNoajw7NN4FYwn4Jsrd+5AQYfjvf +GeahSB2I8se9K6/+eB/++Fl/IMu+34= X-Google-Smtp-Source: ABdhPJw7GpkBYKZnUp04QvqIm5SWqYnvXZNBWkrh8Y6/wiwe8bOt2zMDy24/sCInUhB91XcpcMVWmw== X-Received: by 2002:a7b:c248:: with SMTP id b8mr11445548wmj.150.1619710332238; Thu, 29 Apr 2021 08:32:12 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id n8sm10026449wmq.12.2021.04.29.08.32.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Apr 2021 08:32:11 -0700 (PDT) Message-Id: In-Reply-To: References: Date: Thu, 29 Apr 2021 15:32:03 +0000 Subject: [PATCH 3/8] refs: make errno output explicit for read_raw_ref_fn Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Han-Wen Nienhuys , Han-Wen Nienhuys Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Han-Wen Nienhuys From: Han-Wen Nienhuys read_raw_ref_fn needs to supply a credible errno for a number of cases. These are primarily: 1) The files backend calls read_raw_ref from lock_raw_ref, and uses the resulting error codes to create/remove directories as needed. 2) ENOENT should be translated in a zero OID, optionally with REF_ISBROKEN set, returning the last successfully resolved symref. This is necessary so read_raw_ref("HEAD") on an empty repo returns refs/heads/main (or the default branch du-jour), and we know on which branch to create the first commit. Make this information flow explicit by adding a failure_errno to the signature of read_raw_ref. All errnos from the files backend are still propagated unchanged, even though inspection suggests only ENOTDIR, EISDIR and ENOENT are relevant. Signed-off-by: Han-Wen Nienhuys --- refs.c | 7 +++++-- refs/debug.c | 4 ++-- refs/files-backend.c | 24 ++++++++++++------------ refs/packed-backend.c | 8 ++++---- refs/refs-internal.h | 16 +++++++++------- 5 files changed, 32 insertions(+), 27 deletions(-) diff --git a/refs.c b/refs.c index 261fd82beb98..43e2ad6b612a 100644 --- a/refs.c +++ b/refs.c @@ -1675,13 +1675,16 @@ int refs_read_raw_ref(struct ref_store *ref_store, const char *refname, struct object_id *oid, struct strbuf *referent, unsigned int *type) { + int result, failure; if (!strcmp(refname, "FETCH_HEAD") || !strcmp(refname, "MERGE_HEAD")) { return refs_read_special_head(ref_store, refname, oid, referent, type); } - return ref_store->be->read_raw_ref(ref_store, refname, oid, referent, - type); + result = ref_store->be->read_raw_ref(ref_store, refname, oid, referent, + type, &failure); + errno = failure; + return result; } /* This function needs to return a meaningful errno on failure */ diff --git a/refs/debug.c b/refs/debug.c index 922e64fa6ad9..887dbb14be6e 100644 --- a/refs/debug.c +++ b/refs/debug.c @@ -238,14 +238,14 @@ debug_ref_iterator_begin(struct ref_store *ref_store, const char *prefix, static int debug_read_raw_ref(struct ref_store *ref_store, const char *refname, struct object_id *oid, struct strbuf *referent, - unsigned int *type) + unsigned int *type, int *failure_errno) { struct debug_ref_store *drefs = (struct debug_ref_store *)ref_store; int res = 0; oidcpy(oid, &null_oid); res = drefs->refs->be->read_raw_ref(drefs->refs, refname, oid, referent, - type); + type, failure_errno); if (res == 0) { trace_printf_key(&trace_refs, "read_raw_ref: %s: %s (=> %s) type %x: %d\n", diff --git a/refs/files-backend.c b/refs/files-backend.c index c9511da1d387..efe493ca1425 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -341,9 +341,9 @@ static struct ref_cache *get_loose_ref_cache(struct files_ref_store *refs) return refs->loose; } -static int files_read_raw_ref(struct ref_store *ref_store, - const char *refname, struct object_id *oid, - struct strbuf *referent, unsigned int *type) +static int files_read_raw_ref(struct ref_store *ref_store, const char *refname, + struct object_id *oid, struct strbuf *referent, + unsigned int *type, int *failure_errno) { struct files_ref_store *refs = files_downcast(ref_store, REF_STORE_READ, "read_raw_ref"); @@ -354,7 +354,6 @@ static int files_read_raw_ref(struct ref_store *ref_store, struct stat st; int fd; int ret = -1; - int save_errno; int remaining_retries = 3; *type = 0; @@ -459,10 +458,10 @@ static int files_read_raw_ref(struct ref_store *ref_store, ret = parse_loose_ref_contents(buf, oid, referent, type); out: - save_errno = errno; + if (failure_errno) + *failure_errno = errno; strbuf_release(&sb_path); strbuf_release(&sb_contents); - errno = save_errno; return ret; } @@ -541,6 +540,7 @@ static int lock_raw_ref(struct files_ref_store *refs, struct strbuf ref_file = STRBUF_INIT; int attempts_remaining = 3; int ret = TRANSACTION_GENERIC_ERROR; + int failure_errno = 0; assert(err); files_assert_main_repository(refs, "lock_raw_ref"); @@ -629,9 +629,9 @@ static int lock_raw_ref(struct files_ref_store *refs, * fear that its value will change. */ - if (files_read_raw_ref(&refs->base, refname, - &lock->old_oid, referent, type)) { - if (errno == ENOENT) { + if (files_read_raw_ref(&refs->base, refname, &lock->old_oid, referent, + type, &failure_errno)) { + if (failure_errno == ENOENT) { if (mustexist) { /* Garden variety missing reference. */ strbuf_addf(err, "unable to resolve reference '%s'", @@ -655,7 +655,7 @@ static int lock_raw_ref(struct files_ref_store *refs, * reference named "refs/foo/bar/baz". */ } - } else if (errno == EISDIR) { + } else if (failure_errno == EISDIR) { /* * There is a directory in the way. It might have * contained references that have been deleted. If @@ -693,13 +693,13 @@ static int lock_raw_ref(struct files_ref_store *refs, goto error_return; } } - } else if (errno == EINVAL && (*type & REF_ISBROKEN)) { + } else if (failure_errno == EINVAL && (*type & REF_ISBROKEN)) { strbuf_addf(err, "unable to resolve reference '%s': " "reference broken", refname); goto error_return; } else { strbuf_addf(err, "unable to resolve reference '%s': %s", - refname, strerror(errno)); + refname, strerror(failure_errno)); goto error_return; } diff --git a/refs/packed-backend.c b/refs/packed-backend.c index dfecdbc1db60..a457f18e93c8 100644 --- a/refs/packed-backend.c +++ b/refs/packed-backend.c @@ -724,9 +724,9 @@ static struct snapshot *get_snapshot(struct packed_ref_store *refs) return refs->snapshot; } -static int packed_read_raw_ref(struct ref_store *ref_store, - const char *refname, struct object_id *oid, - struct strbuf *referent, unsigned int *type) +static int packed_read_raw_ref(struct ref_store *ref_store, const char *refname, + struct object_id *oid, struct strbuf *referent, + unsigned int *type, int *failure_errno) { struct packed_ref_store *refs = packed_downcast(ref_store, REF_STORE_READ, "read_raw_ref"); @@ -739,7 +739,7 @@ static int packed_read_raw_ref(struct ref_store *ref_store, if (!rec) { /* refname is not a packed reference. */ - errno = ENOENT; + *failure_errno = ENOENT; return -1; } diff --git a/refs/refs-internal.h b/refs/refs-internal.h index 29728a339fed..ac8a14086724 100644 --- a/refs/refs-internal.h +++ b/refs/refs-internal.h @@ -617,10 +617,12 @@ typedef int reflog_expire_fn(struct ref_store *ref_store, * properly-formatted or even safe reference name. NEITHER INPUT NOR * OUTPUT REFERENCE NAMES ARE VALIDATED WITHIN THIS FUNCTION. * - * Return 0 on success. If the ref doesn't exist, set errno to ENOENT and return - * -1. If the ref exists but is neither a symbolic ref nor an object ID, it is - * broken; set REF_ISBROKEN in type, and return -1. If there is another error - * reading the ref, set errno appropriately and return -1. + * Return 0 on success. If the ref doesn't exist, set failure_errno to ENOENT + * and return -1. If the ref exists but is neither a symbolic ref nor an object + * ID, it is broken; set REF_ISBROKEN in type, and return -1. For the files + * backend, EISDIR and ENOTDIR may be set if the ref name is a directory. If + * there is another error reading the ref, set failure_errno appropriately and + * return -1. * * Backend-specific flags might be set in type as well, regardless of * outcome. @@ -634,9 +636,9 @@ typedef int reflog_expire_fn(struct ref_store *ref_store, * - in all other cases, referent will be untouched, and therefore * refname will still be valid and unchanged. */ -typedef int read_raw_ref_fn(struct ref_store *ref_store, - const char *refname, struct object_id *oid, - struct strbuf *referent, unsigned int *type); +typedef int read_raw_ref_fn(struct ref_store *ref_store, const char *refname, + struct object_id *oid, struct strbuf *referent, + unsigned int *type, int *failure_errno); struct ref_storage_be { struct ref_storage_be *next; From patchwork Thu Apr 29 15:32:04 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Han-Wen Nienhuys X-Patchwork-Id: 12231497 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2E576C43460 for ; Thu, 29 Apr 2021 15:32:18 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E516261441 for ; Thu, 29 Apr 2021 15:32:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240709AbhD2PdD (ORCPT ); Thu, 29 Apr 2021 11:33:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54626 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234590AbhD2PdC (ORCPT ); Thu, 29 Apr 2021 11:33:02 -0400 Received: from mail-wm1-x32b.google.com (mail-wm1-x32b.google.com [IPv6:2a00:1450:4864:20::32b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 198B2C06138D for ; Thu, 29 Apr 2021 08:32:14 -0700 (PDT) Received: by mail-wm1-x32b.google.com with SMTP id i21-20020a05600c3555b029012eae2af5d4so11622153wmq.4 for ; Thu, 29 Apr 2021 08:32:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=motWb7AgM+z4fa0xx8tlWVIZx2sxIv6Xxt1snpqK8b0=; b=O5Oa6HB00lk1yF+4dgb9r/kH4saEK+iJKt0s9fDnk4WCCHKEw70DUl6st9zLHoDzHb vbVjDLRod7KYAzNwKie4198egZ7txWjxJYgXBbUkSYWKbevOID/8sO1TZgPpfRukcJg0 O+SW8rhIYQMOuhU0EXsmPUsogmcCaJcRwn6f1ZCg48unkryrpmnkc46q3muMRmmcqYBF qRrERzpyarKwQtB5ysgjWylAEUsGfEUrvjGwipi5nitdjuLLpaqXLFl9LNkwoAsNw36q FA1dKHBdM/ZruMroCd4bqpfGo+7nciksKHU8LMaz8IQKn69iN3gM8fqYPXf1sr6InaOV im0w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=motWb7AgM+z4fa0xx8tlWVIZx2sxIv6Xxt1snpqK8b0=; b=bGbP4RysSG3izNAsDWluZ+Bo2LQzIn+OX8PnYW0sgdAfb66UNbwgpo/cI3M/oQ1hxq YH2MTX0bfk+C5h2IVRSHttqfL3XxgwwL3oIk4jXCs8+ly1vWVhv+HaFhQ7RlQKh/059g hoNl1WiZc5E0gIPMofpQ7CJhlQKN4MEYqJKy1krFeP1kWFRjvOuDTSc3VS70/xYg+QkU IJSncX7Vv3BvHux7YozTul8Qn9zmpddiFz04OtZK4ri290rVfLITPfMhTc7RSrUDC4CA PTFsNv+KhAyOahIrZpOqM9+fK1GbSrTO9VUsGMS0Qasew32lTvRckajXtw73SrB1eEm3 g/6g== X-Gm-Message-State: AOAM533xylScF0mlihndbNcvls92xoM/glKvin171nXZu4Q4EkfnSJfW KY3H3NfEkC92cZcNrQFm9ySvmQhKwUI= X-Google-Smtp-Source: ABdhPJzGKWqhJ3wmOguIvAEq5WZNx8FveNzvJZpICHg9FCyIF3ZoUtl3PK+CDmFIfCWhTN+PmauErw== X-Received: by 2002:a7b:c017:: with SMTP id c23mr10902207wmb.175.1619710332909; Thu, 29 Apr 2021 08:32:12 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id b8sm5708629wrx.15.2021.04.29.08.32.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Apr 2021 08:32:12 -0700 (PDT) Message-Id: In-Reply-To: References: Date: Thu, 29 Apr 2021 15:32:04 +0000 Subject: [PATCH 4/8] refs: make errno output explicit for refs_resolve_ref_unsafe Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Han-Wen Nienhuys , Han-Wen Nienhuys Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Han-Wen Nienhuys From: Han-Wen Nienhuys This introduces refs_resolve_ref_unsafe_with_errno(), which makes the API contract for the errno output explicit. The implementation still relies on the global errno variable to ensure no side effects. Signed-off-by: Han-Wen Nienhuys --- refs.c | 12 ++++++++++++ refs.h | 1 + refs/files-backend.c | 19 ++++++++++--------- refs/refs-internal.h | 8 ++++++++ 4 files changed, 31 insertions(+), 9 deletions(-) diff --git a/refs.c b/refs.c index 43e2ad6b612a..e8ce88040b3e 100644 --- a/refs.c +++ b/refs.c @@ -1780,6 +1780,18 @@ const char *refs_resolve_ref_unsafe(struct ref_store *refs, return NULL; } +const char *refs_resolve_ref_unsafe_with_errno(struct ref_store *refs, + const char *refname, + int resolve_flags, + struct object_id *oid, + int *flags, int *failure_errno) +{ + const char *result = refs_resolve_ref_unsafe(refs, refname, + resolve_flags, oid, flags); + *failure_errno = errno; + return result; +} + /* backend functions */ int refs_init_db(struct strbuf *err) { diff --git a/refs.h b/refs.h index 48970dfc7e0f..ede405ac3874 100644 --- a/refs.h +++ b/refs.h @@ -68,6 +68,7 @@ const char *refs_resolve_ref_unsafe(struct ref_store *refs, int resolve_flags, struct object_id *oid, int *flags); + const char *resolve_ref_unsafe(const char *refname, int resolve_flags, struct object_id *oid, int *flags); diff --git a/refs/files-backend.c b/refs/files-backend.c index efe493ca1425..3ab09871db5e 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -924,6 +924,7 @@ static struct ref_lock *lock_ref_oid_basic(struct files_ref_store *refs, int mustexist = (old_oid && !is_null_oid(old_oid)); int resolve_flags = RESOLVE_REF_NO_RECURSE; int resolved; + int resolve_errno; files_assert_main_repository(refs, "lock_ref_oid_basic"); assert(err); @@ -936,10 +937,11 @@ static struct ref_lock *lock_ref_oid_basic(struct files_ref_store *refs, resolve_flags |= RESOLVE_REF_ALLOW_BAD_NAME; files_ref_path(refs, &ref_file, refname); - resolved = !!refs_resolve_ref_unsafe(&refs->base, - refname, resolve_flags, - &lock->old_oid, type); - if (!resolved && errno == EISDIR) { + resolved = !!refs_resolve_ref_unsafe_with_errno(&refs->base, refname, + resolve_flags, + &lock->old_oid, type, + &resolve_errno); + if (!resolved && resolve_errno == EISDIR) { /* * we are trying to lock foo but we used to * have foo/bar which now does not exist; @@ -959,12 +961,11 @@ static struct ref_lock *lock_ref_oid_basic(struct files_ref_store *refs, &lock->old_oid, type); } if (!resolved) { - int last_errno = errno; - if (last_errno != ENOTDIR || - !refs_verify_refname_available(&refs->base, refname, - extras, skip, err)) + if (resolve_errno != ENOTDIR || + !refs_verify_refname_available(&refs->base, refname, extras, + skip, err)) strbuf_addf(err, "unable to resolve reference '%s': %s", - refname, strerror(last_errno)); + refname, strerror(resolve_errno)); goto error_return; } diff --git a/refs/refs-internal.h b/refs/refs-internal.h index ac8a14086724..b9f713b5acd6 100644 --- a/refs/refs-internal.h +++ b/refs/refs-internal.h @@ -153,6 +153,14 @@ int refs_read_raw_ref(struct ref_store *ref_store, const char *refname, struct object_id *oid, struct strbuf *referent, unsigned int *type); +/* Like refs_resolve_ref_unsafe, but provide access to errno code that lead to a + * failure. */ +const char *refs_resolve_ref_unsafe_with_errno(struct ref_store *refs, + const char *refname, + int resolve_flags, + struct object_id *oid, + int *flags, int *failure_errno); + /* * Write an error to `err` and return a nonzero value iff the same * refname appears multiple times in `refnames`. `refnames` must be From patchwork Thu Apr 29 15:32:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Han-Wen Nienhuys X-Patchwork-Id: 12231499 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1197FC43461 for ; Thu, 29 Apr 2021 15:32:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D8E2A6141E for ; Thu, 29 Apr 2021 15:32:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240732AbhD2PdE (ORCPT ); Thu, 29 Apr 2021 11:33:04 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54636 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240635AbhD2PdC (ORCPT ); Thu, 29 Apr 2021 11:33:02 -0400 Received: from mail-wm1-x32c.google.com (mail-wm1-x32c.google.com [IPv6:2a00:1450:4864:20::32c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id AEEF4C06138C for ; Thu, 29 Apr 2021 08:32:14 -0700 (PDT) Received: by mail-wm1-x32c.google.com with SMTP id n4-20020a05600c4f84b029013151278decso11071229wmq.4 for ; Thu, 29 Apr 2021 08:32:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=B6vPGYhE7WWblxVkaqP7vVomN4+41Wr1mC37zr4MI5Y=; b=TKnMI5QssviebKz9WXpDFxzCDZ1ytlsgxFuIBSu7p9zlnFCfYyXYRURGfsNBl2siUt U2HmBXpG9FGD2f3ZBPHRLtlHw2lneJ5xYeHqUcu6U4GDs4KqAiHW//IX7qkCNuZpITie bh9g3ZC/SxNS5CH/QtSs9MTPcT5V35Y+VzDiKm3Z6AdLKxqGMks45B5LXMvhahpC5K+t Y3wQNfguinv7v39ODhVHsHAY0Oo3Jbucp8dlKlCDvLv8sRqZl79J7hdtc7bxNOwyjRpH vNCmJ/AoYDIvb4RdaMnrYh5tufabXLJ4DfFu6fqgXICndH92W060T99tTthq57B7k1zw pJyQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=B6vPGYhE7WWblxVkaqP7vVomN4+41Wr1mC37zr4MI5Y=; b=j+zIEmKPiIgND/FHSKi56oWXnQ3n7EggMsuM3Pv74R6RF++FGLqaeRQmikqMdNNLsN D+jKy2MAdNO33KmhLkixdvCjP/c8Hrw6jzfb0PEiQWhiegekWcR7PrzkrdAGoY+RqVp6 Bx4+oj1W1Cli4Fh21QpjEvCOKXnFYXaMLeCcmhQWUhGfFiiXl7NtoG89p3tbDHiEWLXG p+Rm4bM7gOkyJi6eQmEgo8sPok6j0c3eSHURL/u8F17Dmxoc2VgmCriYlsB7EtFhNwKj sQEa7+Ou+tKs+xRuBdct9qMG/651zGFe8kqDdJF5gs0IBj4AqlndIs7+f/kX+gHt1vol yufQ== X-Gm-Message-State: AOAM532CL7W1fIagGQU3R+ERdWouCP9iNeX6oM6aHQ3e5oPS8FTpZVsE ZJoZakHEL9p2N2kUuuoRrpJ3nvt8FS0= X-Google-Smtp-Source: ABdhPJyI4L4YEffPfZj82m5h9sV4kWKji+r+3jjqpD73M5T3p+roRIbh64Wc0i0mtoNrPEFc6rgM5g== X-Received: by 2002:a7b:c05a:: with SMTP id u26mr10847200wmc.172.1619710333449; Thu, 29 Apr 2021 08:32:13 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id y5sm5492945wrm.61.2021.04.29.08.32.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Apr 2021 08:32:13 -0700 (PDT) Message-Id: <039fc4be4b901781bb5062cf63873a014a444e4c.1619710329.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Thu, 29 Apr 2021 15:32:05 +0000 Subject: [PATCH 5/8] refs: add failure_errno to refs_read_raw_ref() signature Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Han-Wen Nienhuys , Han-Wen Nienhuys Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Han-Wen Nienhuys From: Han-Wen Nienhuys This makes the errno output of refs_read_raw_ref explicit. lock_raw_ref() now explicitly reads the errno output of refs_read_raw_ref. Signed-off-by: Han-Wen Nienhuys --- refs.c | 26 ++++++++++++-------------- refs/files-backend.c | 8 ++++---- refs/packed-backend.c | 10 ++++++---- refs/refs-internal.h | 6 +++--- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/refs.c b/refs.c index e8ce88040b3e..08f69e2a16f6 100644 --- a/refs.c +++ b/refs.c @@ -1671,20 +1671,17 @@ static int refs_read_special_head(struct ref_store *ref_store, return result; } -int refs_read_raw_ref(struct ref_store *ref_store, - const char *refname, struct object_id *oid, - struct strbuf *referent, unsigned int *type) +int refs_read_raw_ref(struct ref_store *ref_store, const char *refname, + struct object_id *oid, struct strbuf *referent, + unsigned int *type, int *failure_errno) { - int result, failure; if (!strcmp(refname, "FETCH_HEAD") || !strcmp(refname, "MERGE_HEAD")) { return refs_read_special_head(ref_store, refname, oid, referent, type); } - result = ref_store->be->read_raw_ref(ref_store, refname, oid, referent, - type, &failure); - errno = failure; - return result; + return ref_store->be->read_raw_ref(ref_store, refname, oid, referent, + type, failure_errno); } /* This function needs to return a meaningful errno on failure */ @@ -1725,9 +1722,10 @@ const char *refs_resolve_ref_unsafe(struct ref_store *refs, for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) { unsigned int read_flags = 0; + int read_failure = 0; - if (refs_read_raw_ref(refs, refname, - oid, &sb_refname, &read_flags)) { + if (refs_read_raw_ref(refs, refname, oid, &sb_refname, + &read_flags, &read_failure)) { *flags |= read_flags; /* In reading mode, refs must eventually resolve */ @@ -1739,9 +1737,8 @@ const char *refs_resolve_ref_unsafe(struct ref_store *refs, * may show errors besides ENOENT if there are * similarly-named refs. */ - if (errno != ENOENT && - errno != EISDIR && - errno != ENOTDIR) + if (read_failure != ENOENT && read_failure != EISDIR && + read_failure != ENOTDIR) return NULL; oidclr(oid); @@ -2253,7 +2250,8 @@ int refs_verify_refname_available(struct ref_store *refs, if (skip && string_list_has_string(skip, dirname.buf)) continue; - if (!refs_read_raw_ref(refs, dirname.buf, &oid, &referent, &type)) { + if (!refs_read_raw_ref(refs, dirname.buf, &oid, &referent, + &type, NULL)) { strbuf_addf(err, _("'%s' exists; cannot create '%s'"), dirname.buf, refname); goto cleanup; diff --git a/refs/files-backend.c b/refs/files-backend.c index 3ab09871db5e..b6dc1b36c752 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -383,8 +383,8 @@ static int files_read_raw_ref(struct ref_store *ref_store, const char *refname, if (lstat(path, &st) < 0) { if (errno != ENOENT) goto out; - if (refs_read_raw_ref(refs->packed_ref_store, refname, - oid, referent, type)) { + if (refs_read_raw_ref(refs->packed_ref_store, refname, oid, + referent, type, NULL)) { errno = ENOENT; goto out; } @@ -423,8 +423,8 @@ static int files_read_raw_ref(struct ref_store *ref_store, const char *refname, * ref is supposed to be, there could still be a * packed ref: */ - if (refs_read_raw_ref(refs->packed_ref_store, refname, - oid, referent, type)) { + if (refs_read_raw_ref(refs->packed_ref_store, refname, oid, + referent, type, NULL)) { errno = EISDIR; goto out; } diff --git a/refs/packed-backend.c b/refs/packed-backend.c index a457f18e93c8..03353ce48869 100644 --- a/refs/packed-backend.c +++ b/refs/packed-backend.c @@ -739,7 +739,8 @@ static int packed_read_raw_ref(struct ref_store *ref_store, const char *refname, if (!rec) { /* refname is not a packed reference. */ - *failure_errno = ENOENT; + if (failure_errno) + *failure_errno = ENOENT; return -1; } @@ -1347,6 +1348,7 @@ int is_packed_transaction_needed(struct ref_store *ref_store, ret = 0; for (i = 0; i < transaction->nr; i++) { struct ref_update *update = transaction->updates[i]; + int failure; unsigned int type; struct object_id oid; @@ -1357,9 +1359,9 @@ int is_packed_transaction_needed(struct ref_store *ref_store, */ continue; - if (!refs_read_raw_ref(ref_store, update->refname, - &oid, &referent, &type) || - errno != ENOENT) { + if (!refs_read_raw_ref(ref_store, update->refname, &oid, + &referent, &type, &failure) || + failure != ENOENT) { /* * We have to actually delete that reference * -> this transaction is needed. diff --git a/refs/refs-internal.h b/refs/refs-internal.h index b9f713b5acd6..6a0840e22772 100644 --- a/refs/refs-internal.h +++ b/refs/refs-internal.h @@ -149,9 +149,9 @@ struct ref_update { const char refname[FLEX_ARRAY]; }; -int refs_read_raw_ref(struct ref_store *ref_store, - const char *refname, struct object_id *oid, - struct strbuf *referent, unsigned int *type); +int refs_read_raw_ref(struct ref_store *ref_store, const char *refname, + struct object_id *oid, struct strbuf *referent, + unsigned int *type, int *failure_errno); /* Like refs_resolve_ref_unsafe, but provide access to errno code that lead to a * failure. */ From patchwork Thu Apr 29 15:32:06 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Han-Wen Nienhuys X-Patchwork-Id: 12231505 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4A399C433B4 for ; Thu, 29 Apr 2021 15:32:24 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 254CD61139 for ; Thu, 29 Apr 2021 15:32:24 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240748AbhD2PdJ (ORCPT ); Thu, 29 Apr 2021 11:33:09 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54638 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240722AbhD2PdE (ORCPT ); Thu, 29 Apr 2021 11:33:04 -0400 Received: from mail-wr1-x42a.google.com (mail-wr1-x42a.google.com [IPv6:2a00:1450:4864:20::42a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 361B4C06138E for ; Thu, 29 Apr 2021 08:32:15 -0700 (PDT) Received: by mail-wr1-x42a.google.com with SMTP id a4so67398177wrr.2 for ; Thu, 29 Apr 2021 08:32:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=Ns/C6v70aGGA915pkoG9rhASze7Hid+Pp0Hs8N9wQAI=; b=ZXK/L0f+DRKbrB6lDh3sCbyHTfMpU9C7qr7OizB5qsKNMDPdmwdNZTC07g/0cA28Nn R63IDD39FEVaU9M+wAnmdzQG4BhMFT4DACFy/y2Inj6zanBvGYJKLABuS4XijnDEu6c2 0Yx8ERkU9QF38bVTCz75QKCDqqI2VzNt8mJR+dVk0EriLI0Rqry6kJpMARNOnxPTGk7S NaIHlg3/s+twgM3W8IFhS7/HAlCsGJ/TRxF+W6AG0bDQ4pXSayrWMjcGHj8Z7Sdg+zd/ NMbvAyGzKWJd7m2JBUEtWPG50FIB/lFmbRxeuxxKOeEn0eqi+WKgoRzQ7X8fxBvyfH+U QQng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=Ns/C6v70aGGA915pkoG9rhASze7Hid+Pp0Hs8N9wQAI=; b=mTQAAGAXBqlopTZuAD41xbkCiTzPoK+47pG+pFREXCwr75LBcwONj7MeIjvZgmsX3B hl+qFM8o4VyM5ZJUfE3MT3IPJYoasVD4Q+l7+/2wY7YK47FjrZd1j829vxU/6gkhsPFS 0udhtaADBhjBrr1llduA0OZ1YmfeNuEvLEggSWlg7IFH09t/pq/rcU99oXJvG2rJl/+J jpmrYC9kZTW8LX99W8G28fBkQ4t+wadLrPHvavSXba2lF+Cqd9ljGzTrLnX4FvB6Wyv8 O1NWKc+a6Ttun9PWBV+Qd14r9dG2IShnagaBT/9S4BpqArIm65EEYtXI8ZkJosMsfqwk O0CQ== X-Gm-Message-State: AOAM530hXR6DM5sUQXPlyBnPUCE3Nj58bVxsvyoCiFjEpCzUIGn5Q8Yb 9kZbFNPueXJp/d2dCuRXVtOtj0cmHtk= X-Google-Smtp-Source: ABdhPJzY7CLgF0OmppiKgYvbm+ayr+wvE9Jr9uaIcQX9jXgUgyfeRFERNzJv+sIceaqzD4E7uCkLPQ== X-Received: by 2002:a5d:4b52:: with SMTP id w18mr413458wrs.41.1619710333968; Thu, 29 Apr 2021 08:32:13 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id n12sm401487wmq.29.2021.04.29.08.32.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Apr 2021 08:32:13 -0700 (PDT) Message-Id: <1bb350ea5d21eacf95426192c89173b502b7e06a.1619710329.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Thu, 29 Apr 2021 15:32:06 +0000 Subject: [PATCH 6/8] refs: clear errno return in refs_resolve_ref_unsafe() Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Han-Wen Nienhuys , Han-Wen Nienhuys Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Han-Wen Nienhuys From: Han-Wen Nienhuys This is done in a separate commit, to pinpoint the precise cause should there be regressions in error reporting. Signed-off-by: Han-Wen Nienhuys --- refs.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/refs.c b/refs.c index 08f69e2a16f6..6e746cb01f24 100644 --- a/refs.c +++ b/refs.c @@ -1685,10 +1685,11 @@ int refs_read_raw_ref(struct ref_store *ref_store, const char *refname, } /* This function needs to return a meaningful errno on failure */ -const char *refs_resolve_ref_unsafe(struct ref_store *refs, - const char *refname, - int resolve_flags, - struct object_id *oid, int *flags) +static const char *refs_resolve_ref_unsafe_errno(struct ref_store *refs, + const char *refname, + int resolve_flags, + struct object_id *oid, + int *flags) { static struct strbuf sb_refname = STRBUF_INIT; struct object_id unused_oid; @@ -1777,14 +1778,24 @@ const char *refs_resolve_ref_unsafe(struct ref_store *refs, return NULL; } +const char *refs_resolve_ref_unsafe(struct ref_store *refs, const char *refname, + int resolve_flags, struct object_id *oid, + int *flags) +{ + const char *result = refs_resolve_ref_unsafe_errno( + refs, refname, resolve_flags, oid, flags); + errno = 0; + return result; +} + const char *refs_resolve_ref_unsafe_with_errno(struct ref_store *refs, const char *refname, int resolve_flags, struct object_id *oid, int *flags, int *failure_errno) { - const char *result = refs_resolve_ref_unsafe(refs, refname, - resolve_flags, oid, flags); + const char *result = refs_resolve_ref_unsafe_errno( + refs, refname, resolve_flags, oid, flags); *failure_errno = errno; return result; } From patchwork Thu Apr 29 15:32:07 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Han-Wen Nienhuys X-Patchwork-Id: 12231507 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 6FAC9C43460 for ; Thu, 29 Apr 2021 15:32:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 3A57061139 for ; Thu, 29 Apr 2021 15:32:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240776AbhD2PdK (ORCPT ); Thu, 29 Apr 2021 11:33:10 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54640 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234590AbhD2PdE (ORCPT ); Thu, 29 Apr 2021 11:33:04 -0400 Received: from mail-wm1-x335.google.com (mail-wm1-x335.google.com [IPv6:2a00:1450:4864:20::335]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B16F7C06138F for ; Thu, 29 Apr 2021 08:32:15 -0700 (PDT) Received: by mail-wm1-x335.google.com with SMTP id f15-20020a05600c4e8fb029013f5599b8a9so9589073wmq.1 for ; Thu, 29 Apr 2021 08:32:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=Lm9JjOMNB4wRimMlTSPoIP4OSRo8G8j2bkNCx3qnccQ=; b=LafRQlKSg0o8YzPwsuxOf/Rsf23bt5HWVDzsNDqCTpdlj5El2Aga5xLBS73QQ2YpJG opn74UDzbViRuLj/PrD6+RyuxsjTfLLFN+D57NGfWGYwhrmXHZn7aWpcu1aPRSXdEao6 YhWRxLDPLXVd8t0L8DB+2e/0CZI+3tv3T7Cw2wfEjfbI4IwF1H1qrKwxvP2jCGjYL+LJ ZHrgyUfW9O/sxOwPaV3mnFRCry/+t6hnJ77r/j+1VPNkeB0XDGbGOCsko2eTLvSfgy79 YXrqvgQz4NT10ZbJUleOGytP8Zjq9sdsVVUza1pv2BXgHvuRjjVDG3x0i1cFOrQlDBaj R/jA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=Lm9JjOMNB4wRimMlTSPoIP4OSRo8G8j2bkNCx3qnccQ=; b=Cg4D0tC/wwUuc4cmRJ9xjQtUW/tGsDztD1evbJ1TrJKXRR7PURQjvafRBnIiq40zJC w1BNzowalxt8vgykDC2Ks6086xSm5PKX6uNjs8TWQz1mzNpuF+3/HOo1r9Zn44WjybaQ 3N3+UNtM0vZfcZ8HiChqr8TVx9lC9+frKVc3yfBSNB1GTY+xUZZI+e+isnPD1TbEA6t3 tnJo+quPghYHZ7Sa5tGGkXYDRFiv9K39/CUsRiy16bhLdOU/MC+Gk5wzClPEs2zYncdy x6tY1FYzSP2CSbs9zV2f9W0xBp4z5i21OqPcTLun12LH7AEVJG2rX124UWlEEIi9COda wDnA== X-Gm-Message-State: AOAM530irtMEZ7Hs0+x1MlKNt6W5sxVSjGOPqUkUgO9fOMK5FE9zsV1f sKAhWAu7nKsLU3hTUoVcn48zaO8JXmY= X-Google-Smtp-Source: ABdhPJxabhGejax3rDIjDpK7X79bi3VThfJXvxFDHp5+D5f78xfyZgpUwrDnCvSw+r4lVPmbC03nhg== X-Received: by 2002:a1c:f708:: with SMTP id v8mr11316824wmh.133.1619710334502; Thu, 29 Apr 2021 08:32:14 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id b20sm466669wmj.3.2021.04.29.08.32.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Apr 2021 08:32:14 -0700 (PDT) Message-Id: <95d64d73353d8689e3928b8c9444490d0cdebfc9.1619710329.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Thu, 29 Apr 2021 15:32:07 +0000 Subject: [PATCH 7/8] refs: stop setting EINVAL and ELOOP in symref resolution Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Han-Wen Nienhuys , Han-Wen Nienhuys Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Han-Wen Nienhuys From: Han-Wen Nienhuys The only caller of refs_resolve_ref_unsafe_with_errno() is in refs/files-backend.c, and it only cares about EISDIR and ENOTDIR. Signed-off-by: Han-Wen Nienhuys --- refs.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/refs.c b/refs.c index 6e746cb01f24..597e4d1f18f9 100644 --- a/refs.c +++ b/refs.c @@ -1706,7 +1706,6 @@ static const char *refs_resolve_ref_unsafe_errno(struct ref_store *refs, if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) { if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) || !refname_is_safe(refname)) { - errno = EINVAL; return NULL; } @@ -1766,7 +1765,6 @@ static const char *refs_resolve_ref_unsafe_errno(struct ref_store *refs, if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) { if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) || !refname_is_safe(refname)) { - errno = EINVAL; return NULL; } @@ -1774,7 +1772,6 @@ static const char *refs_resolve_ref_unsafe_errno(struct ref_store *refs, } } - errno = ELOOP; return NULL; } From patchwork Thu Apr 29 15:32:08 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Han-Wen Nienhuys X-Patchwork-Id: 12231503 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-12.7 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 77CA3C433B4 for ; Thu, 29 Apr 2021 15:32:20 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 46F0861441 for ; Thu, 29 Apr 2021 15:32:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240725AbhD2PdF (ORCPT ); Thu, 29 Apr 2021 11:33:05 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:54626 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240672AbhD2PdD (ORCPT ); Thu, 29 Apr 2021 11:33:03 -0400 Received: from mail-wm1-x32f.google.com (mail-wm1-x32f.google.com [IPv6:2a00:1450:4864:20::32f]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 45937C061342 for ; Thu, 29 Apr 2021 08:32:16 -0700 (PDT) Received: by mail-wm1-x32f.google.com with SMTP id n127so24296541wmb.5 for ; Thu, 29 Apr 2021 08:32:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=message-id:in-reply-to:references:from:date:subject:fcc :content-transfer-encoding:mime-version:to:cc; bh=0JyrnzQZNBv61TfTAVE5NfNsgGDmaT7cbsksCUDIFSU=; b=davSZGMdMwkyyAy1mZUxiOdWOH3O/hvo1ywS/8lokaYfPwFW3P9uE6FVyoEaLXgYB6 9w5Ya1n3fqVK42YoycTQ3+miCUWp5OGQ3CXZfcBI87H3E2D0PV70d3l3HD9bb7ibhsSv zlSHL8iTcQdgjBCTveGonkREqLwCebk1opjwg8zldjKn7szPTDK4ZJgX7Wh76oyO24D/ 4538dp7defFj9D35JeSPR2eRlKs3CupNcsJD3emcss4LhSN8JHj77x7By0/bb8auxu/U skBgsvLDEcuSmxoT/NO14G2jAwEPQwBPoiG3ocUlnvrfmm261vFRrTV/OoAaX4u3aSPc 8R3Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:message-id:in-reply-to:references:from:date :subject:fcc:content-transfer-encoding:mime-version:to:cc; bh=0JyrnzQZNBv61TfTAVE5NfNsgGDmaT7cbsksCUDIFSU=; b=My7H6ZJrCOmGOyc8VFSUYt1lkM5Tlr57clfZbJwcvY3o/uW9/Z3BHhGkm11m0JGkNR 94fmL1uJsuTezytODwq3drWR+CeNso5Obzhw9olpF2haxoShxTUxNOFJuk6ZWu0xGlfX e6K/+LYiahG+kzNvBCS2WOJUezhUh8wdyCz3VzU06iMKcLqLjlIl+fSReo2djfXWxZIw MePbcWw1ys6vjMEVuenKGZjLqi21jXGl53Mk7U5IHpuG9z9jZEkqAxuko+c4O2ZsF630 Dy9jxxeCojjHntV1P0dIK+7XDi+J1/4inQuuRr0OQEq8nI2TMQG/ctEWO1Y7QPzOAgCq +whQ== X-Gm-Message-State: AOAM533ZQp1oYUAkoVmV8x9oXjqqMHx7rJbPa85RvTHerVB94Xpg0kyO Do30Va/kMH9UzCGfDiXXAZOB+3J1O0M= X-Google-Smtp-Source: ABdhPJzTbdznUnzO1Jx5DHUaem/PWxxUXJzf47ea4CBnBXAbCrpzR45FNCsRb6Qf/2TYylF82iP/7g== X-Received: by 2002:a1c:b7c4:: with SMTP id h187mr667868wmf.178.1619710335042; Thu, 29 Apr 2021 08:32:15 -0700 (PDT) Received: from [127.0.0.1] ([13.74.141.28]) by smtp.gmail.com with ESMTPSA id o1sm6124173wrm.66.2021.04.29.08.32.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 29 Apr 2021 08:32:14 -0700 (PDT) Message-Id: <9e161eeb5f6b6945499e036e27bd7cb511b336aa.1619710329.git.gitgitgadget@gmail.com> In-Reply-To: References: Date: Thu, 29 Apr 2021 15:32:08 +0000 Subject: [PATCH 8/8] refs: explicitly propagate errno from refs_read_raw_ref Fcc: Sent MIME-Version: 1.0 To: git@vger.kernel.org Cc: Han-Wen Nienhuys , Han-Wen Nienhuys Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org From: Han-Wen Nienhuys From: Han-Wen Nienhuys The function refs_resolve_ref_unsafe_with_errno should produce an errno output. Rather than taking the value from the errno (which might contain garbage beforehand), explicitly propagate the failure_errno coming out of refs_read_raw_ref(). Signed-off-by: Han-Wen Nienhuys --- refs.c | 33 +++++++++++---------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/refs.c b/refs.c index 597e4d1f18f9..a25d18873c56 100644 --- a/refs.c +++ b/refs.c @@ -1684,12 +1684,11 @@ int refs_read_raw_ref(struct ref_store *ref_store, const char *refname, type, failure_errno); } -/* This function needs to return a meaningful errno on failure */ -static const char *refs_resolve_ref_unsafe_errno(struct ref_store *refs, - const char *refname, - int resolve_flags, - struct object_id *oid, - int *flags) +const char *refs_resolve_ref_unsafe_with_errno(struct ref_store *refs, + const char *refname, + int resolve_flags, + struct object_id *oid, + int *flags, int *failure_errno) { static struct strbuf sb_refname = STRBUF_INIT; struct object_id unused_oid; @@ -1702,6 +1701,7 @@ static const char *refs_resolve_ref_unsafe_errno(struct ref_store *refs, flags = &unused_flags; *flags = 0; + *failure_errno = 0; if (check_refname_format(refname, REFNAME_ALLOW_ONELEVEL)) { if (!(resolve_flags & RESOLVE_REF_ALLOW_BAD_NAME) || @@ -1728,6 +1728,8 @@ static const char *refs_resolve_ref_unsafe_errno(struct ref_store *refs, &read_flags, &read_failure)) { *flags |= read_flags; + *failure_errno = read_failure; + /* In reading mode, refs must eventually resolve */ if (resolve_flags & RESOLVE_REF_READING) return NULL; @@ -1779,22 +1781,9 @@ const char *refs_resolve_ref_unsafe(struct ref_store *refs, const char *refname, int resolve_flags, struct object_id *oid, int *flags) { - const char *result = refs_resolve_ref_unsafe_errno( - refs, refname, resolve_flags, oid, flags); - errno = 0; - return result; -} - -const char *refs_resolve_ref_unsafe_with_errno(struct ref_store *refs, - const char *refname, - int resolve_flags, - struct object_id *oid, - int *flags, int *failure_errno) -{ - const char *result = refs_resolve_ref_unsafe_errno( - refs, refname, resolve_flags, oid, flags); - *failure_errno = errno; - return result; + int ignore; + return refs_resolve_ref_unsafe_with_errno(refs, refname, resolve_flags, + oid, flags, &ignore); } /* backend functions */