From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS53758 23.128.96.0/24 X-Spam-Status: No, score=-3.9 required=3.0 tests=AWL,BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,RCVD_IN_DNSWL_HI, SPF_HELO_PASS,SPF_PASS shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by dcvr.yhbt.net (Postfix) with ESMTP id D2E891F5AE for ; Sat, 1 May 2021 14:04:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230014AbhEAOF0 (ORCPT ); Sat, 1 May 2021 10:05:26 -0400 Received: from cloud.peff.net ([104.130.231.41]:42052 "EHLO cloud.peff.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229873AbhEAOFZ (ORCPT ); Sat, 1 May 2021 10:05:25 -0400 Received: (qmail 26409 invoked by uid 109); 1 May 2021 14:04:35 -0000 Received: from Unknown (HELO peff.net) (10.0.1.2) by cloud.peff.net (qpsmtpd/0.94) with ESMTP; Sat, 01 May 2021 14:04:35 +0000 Authentication-Results: cloud.peff.net; auth=none Received: (qmail 10087 invoked by uid 111); 1 May 2021 14:04:35 -0000 Received: from coredump.intra.peff.net (HELO sigill.intra.peff.net) (10.0.0.2) by peff.net (qpsmtpd/0.94) with (TLS_AES_256_GCM_SHA384 encrypted) ESMTPS; Sat, 01 May 2021 10:04:35 -0400 Authentication-Results: peff.net; auth=none Date: Sat, 1 May 2021 10:04:34 -0400 From: Jeff King To: git@vger.kernel.org Cc: Yiyuan guo Subject: [PATCH 5/5] pack-objects: clamp negative depth to 0 Message-ID: References: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: Precedence: bulk List-ID: X-Mailing-List: git@vger.kernel.org A negative delta depth makes no sense, and the code is not prepared to handle it. If passed "--depth=-1" on the command line, then this line from break_delta_chains(): cur->depth = (total_depth--) % (depth + 1); triggers a divide-by-zero. This is undefined behavior according to the C standard, but on POSIX systems results in SIGFPE killing the process. This is certainly one way to inform the use that the command was invalid, but it's a bit friendlier to just treat it as "don't allow any deltas", which we already do for --depth=0. Signed-off-by: Jeff King --- builtin/pack-objects.c | 2 ++ t/t5316-pack-delta-depth.sh | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/builtin/pack-objects.c b/builtin/pack-objects.c index ea7a5b3ba5..da5e0700f9 100644 --- a/builtin/pack-objects.c +++ b/builtin/pack-objects.c @@ -3861,6 +3861,8 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix) if (pack_to_stdout != !base_name || argc) usage_with_options(pack_usage, pack_objects_options); + if (depth < 0) + depth = 0; if (depth >= (1 << OE_DEPTH_BITS)) { warning(_("delta chain depth %d is too deep, forcing %d"), depth, (1 << OE_DEPTH_BITS) - 1); diff --git a/t/t5316-pack-delta-depth.sh b/t/t5316-pack-delta-depth.sh index 3e84df4137..759169d074 100755 --- a/t/t5316-pack-delta-depth.sh +++ b/t/t5316-pack-delta-depth.sh @@ -102,4 +102,11 @@ test_expect_success '--depth=0 disables deltas' ' test_cmp expect actual ' +test_expect_success 'negative depth disables deltas' ' + pack=$(git pack-objects --all --depth=-1 expect && + max_chain pack-$pack.pack >actual && + test_cmp expect actual +' + test_done -- 2.31.1.875.g5dccece0aa