From patchwork Mon Jan 27 13:04:09 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Steinhardt X-Patchwork-Id: 13951352 Received: from fhigh-a1-smtp.messagingengine.com (fhigh-a1-smtp.messagingengine.com [103.168.172.152]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3291814D28C for ; Mon, 27 Jan 2025 13:04:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.152 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983062; cv=none; b=iaAMQyULg8xTGKIGpHEmI66Pn1ZRkikI3QGB99hFNcdTvZiyQAvhc2myVplaQDK+vFnlcmouvrsmg74ufnmW0DqRI7CKnPjhcweA5lsYs+PO1jMtWl0wxxNMUt9X3SPMMDi84QgOZ2YAKodE2tAKLiDzs9N+r4Psyhn9Y7YnKLU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983062; c=relaxed/simple; bh=+iagMjpQ8dX07lvRT/xY2dTiLj7CiNWhYiNKUuiqBe8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=k1q5MsgoJlg6YRCGOhe5wSPvYmTwlySrtFyciNZPeZxDwhhMD0JX0AsMD132egOFEMDcng8hwCpGkC3HSZpsdKVGcsb6Ncu8nqUP+0rV8JQdDIAo2b0r7HNA6S8FTVWoKiJGUDBYPSEjefAhpVzWbRaTOZvL40589xjJxkIumGQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im; spf=pass smtp.mailfrom=pks.im; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b=eK+u8RM7; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=ndTq7P6H; arc=none smtp.client-ip=103.168.172.152 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pks.im Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b="eK+u8RM7"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="ndTq7P6H" Received: from phl-compute-03.internal (phl-compute-03.phl.internal [10.202.2.43]) by mailfhigh.phl.internal (Postfix) with ESMTP id 36D4211401E4; Mon, 27 Jan 2025 08:04:18 -0500 (EST) Received: from phl-mailfrontend-01 ([10.202.2.162]) by phl-compute-03.internal (MEProxy); Mon, 27 Jan 2025 08:04:18 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pks.im; h=cc:cc :content-transfer-encoding:content-type:content-type:date:date :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm3; t=1737983058; x=1738069458; bh=GvMn42ozwWo5GYWrzRiRYUFzxGTOhQY5Y730BGkbxPs=; b= eK+u8RM7sN5zquK7e3khjSaTfpuDngulAp9jCE1KQ4I4CrUPkNdaNIEW+a3x2eYl ip2Vhk0SWSPP1LrNNWa7wYnI8JOH74zlMdt4yOjBuNsIIT1M0PbqjA9qRRP6UIZQ KGDvyF6PNC642OKmMiRF1ZwTqGojyUKnBMI+4CrOshB6jVzNIhW3bCjWrAF+AAdC 7VVATmdF0SnIb3Fwd5JUeW0RBIS979zUbE7vcLSEdHOTGH3+N7k1LzJxWyK9clxa Ov3p6uFTzvIoyAqn7xyve07aVCtRkuSWeBuPjXicY8pgR6lrI/1CxBjcxDMKHPRF 9V1SgLzH03SLA9NeRD1HUA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1737983058; x= 1738069458; bh=GvMn42ozwWo5GYWrzRiRYUFzxGTOhQY5Y730BGkbxPs=; b=n dTq7P6Hcn/nZdD2nf+4bLmF0z44uDEJkKx9gKMRC76epm1gkeRuGCyUALOnxSV8D HYGLu4QEV4BZ46zj66oEbcyv+sDz12jKhomIqf4ryY3H7/uVZIH0y8bY0VK2A/Hl jpVgePBW/kyfIJWxweYKWRCe0IFe2Lbl3/Fgs9fxUWj1t/Tmycghf6RsOW4cbOHV EbdKfH0D4FslZX63wsyOm5jB4zNvkGjvpNCt4dc6Y2oIPhat+t3MoreZsCQExTrN if80fasmfNiIAsjb96d8+FAWN4+gxsa+u0/NiQCzCQwwHDkDoSz99oIwBf+UFZqn 0+dk5FFjS3N+jdGzNOSVQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefuddrudejgedgudefvdegucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdggtfgfnhhsuhgsshgtrhhisggv pdfurfetoffkrfgpnffqhgenuceurghilhhouhhtmecufedttdenucesvcftvggtihhpih gvnhhtshculddquddttddmnecujfgurhephfffufggtgfgkfhfjgfvvefosehtjeertder tdejnecuhfhrohhmpefrrghtrhhitghkucfuthgvihhnhhgrrhguthcuoehpshesphhksh drihhmqeenucggtffrrghtthgvrhhnpeffueeiudejvdekheeuvdekfeffiedvueelteek udehjeetkeegvddugfdtgfeileenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmh epmhgrihhlfhhrohhmpehpshesphhkshdrihhmpdhnsggprhgtphhtthhopedvpdhmohgu vgepshhmthhpohhuthdprhgtphhtthhopegvthhhohhmshhonhesvggufigrrhguthhhoh hmshhonhdrtghomhdprhgtphhtthhopehgihhtsehvghgvrhdrkhgvrhhnvghlrdhorhhg X-ME-Proxy: Feedback-ID: i197146af:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 27 Jan 2025 08:04:17 -0500 (EST) Received: by vm-mail (OpenSMTPD) with ESMTPSA id e1568458 (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Mon, 27 Jan 2025 13:04:14 +0000 (UTC) From: Patrick Steinhardt Date: Mon, 27 Jan 2025 14:04:09 +0100 Subject: [PATCH 01/19] reftable/stack: stop using `read_in_full()` Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250127-pks-reftable-drop-git-compat-util-v1-1-6e280a564877@pks.im> References: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> In-Reply-To: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> To: git@vger.kernel.org Cc: Edward Thomson X-Mailer: b4 0.14.2 There is a single callsite of `read_in_full()` in the reftable library. Open-code the function to reduce our dependency on the Git library. Signed-off-by: Patrick Steinhardt --- reftable/stack.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/reftable/stack.c b/reftable/stack.c index f7c1845e15..9490366795 100644 --- a/reftable/stack.c +++ b/reftable/stack.c @@ -115,13 +115,16 @@ int reftable_new_stack(struct reftable_stack **dest, const char *dir, static int fd_read_lines(int fd, char ***namesp) { - off_t size = lseek(fd, 0, SEEK_END); char *buf = NULL; int err = 0; + off_t size; + + size = lseek(fd, 0, SEEK_END); if (size < 0) { err = REFTABLE_IO_ERROR; goto done; } + err = lseek(fd, 0, SEEK_SET); if (err < 0) { err = REFTABLE_IO_ERROR; @@ -134,9 +137,16 @@ static int fd_read_lines(int fd, char ***namesp) goto done; } - if (read_in_full(fd, buf, size) != size) { - err = REFTABLE_IO_ERROR; - goto done; + for (size_t total_read = 0; total_read < (size_t) size; ) { + ssize_t bytes_read = read(fd, buf + total_read, size - total_read); + if (bytes_read < 0 && (errno == EAGAIN || errno == EINTR)) + continue; + if (bytes_read < 0 || !bytes_read) { + err = REFTABLE_IO_ERROR; + goto done; + } + + total_read += bytes_read; } buf[size] = 0; From patchwork Mon Jan 27 13:04:10 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Steinhardt X-Patchwork-Id: 13951350 Received: from fout-a5-smtp.messagingengine.com (fout-a5-smtp.messagingengine.com [103.168.172.148]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 59AEE1537C8 for ; Mon, 27 Jan 2025 13:04:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.148 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983061; cv=none; b=mSOkBeqKiZDC6fukNSUvyWzGlfPg/tC6k+q+u30ojPIh4dzJoH0NR2GleBMS9ynxMVG3Qa3yZD1jbaTA6u19wE59v+GJFuuLRPF40KBz8TNoiySor+w5r87BUM7x//AzKJ1NNR0enmQPeb66J4WK/RwanlVEZ7I1BO7QTk6RNjg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983061; c=relaxed/simple; bh=ZQ2XEXDcUn70nxnghchKgY/1/IPyW0wJW4m9KlBlwVY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=UkXRl1Z530u2WJEiXWCsXh+RIFXCdmbpMo8AUwuAgNboRTWgLVog2aMYGAbpWtdmLspvFwrYYrAKS9xzWcZQvB26+uBALCAF3Sa0ogQHfMQjv4O6hf7L/f7YhUTStirDfEoLFRfJ821U6bi9Is46kZsnmcRTQ9xcH2XLXUSuh7c= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im; spf=pass smtp.mailfrom=pks.im; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b=Mif+fHx5; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=IHQGqFJd; arc=none smtp.client-ip=103.168.172.148 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pks.im Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b="Mif+fHx5"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="IHQGqFJd" Received: from phl-compute-11.internal (phl-compute-11.phl.internal [10.202.2.51]) by mailfout.phl.internal (Postfix) with ESMTP id 5476F1380A90; Mon, 27 Jan 2025 08:04:18 -0500 (EST) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-11.internal (MEProxy); Mon, 27 Jan 2025 08:04:18 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pks.im; h=cc:cc :content-transfer-encoding:content-type:content-type:date:date :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm3; t=1737983058; x=1738069458; bh=OAfz3VQFjKoHw7bRx0dztIrW4fPn64Mv0AWtbw4sj0g=; b= Mif+fHx5mHtM4EaghISRNicXDnzz/yzFbuHjPtI3H2raCscKrM3ahit4FpKOuO6N cUlICDYZdtEZvvn5AWEHUpwTDdJPReY3q9phtetVKC6ZNK9hjLlSWTC/xZR1BZu9 tOaSCrAzkOuYGDeSSiHc2Ybg+qD3TfDtM8kzCwQEYh2ITDIQYw/93yCkcE0qBEnC PQUl16j/hk5+ICHh5IzontfpnK2JFPRedTAC68MTht/e/uAflyX/ywyhKTTp9qsu ohgbOYmAIWSP/BzpZLyuvZxFRawVNhGsuJxLZ/Z7SYLn9B5IwYlrUrrFdXmBtHQF f22rXOYFJzFUptFNcua9EQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1737983058; x= 1738069458; bh=OAfz3VQFjKoHw7bRx0dztIrW4fPn64Mv0AWtbw4sj0g=; b=I HQGqFJd7TZBCCeI/IuoRC34XIvcUe0+/nCYqxVgNcmzT9ezVU7XnySrQ7V8ZtYci WYAXQYQD5ZAnlHcy/CCugHPZCZijWdH0UElHLh7daeukAKFvsxS4RBxlkaRxVECB Vje8xWOlTYZ0K4DlsuLtLc4ay1nYSsLR6pMmGp53BV+a1flpVo82jVAm4CIIsERz k72GoqOsJtaD9odE9DY/olDcvftECtpZB5bNHusTGipv/rS7drgf3EUmXBZ090wd 1q7Fpe1Dq7f8Ow1cI2KJvsQ1Eh6XvUsQxqZ6isMdBXTffsAyt4H9bTpolvj4wi+6 jBIpjrdxt5i1FoCxl/WIQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefuddrudejgedgudefvdegucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdggtfgfnhhsuhgsshgtrhhisggv pdfurfetoffkrfgpnffqhgenuceurghilhhouhhtmecufedttdenucesvcftvggtihhpih gvnhhtshculddquddttddmnecujfgurhephfffufggtgfgkfhfjgfvvefosehtjeertder tdejnecuhfhrohhmpefrrghtrhhitghkucfuthgvihhnhhgrrhguthcuoehpshesphhksh drihhmqeenucggtffrrghtthgvrhhnpeffueeiudejvdekheeuvdekfeffiedvueelteek udehjeetkeegvddugfdtgfeileenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmh epmhgrihhlfhhrohhmpehpshesphhkshdrihhmpdhnsggprhgtphhtthhopedvpdhmohgu vgepshhmthhpohhuthdprhgtphhtthhopegvthhhohhmshhonhesvggufigrrhguthhhoh hmshhonhdrtghomhdprhgtphhtthhopehgihhtsehvghgvrhdrkhgvrhhnvghlrdhorhhg X-ME-Proxy: Feedback-ID: i197146af:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 27 Jan 2025 08:04:17 -0500 (EST) Received: by vm-mail (OpenSMTPD) with ESMTPSA id 01f43429 (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Mon, 27 Jan 2025 13:04:15 +0000 (UTC) From: Patrick Steinhardt Date: Mon, 27 Jan 2025 14:04:10 +0100 Subject: [PATCH 02/19] reftable/stack: stop using `write_in_full()` Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250127-pks-reftable-drop-git-compat-util-v1-2-6e280a564877@pks.im> References: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> In-Reply-To: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> To: git@vger.kernel.org Cc: Edward Thomson X-Mailer: b4 0.14.2 Similar to the preceding commit, drop our use of `write_in_full()` and implement a new wrapper `reftable_write_full()` that handles this logic for us. This is done to reduce our dependency on the Git library. Signed-off-by: Patrick Steinhardt --- reftable/stack.c | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/reftable/stack.c b/reftable/stack.c index 9490366795..5f155b344b 100644 --- a/reftable/stack.c +++ b/reftable/stack.c @@ -48,6 +48,25 @@ static int stack_fsync(const struct reftable_write_options *opts, int fd) return fsync(fd); } +static ssize_t reftable_write_data(int fd, const void *data, size_t size) +{ + size_t total_written = 0; + const char *p = data; + + while (total_written < size) { + ssize_t bytes_written = write(fd, p, size - total_written); + if (bytes_written < 0 && (errno == EAGAIN || errno == EINTR)) + continue; + if (bytes_written < 0) + return REFTABLE_IO_ERROR; + + total_written += bytes_written; + p += bytes_written; + } + + return total_written; +} + struct fd_writer { const struct reftable_write_options *opts; int fd; @@ -56,7 +75,7 @@ struct fd_writer { static ssize_t fd_writer_write(void *arg, const void *data, size_t sz) { struct fd_writer *writer = arg; - return write_in_full(writer->fd, data, sz); + return reftable_write_data(writer->fd, data, sz); } static int fd_writer_flush(void *arg) @@ -784,7 +803,8 @@ int reftable_addition_commit(struct reftable_addition *add) goto done; } - err = write_in_full(add->tables_list_lock.fd, table_list.buf, table_list.len); + err = reftable_write_data(add->tables_list_lock.fd, + table_list.buf, table_list.len); reftable_buf_release(&table_list); if (err < 0) { err = REFTABLE_IO_ERROR; @@ -1468,8 +1488,8 @@ static int stack_compact_range(struct reftable_stack *st, goto done; } - err = write_in_full(tables_list_lock.fd, - tables_list_buf.buf, tables_list_buf.len); + err = reftable_write_data(tables_list_lock.fd, + tables_list_buf.buf, tables_list_buf.len); if (err < 0) { err = REFTABLE_IO_ERROR; unlink(new_table_path.buf); From patchwork Mon Jan 27 13:04:11 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Steinhardt X-Patchwork-Id: 13951351 Received: from fout-a5-smtp.messagingengine.com (fout-a5-smtp.messagingengine.com [103.168.172.148]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 49A091FC7ED for ; Mon, 27 Jan 2025 13:04:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.148 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983061; cv=none; b=r9VEfBO4w+5qZiF+LkLYpEqlHTQPVJl/tryk1qychJSGwSQEdQM667e9WSXvsUb9Vc4nDXI1CDmbsytMIm1ljPXjq1GIrsfWVl8S8iVSCmD3ktAdahHKp7aSuEOZRWGa805RCB+euNSevARayhspk1L6l7TjNAedk8dSqRxh6g8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983061; c=relaxed/simple; bh=PmJRt6fXmGoAwu59QosLn0Idv1b0404jbmWLyYpzdS8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RKQgiqJZ23vC5bjGRHvWJ9dEwHTJ30w4mtBUxBy3ZsMcfFMiuTKO774SOj7rtUn0uKNu+PxGUoI2BDljKeym2HDh6B8QND4u9n3Byj6x/0i4ysWzUk6ntD3V2twPJ4RQu7q2DY8FTczx8aQHbyhWt7ly9Afl9fR9Ir7sxdLa3X0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im; spf=pass smtp.mailfrom=pks.im; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b=AAXVe2y6; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=Hsh+U4d5; arc=none smtp.client-ip=103.168.172.148 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pks.im Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b="AAXVe2y6"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="Hsh+U4d5" Received: from phl-compute-06.internal (phl-compute-06.phl.internal [10.202.2.46]) by mailfout.phl.internal (Postfix) with ESMTP id 5055A13801C4; Mon, 27 Jan 2025 08:04:19 -0500 (EST) Received: from phl-mailfrontend-01 ([10.202.2.162]) by phl-compute-06.internal (MEProxy); Mon, 27 Jan 2025 08:04:19 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pks.im; h=cc:cc :content-transfer-encoding:content-type:content-type:date:date :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm3; t=1737983059; x=1738069459; bh=PKAhJl6MulJ8BREkwp1+4UxGCBsYnhbC1wjnWaXA8NQ=; b= AAXVe2y655TJ2aB95pSSBC3TqboLb1GCbUQOgrX5cmU7bwKQo7WQS1F3lvT/IfY+ Pn94C2E7nnsS9AnqOSle6s56VbsB8AWSg2LPfOCYI4BWjx21/raJbrxEZML1G36I RkHwNJm9kppGaztku7QmBTR8rYD6CWDYfSYXKrFvdt2DZusEtkZXn91WQJz0yrWi JgmiW3FxNFuoKQG7P3HczY15xHFPEP/JVX24EUgeh3Un+knl0CF0q1Cx8KbI957l NTQpi4ONvrx2Pc5m+dpD4OeqH4iVHKXskQHlFQA16Ooy7eRaX3RgIbiecT0+nZnT CwIAfMHoINozslxRJodd4A== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1737983059; x= 1738069459; bh=PKAhJl6MulJ8BREkwp1+4UxGCBsYnhbC1wjnWaXA8NQ=; b=H sh+U4d5rLjiSWQu+DJzdi/LxE2XpOWKCSz52+GP2hOYu7cN3GMiZyKWPiNAhCyUz tcKQ83knnVELu0IErODjAMHDgnd5S2osQgRh+FW+pcvCevhfkuTAs6P7A4rZ0dZW DUVu30kalVWhp7KpggI8/WzyRN4ksSCVr7bpqcbTvN2Rxd56m4KidaQnxLVtYB2/ zxIzCPj99AG7vh/B+w/0YhHynngYlnf7XGvt0jnBpXhQ+85qbWthx9Oe8/23h39A mxo35kMjFiCvLN25yFQR4zabT0nFqouTBnXc9RXH2LgBBVCuHvHhNRVAZ+6Qtic2 2iWDUlejybScYQlGOI84Q== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefuddrudejgedgudefvdegucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdggtfgfnhhsuhgsshgtrhhisggv pdfurfetoffkrfgpnffqhgenuceurghilhhouhhtmecufedttdenucesvcftvggtihhpih gvnhhtshculddquddttddmnecujfgurhephfffufggtgfgkfhfjgfvvefosehtjeertder tdejnecuhfhrohhmpefrrghtrhhitghkucfuthgvihhnhhgrrhguthcuoehpshesphhksh drihhmqeenucggtffrrghtthgvrhhnpeffueeiudejvdekheeuvdekfeffiedvueelteek udehjeetkeegvddugfdtgfeileenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmh epmhgrihhlfhhrohhmpehpshesphhkshdrihhmpdhnsggprhgtphhtthhopedvpdhmohgu vgepshhmthhpohhuthdprhgtphhtthhopegvthhhohhmshhonhesvggufigrrhguthhhoh hmshhonhdrtghomhdprhgtphhtthhopehgihhtsehvghgvrhdrkhgvrhhnvghlrdhorhhg X-ME-Proxy: Feedback-ID: i197146af:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 27 Jan 2025 08:04:18 -0500 (EST) Received: by vm-mail (OpenSMTPD) with ESMTPSA id d51e5563 (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Mon, 27 Jan 2025 13:04:16 +0000 (UTC) From: Patrick Steinhardt Date: Mon, 27 Jan 2025 14:04:11 +0100 Subject: [PATCH 03/19] reftable/blocksource: stop using `xmmap()` Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250127-pks-reftable-drop-git-compat-util-v1-3-6e280a564877@pks.im> References: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> In-Reply-To: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> To: git@vger.kernel.org Cc: Edward Thomson X-Mailer: b4 0.14.2 We use `xmmap()` to map reftables into memory. This function has two problems: - It causes us to die in case the mmap fails. - It ties us to the Git codebase. Refactor the code to use mmap(3p) instead with manual error checking. Note that this function may not be the system-provided mmap(3p), but may point to our `git_mmap()` wrapper that emulates the syscall on systems that do not have mmap(3p) available. Fix `reftable_block_source_from_file()` to properly bubble up the error code in case the map(3p) call fails. Signed-off-by: Patrick Steinhardt --- reftable/blocksource.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/reftable/blocksource.c b/reftable/blocksource.c index bba4a45b98..02972c46f4 100644 --- a/reftable/blocksource.c +++ b/reftable/blocksource.c @@ -98,7 +98,7 @@ static struct reftable_block_source_vtable file_vtable = { int reftable_block_source_from_file(struct reftable_block_source *bs, const char *name) { - struct file_block_source *p; + struct file_block_source *p = NULL; struct stat st; int fd, err; @@ -122,7 +122,12 @@ int reftable_block_source_from_file(struct reftable_block_source *bs, } p->size = st.st_size; - p->data = xmmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); + p->data = mmap(NULL, st.st_size, PROT_READ, MAP_PRIVATE, fd, 0); + if (p->data == MAP_FAILED) { + err = REFTABLE_IO_ERROR; + p->data = NULL; + goto out; + } assert(!bs->ops); bs->ops = &file_vtable; @@ -135,5 +140,5 @@ int reftable_block_source_from_file(struct reftable_block_source *bs, close(fd); if (err < 0) reftable_free(p); - return 0; + return err; } From patchwork Mon Jan 27 13:04:12 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Steinhardt X-Patchwork-Id: 13951353 Received: from fhigh-a1-smtp.messagingengine.com (fhigh-a1-smtp.messagingengine.com [103.168.172.152]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6C42F1FE443 for ; Mon, 27 Jan 2025 13:04:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.152 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983062; cv=none; b=LUU7H5pJ4jksq2TzvvwzgCQpi4z9Milp6weMP/kT25Ll88uJJVBGtuu0Ta8hJVImfUv7RyyHEloS98UBRY/qi/13QYmYCL2RHj6aWRcki2eQcUJ2siLftpIc2iJV/Xnb1CPmlCNp3dECCRxhGSMz0FU70NmyA5QWnELc8p+OM+k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983062; c=relaxed/simple; bh=isW44sI+hPQmmM/id5qyNHnGUjfiKjltOXrxxnn+FhA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lA32thd1tiiTdyG/kP9W/8KLL7C+co7aZBJL87hGXJszgIpTXp+Khdl4Eif07XoAEtwOKFa9xK30ba1m3XBT1xD6TffOFkjhqH18cUb2E87mnumRWDGcYKOALyK6/FluGu+5v+OCljx+53zIA73tnSZjhkX/xZzmOYaBU2qKWCw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im; spf=pass smtp.mailfrom=pks.im; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b=sWj2IDgj; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=G4N5mlhF; arc=none smtp.client-ip=103.168.172.152 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pks.im Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b="sWj2IDgj"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="G4N5mlhF" Received: from phl-compute-01.internal (phl-compute-01.phl.internal [10.202.2.41]) by mailfhigh.phl.internal (Postfix) with ESMTP id 58E701140201; Mon, 27 Jan 2025 08:04:19 -0500 (EST) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-01.internal (MEProxy); Mon, 27 Jan 2025 08:04:19 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pks.im; h=cc:cc :content-transfer-encoding:content-type:content-type:date:date :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm3; t=1737983059; x=1738069459; bh=OX7TtIP6uvImCavOgAuwk2ZK66HkAEPH4PAUW1rGZn8=; b= sWj2IDgjCVd0X/hCPiLoEFrB87w1zHfUH2OazKsB96DABH1FH1pioeKT+lUY286X dEVUVi32vTUTH9ovCQ8+pDdHWGeU7HVYMeELdu6IZ5c2n/ob9ZT/8KecV8HlU9Dg VUke4j1o15MfHma3ordjUaOaCc2bFgBP5qO99VrRroqQSN8e62d052w4JzUVresB VLMVKGx5LpT8Ea8L1OKVz9/Gom6iWCSjnymqQx+vVrn+mxmYL7jjZTY+Azre+jsa Mpw26szsrF7z3VQTINMIjMROMfS1LYr+JUbRhKn2SgpG9Ruz0XbHAuZFI7FeTdyp /O1H/BE96qZUpW5QapTy6A== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1737983059; x= 1738069459; bh=OX7TtIP6uvImCavOgAuwk2ZK66HkAEPH4PAUW1rGZn8=; b=G 4N5mlhF0r9CNrjmUQElizTlNGds/wK7t37m/A7IvmseJNflGURu89nWtb61nH0MZ +dJ+ciIwN9iYAZqj4viPosT3XxgbgRwIfqXJfL8I8Oos0fJwkDZuIk0Z4KRqTd9e jtgDtiwX2RfS5GWxv2SX64hmX7gx36LCouwjC9SlsM8hOVvjaMlDN+drDYqiBBv2 3ikTG6akayYfFofGX8YTckSIh96jD49o2bxJNkuXnD97BO+VtPOuknsGrosTGRdk FOCAeCX7J0lOwlcDKYnKtGY1e8d7Q9XVgTVS/9N6CP/zPoG+pL+YczRHKxtIw93+ 9I5nLx0e0kmT8WqUq6Gvw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefuddrudejgedgudefvdegucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdggtfgfnhhsuhgsshgtrhhisggv pdfurfetoffkrfgpnffqhgenuceurghilhhouhhtmecufedttdenucesvcftvggtihhpih gvnhhtshculddquddttddmnecujfgurhephfffufggtgfgkfhfjgfvvefosehtjeertder tdejnecuhfhrohhmpefrrghtrhhitghkucfuthgvihhnhhgrrhguthcuoehpshesphhksh drihhmqeenucggtffrrghtthgvrhhnpeffueeiudejvdekheeuvdekfeffiedvueelteek udehjeetkeegvddugfdtgfeileenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmh epmhgrihhlfhhrohhmpehpshesphhkshdrihhmpdhnsggprhgtphhtthhopedvpdhmohgu vgepshhmthhpohhuthdprhgtphhtthhopegvthhhohhmshhonhesvggufigrrhguthhhoh hmshhonhdrtghomhdprhgtphhtthhopehgihhtsehvghgvrhdrkhgvrhhnvghlrdhorhhg X-ME-Proxy: Feedback-ID: i197146af:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 27 Jan 2025 08:04:18 -0500 (EST) Received: by vm-mail (OpenSMTPD) with ESMTPSA id 148524c2 (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Mon, 27 Jan 2025 13:04:17 +0000 (UTC) From: Patrick Steinhardt Date: Mon, 27 Jan 2025 14:04:12 +0100 Subject: [PATCH 04/19] reftable/record: stop using `COPY_ARRAY()` Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250127-pks-reftable-drop-git-compat-util-v1-4-6e280a564877@pks.im> References: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> In-Reply-To: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> To: git@vger.kernel.org Cc: Edward Thomson X-Mailer: b4 0.14.2 Drop our use of `COPY_ARRAY()`, replacing it with an open-coded variant thereof. This is done to reduce our dependency on the Git library. Signed-off-by: Patrick Steinhardt --- reftable/record.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reftable/record.c b/reftable/record.c index 8919df8a4d..d1664c47ca 100644 --- a/reftable/record.c +++ b/reftable/record.c @@ -508,7 +508,8 @@ static int reftable_obj_record_copy_from(void *rec, const void *src_rec, if (!obj->offsets) return REFTABLE_OUT_OF_MEMORY_ERROR; obj->offset_len = src->offset_len; - COPY_ARRAY(obj->offsets, src->offsets, src->offset_len); + if (src->offset_len) + memcpy(obj->offsets, src->offsets, sizeof(*src->offsets) * src->offset_len); return 0; } From patchwork Mon Jan 27 13:04:13 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Steinhardt X-Patchwork-Id: 13951354 Received: from fhigh-a1-smtp.messagingengine.com (fhigh-a1-smtp.messagingengine.com [103.168.172.152]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2A0CC1FF1A8 for ; Mon, 27 Jan 2025 13:04:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.152 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983063; cv=none; b=oohA13jZGMsuE0BqUol1+mwh4Wvej2/k8QMfvNUJtt48mF2k5VxqiessmuXF6VDsiFxSOddBLKJaYUoTSd3s4jfsBRYK7rMfUcwrjM9C5+/KZl6RcjP9iR+cam6nhR//0OS0tecXT7XCET0rzdO2Bb9rBciU81biZmwXkAlEgV4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983063; c=relaxed/simple; bh=ihLF34Kh3KEFnHLYIyJ4ZIKsd32TWzp4NSq8yVDamWU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=oVuxcVcAiCvwh212WAjS/t9Jf9V7oL6nBcsftm+/PlIa1aJLoNkSB+oN+HnN8aeTXdRpu8qq0aOdoIExbcQhvSmLikD+CvgyNdrea6DSf0iYJhGQ1FReQbFgBIazQzBlaBL56HkU8c0e5XkXk4Dn77tTu43+vFa+b4f587XETVg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im; spf=pass smtp.mailfrom=pks.im; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b=DSLlOi5x; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=S5WksFB1; arc=none smtp.client-ip=103.168.172.152 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pks.im Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b="DSLlOi5x"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="S5WksFB1" Received: from phl-compute-01.internal (phl-compute-01.phl.internal [10.202.2.41]) by mailfhigh.phl.internal (Postfix) with ESMTP id 25BC11140235; Mon, 27 Jan 2025 08:04:20 -0500 (EST) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-01.internal (MEProxy); Mon, 27 Jan 2025 08:04:20 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pks.im; h=cc:cc :content-transfer-encoding:content-type:content-type:date:date :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm3; t=1737983060; x=1738069460; bh=b+Euunc3x+y+OvvlvQau2yVS5rSSELXS6sZ42aQZK0g=; b= DSLlOi5xCvL+xgbvgPI+tUxVVI2/crzhinppNfINigWv9f5+PUr+APPwuLTMDhqt yQw2bC3OExXMA4spAMSuF4id7uPnRIFtxSD5L5rAqK/WOFZqxF7HIvOl4nK/GG4u 9jh/QtM4sV2ctjvm4YmiueJ1fe7KNiymbxHUDAcpec6tRUiaEdxnL1zcM4AwtpFF jp2EzsOXaClWijPkAY04NvxLk759Q7OFp6uv/S2xmBeZbW5cNx6mzq+kE+m3NeXx 3GmXOqEGr2JvKBWCryT9fkS+ePHzlm2npPW+b8PxAhYkTECjLP7m3W2DuRD1CIfg vErj11nNUP+pB7DgP9G0mA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1737983060; x= 1738069460; bh=b+Euunc3x+y+OvvlvQau2yVS5rSSELXS6sZ42aQZK0g=; b=S 5WksFB1e6pFl5e3oZIRGFpRbkHmOjGE+0oj0ZhyPtIxCIycEC8RyY6jmBhIxbBI0 CPo7KEIymRtvLWdP6Jr0Rz++I+pObjyZBj1vDnweqXs6a0LlK+zlaYniVkR6WRim WvemJU9OY5Lv71Vni0kd4rUrgerAfEXrNnUufKwJcfB2A8r/uRunKjUjN/rEqpyp gV3vmqkr+I4ddtkYafJbFtT+0jyaaZoBfzLaPvuyOZc8XENhjOwb6JZncsq2dbMy x4c+CCSASzRu3JNT8jpPAWbFACbESvlyAfq+Zs2fIzLT9B4X9X4eFsK4yHwGQoxZ r8P+Z6SmbsYVzobuBEhBw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefuddrudejgedgudefvdegucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdggtfgfnhhsuhgsshgtrhhisggv pdfurfetoffkrfgpnffqhgenuceurghilhhouhhtmecufedttdenucesvcftvggtihhpih gvnhhtshculddquddttddmnecujfgurhephfffufggtgfgkfhfjgfvvefosehtjeertder tdejnecuhfhrohhmpefrrghtrhhitghkucfuthgvihhnhhgrrhguthcuoehpshesphhksh drihhmqeenucggtffrrghtthgvrhhnpeffueeiudejvdekheeuvdekfeffiedvueelteek udehjeetkeegvddugfdtgfeileenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmh epmhgrihhlfhhrohhmpehpshesphhkshdrihhmpdhnsggprhgtphhtthhopedvpdhmohgu vgepshhmthhpohhuthdprhgtphhtthhopegvthhhohhmshhonhesvggufigrrhguthhhoh hmshhonhdrtghomhdprhgtphhtthhopehgihhtsehvghgvrhdrkhgvrhhnvghlrdhorhhg X-ME-Proxy: Feedback-ID: i197146af:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 27 Jan 2025 08:04:19 -0500 (EST) Received: by vm-mail (OpenSMTPD) with ESMTPSA id 42bdcd3b (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Mon, 27 Jan 2025 13:04:18 +0000 (UTC) From: Patrick Steinhardt Date: Mon, 27 Jan 2025 14:04:13 +0100 Subject: [PATCH 05/19] reftable/record: stop using `BUG()` in `reftable_record_init()` Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250127-pks-reftable-drop-git-compat-util-v1-5-6e280a564877@pks.im> References: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> In-Reply-To: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> To: git@vger.kernel.org Cc: Edward Thomson X-Mailer: b4 0.14.2 We're aborting the program via `BUG()` in case `reftable_record_init()` was invoked with an unknown record type. This is bad because we may now die in library code, and because it makes us depend on the Git codebase. Refactor the code such that `reftable_record_init()` can return an error code to the caller. Adapt any callers accordingly. Signed-off-by: Patrick Steinhardt --- reftable/block.c | 4 +++- reftable/merged.c | 5 ++++- reftable/reader.c | 5 ++++- reftable/record.c | 8 ++++---- reftable/record.h | 4 ++-- t/unit-tests/t-reftable-pq.c | 6 +++--- t/unit-tests/t-reftable-record.c | 2 +- 7 files changed, 21 insertions(+), 13 deletions(-) diff --git a/reftable/block.c b/reftable/block.c index 8ac865ce78..255d566854 100644 --- a/reftable/block.c +++ b/reftable/block.c @@ -509,7 +509,9 @@ int block_iter_seek_key(struct block_iter *it, const struct block_reader *br, it->block_len = br->block_len; it->hash_size = br->hash_size; - reftable_record_init(&rec, block_reader_type(br)); + err = reftable_record_init(&rec, block_reader_type(br)); + if (err < 0) + goto done; /* * We're looking for the last entry less than the wanted key so that diff --git a/reftable/merged.c b/reftable/merged.c index e72b39e178..4156eec07f 100644 --- a/reftable/merged.c +++ b/reftable/merged.c @@ -253,7 +253,10 @@ int merged_table_init_iter(struct reftable_merged_table *mt, } for (size_t i = 0; i < mt->readers_len; i++) { - reftable_record_init(&subiters[i].rec, typ); + ret = reftable_record_init(&subiters[i].rec, typ); + if (ret < 0) + goto out; + ret = reader_init_iter(mt->readers[i], &subiters[i].iter, typ); if (ret < 0) goto out; diff --git a/reftable/reader.c b/reftable/reader.c index 3f2e4b2800..de6e6dd932 100644 --- a/reftable/reader.c +++ b/reftable/reader.c @@ -360,7 +360,10 @@ static int table_iter_seek_linear(struct table_iter *ti, struct reftable_record rec; int err; - reftable_record_init(&rec, reftable_record_type(want)); + err = reftable_record_init(&rec, reftable_record_type(want)); + if (err < 0) + goto done; + err = reftable_record_key(want, &want_key); if (err < 0) goto done; diff --git a/reftable/record.c b/reftable/record.c index d1664c47ca..31985bb977 100644 --- a/reftable/record.c +++ b/reftable/record.c @@ -1301,7 +1301,7 @@ reftable_record_vtable(struct reftable_record *rec) abort(); } -void reftable_record_init(struct reftable_record *rec, uint8_t typ) +int reftable_record_init(struct reftable_record *rec, uint8_t typ) { memset(rec, 0, sizeof(*rec)); rec->type = typ; @@ -1310,11 +1310,11 @@ void reftable_record_init(struct reftable_record *rec, uint8_t typ) case BLOCK_TYPE_REF: case BLOCK_TYPE_LOG: case BLOCK_TYPE_OBJ: - return; + return 0; case BLOCK_TYPE_INDEX: reftable_buf_init(&rec->u.idx.last_key); - return; + return 0; default: - BUG("unhandled record type"); + return REFTABLE_API_ERROR; } } diff --git a/reftable/record.h b/reftable/record.h index c7755a4d75..e1846c294b 100644 --- a/reftable/record.h +++ b/reftable/record.h @@ -130,8 +130,8 @@ struct reftable_record { } u; }; -/* Initialize the reftable record for the given type */ -void reftable_record_init(struct reftable_record *rec, uint8_t typ); +/* Initialize the reftable record for the given type. */ +int reftable_record_init(struct reftable_record *rec, uint8_t typ); /* see struct record_vtable */ int reftable_record_cmp(struct reftable_record *a, struct reftable_record *b); diff --git a/t/unit-tests/t-reftable-pq.c b/t/unit-tests/t-reftable-pq.c index f3f8a0cdf3..d8a4c283a1 100644 --- a/t/unit-tests/t-reftable-pq.c +++ b/t/unit-tests/t-reftable-pq.c @@ -32,7 +32,7 @@ static void t_pq_record(void) char *last = NULL; for (i = 0; i < N; i++) { - reftable_record_init(&recs[i], BLOCK_TYPE_REF); + check(!reftable_record_init(&recs[i], BLOCK_TYPE_REF)); recs[i].u.ref.refname = xstrfmt("%02"PRIuMAX, (uintmax_t)i); } @@ -72,7 +72,7 @@ static void t_pq_index(void) size_t N = ARRAY_SIZE(recs), i; for (i = 0; i < N; i++) { - reftable_record_init(&recs[i], BLOCK_TYPE_REF); + check(!reftable_record_init(&recs[i], BLOCK_TYPE_REF)); recs[i].u.ref.refname = (char *) "refs/heads/master"; } @@ -111,7 +111,7 @@ static void t_merged_iter_pqueue_top(void) size_t N = ARRAY_SIZE(recs), i; for (i = 0; i < N; i++) { - reftable_record_init(&recs[i], BLOCK_TYPE_REF); + check(!reftable_record_init(&recs[i], BLOCK_TYPE_REF)); recs[i].u.ref.refname = (char *) "refs/heads/master"; } diff --git a/t/unit-tests/t-reftable-record.c b/t/unit-tests/t-reftable-record.c index d49d2a2729..6540bd20e3 100644 --- a/t/unit-tests/t-reftable-record.c +++ b/t/unit-tests/t-reftable-record.c @@ -17,7 +17,7 @@ static void t_copy(struct reftable_record *rec) uint8_t typ; typ = reftable_record_type(rec); - reftable_record_init(©, typ); + check(!reftable_record_init(©, typ)); reftable_record_copy_from(©, rec, REFTABLE_HASH_SIZE_SHA1); /* do it twice to catch memory leaks */ reftable_record_copy_from(©, rec, REFTABLE_HASH_SIZE_SHA1); From patchwork Mon Jan 27 13:04:14 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Steinhardt X-Patchwork-Id: 13951355 Received: from fout-a5-smtp.messagingengine.com (fout-a5-smtp.messagingengine.com [103.168.172.148]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5FB861FF1BC for ; Mon, 27 Jan 2025 13:04:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.148 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983063; cv=none; b=hetjzIcamQBaR1MEAguddftgWIt1lh3Ev5kqkDd104x8getLl9bddfx6rHqaEjKXTlcwg33wMCp0oEGbC3sSmev9da7dpCBoDSD+jn4tgt39KJ04hE6BM7FKhOdAHXbJpqfgdVcxxgwaQWoSrs8l3TBy0O3+nl/lBjhj3LEMCb0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983063; c=relaxed/simple; bh=L953HGPNk+1jtwwhd2q6Ss3yTTROwmOcJHLl5l0dfoI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=EmT2Qe0g2kkcrzflMnUBMmpcSIlCPg8YF6d1rarebFsTuc4ftjwOBeHSB8Oq3fHfsC1OXk/d8axVsclMyS2VWVaRHH2/tBi1/yyBg8sfL8SzA3+20z4kjtn7MP13NendGlPUqlyTkbtM58LB3xJqDiD+HiDEwiQdhCKUwJ5yKkI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im; spf=pass smtp.mailfrom=pks.im; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b=JKtp3bya; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=jNIRyJtI; arc=none smtp.client-ip=103.168.172.148 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pks.im Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b="JKtp3bya"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="jNIRyJtI" Received: from phl-compute-01.internal (phl-compute-01.phl.internal [10.202.2.41]) by mailfout.phl.internal (Postfix) with ESMTP id 555381380B15; Mon, 27 Jan 2025 08:04:20 -0500 (EST) Received: from phl-mailfrontend-01 ([10.202.2.162]) by phl-compute-01.internal (MEProxy); Mon, 27 Jan 2025 08:04:20 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pks.im; h=cc:cc :content-transfer-encoding:content-type:content-type:date:date :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm3; t=1737983060; x=1738069460; bh=iYbKRoSUlZkpy3LHSWUcb21gn/ksnYz332/c3r3JPWE=; b= JKtp3byaaOXtkJthWis9eXQ2RvOlEto8NP/FYJ5Hf0Z/CVVYRVsX2XTANIWBLBLv 2fLCkkP0z7sGz6nBKO4o9la7aogcAWeIHYRDaN2ZZ7vltJ+EY8nOyJPlPsneFt9k a8jMc/KSbY277oG6mgBe5dlh44BdteprPg2/y5562kWF09vqCefnxwmOyWcqRyy2 oNPLZpWRWF5xeCIochDtxDRQ0IL1aVpVdWHjNFkbM39tXfoUxjpiN83sjGi5xcpK I+aOt/XMATFM6z0Yy/WRX/TXJrMHbd3yFQHx0ow131hI9mhOTOXdxhApHMsPdzrj VBwMAa7k6SMMcpe0bY6s6Q== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1737983060; x= 1738069460; bh=iYbKRoSUlZkpy3LHSWUcb21gn/ksnYz332/c3r3JPWE=; b=j NIRyJtIMy1NZssdaQZ+1aPawSAPsyCJY1rRNaOsMlZ4ARKLcOQALo5GZpgrdG4nN aVHL3koM09dQ4lS5xITd0CSad+l6an0zM8d8BQQnAbHip1ScdTKgpuNq4wWrTMKs qkktqeLnJVG4j/3tnIb7NI5aL6Sx1MSZ6lOf8hOxV/FCXbScn8aMkJL/cCK/+q1D rmLl9/EjAPiFLteQzzeX3dOwmPeOV/XKcs+GqyPre/PlRRUMhpHZnz6Rlpd77fKY 6sXA/+54rv3PSmZJNfFCFhOt7FJYFA3KzyQ1EUe6Ye+AB/klMCnfx1exqFqlblGf t7NuEo4ItzEZeAufSqeWw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefuddrudejgedgudefvdegucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdggtfgfnhhsuhgsshgtrhhisggv pdfurfetoffkrfgpnffqhgenuceurghilhhouhhtmecufedttdenucesvcftvggtihhpih gvnhhtshculddquddttddmnecujfgurhephfffufggtgfgkfhfjgfvvefosehtjeertder tdejnecuhfhrohhmpefrrghtrhhitghkucfuthgvihhnhhgrrhguthcuoehpshesphhksh drihhmqeenucggtffrrghtthgvrhhnpeffueeiudejvdekheeuvdekfeffiedvueelteek udehjeetkeegvddugfdtgfeileenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmh epmhgrihhlfhhrohhmpehpshesphhkshdrihhmpdhnsggprhgtphhtthhopedvpdhmohgu vgepshhmthhpohhuthdprhgtphhtthhopehgihhtsehvghgvrhdrkhgvrhhnvghlrdhorh hgpdhrtghpthhtohepvghthhhomhhsohhnsegvugifrghrughthhhomhhsohhnrdgtohhm X-ME-Proxy: Feedback-ID: i197146af:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 27 Jan 2025 08:04:19 -0500 (EST) Received: by vm-mail (OpenSMTPD) with ESMTPSA id 494c20cd (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Mon, 27 Jan 2025 13:04:18 +0000 (UTC) From: Patrick Steinhardt Date: Mon, 27 Jan 2025 14:04:14 +0100 Subject: [PATCH 06/19] reftable/record: don't `BUG()` in `reftable_record_cmp()` Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250127-pks-reftable-drop-git-compat-util-v1-6-6e280a564877@pks.im> References: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> In-Reply-To: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> To: git@vger.kernel.org Cc: Edward Thomson X-Mailer: b4 0.14.2 The refatble library aborts with a bug in case `reftable_record_cmp()` is invoked with two records of differing types. This would cause the program to die without the caller being able to handle the error, which is not something we want in the context of library code. And it ties us to the Git codebase. Refactor the code such that `reftable_record_cmp()` returns an error code separate from the actual comparison result. This requires us to also adapt some callers up the callchain in a similar fashion. Signed-off-by: Patrick Steinhardt --- reftable/merged.c | 20 +++++++++++++++----- reftable/pq.c | 36 +++++++++++++++++++++++++++++------- reftable/pq.h | 2 +- reftable/record.c | 10 ++++++---- reftable/record.h | 2 +- t/unit-tests/t-reftable-pq.c | 16 ++++++++++++---- t/unit-tests/t-reftable-record.c | 40 ++++++++++++++++++++++++++++------------ 7 files changed, 92 insertions(+), 34 deletions(-) diff --git a/reftable/merged.c b/reftable/merged.c index 4156eec07f..563864068c 100644 --- a/reftable/merged.c +++ b/reftable/merged.c @@ -66,8 +66,11 @@ static int merged_iter_seek(struct merged_iter *mi, struct reftable_record *want int err; mi->advance_index = -1; - while (!merged_iter_pqueue_is_empty(mi->pq)) - merged_iter_pqueue_remove(&mi->pq); + while (!merged_iter_pqueue_is_empty(mi->pq)) { + err = merged_iter_pqueue_remove(&mi->pq, NULL); + if (err < 0) + return err; + } for (size_t i = 0; i < mi->subiters_len; i++) { err = iterator_seek(&mi->subiters[i].iter, want); @@ -120,7 +123,9 @@ static int merged_iter_next_entry(struct merged_iter *mi, if (empty) return 1; - entry = merged_iter_pqueue_remove(&mi->pq); + err = merged_iter_pqueue_remove(&mi->pq, &entry); + if (err < 0) + return err; /* One can also use reftable as datacenter-local storage, where the ref @@ -134,11 +139,16 @@ static int merged_iter_next_entry(struct merged_iter *mi, struct pq_entry top = merged_iter_pqueue_top(mi->pq); int cmp; - cmp = reftable_record_cmp(top.rec, entry.rec); + err = reftable_record_cmp(top.rec, entry.rec, &cmp); + if (err < 0) + return err; if (cmp > 0) break; - merged_iter_pqueue_remove(&mi->pq); + err = merged_iter_pqueue_remove(&mi->pq, NULL); + if (err < 0) + return err; + err = merged_iter_advance_subiter(mi, top.index); if (err < 0) return err; diff --git a/reftable/pq.c b/reftable/pq.c index 5591e875e1..ef8035cfd9 100644 --- a/reftable/pq.c +++ b/reftable/pq.c @@ -15,13 +15,18 @@ license that can be found in the LICENSE file or at int pq_less(struct pq_entry *a, struct pq_entry *b) { - int cmp = reftable_record_cmp(a->rec, b->rec); + int cmp, err; + + err = reftable_record_cmp(a->rec, b->rec, &cmp); + if (err < 0) + return err; + if (cmp == 0) return a->index > b->index; return cmp < 0; } -struct pq_entry merged_iter_pqueue_remove(struct merged_iter_pqueue *pq) +int merged_iter_pqueue_remove(struct merged_iter_pqueue *pq, struct pq_entry *out) { size_t i = 0; struct pq_entry e = pq->heap[0]; @@ -32,17 +37,34 @@ struct pq_entry merged_iter_pqueue_remove(struct merged_iter_pqueue *pq) size_t min = i; size_t j = 2 * i + 1; size_t k = 2 * i + 2; - if (j < pq->len && pq_less(&pq->heap[j], &pq->heap[i])) - min = j; - if (k < pq->len && pq_less(&pq->heap[k], &pq->heap[min])) - min = k; + int cmp; + + if (j < pq->len) { + cmp = pq_less(&pq->heap[j], &pq->heap[i]); + if (cmp < 0) + return -1; + else if (cmp) + min = j; + } + + if (k < pq->len) { + cmp = pq_less(&pq->heap[k], &pq->heap[min]); + if (cmp < 0) + return -1; + else if (cmp) + min = k; + } + if (min == i) break; SWAP(pq->heap[i], pq->heap[min]); i = min; } - return e; + if (out) + *out = e; + + return 0; } int merged_iter_pqueue_add(struct merged_iter_pqueue *pq, const struct pq_entry *e) diff --git a/reftable/pq.h b/reftable/pq.h index 83c062eeca..ff39016445 100644 --- a/reftable/pq.h +++ b/reftable/pq.h @@ -22,7 +22,7 @@ struct merged_iter_pqueue { size_t cap; }; -struct pq_entry merged_iter_pqueue_remove(struct merged_iter_pqueue *pq); +int merged_iter_pqueue_remove(struct merged_iter_pqueue *pq, struct pq_entry *out); int merged_iter_pqueue_add(struct merged_iter_pqueue *pq, const struct pq_entry *e); void merged_iter_pqueue_release(struct merged_iter_pqueue *pq); int pq_less(struct pq_entry *a, struct pq_entry *b); diff --git a/reftable/record.c b/reftable/record.c index 31985bb977..da550494a2 100644 --- a/reftable/record.c +++ b/reftable/record.c @@ -1190,12 +1190,14 @@ int reftable_record_is_deletion(struct reftable_record *rec) reftable_record_data(rec)); } -int reftable_record_cmp(struct reftable_record *a, struct reftable_record *b) +int reftable_record_cmp(struct reftable_record *a, struct reftable_record *b, + int *cmp) { if (a->type != b->type) - BUG("cannot compare reftable records of different type"); - return reftable_record_vtable(a)->cmp( - reftable_record_data(a), reftable_record_data(b)); + return -1; + *cmp = reftable_record_vtable(a)->cmp(reftable_record_data(a), + reftable_record_data(b)); + return 0; } int reftable_record_equal(struct reftable_record *a, struct reftable_record *b, uint32_t hash_size) diff --git a/reftable/record.h b/reftable/record.h index e1846c294b..867810a932 100644 --- a/reftable/record.h +++ b/reftable/record.h @@ -134,7 +134,7 @@ struct reftable_record { int reftable_record_init(struct reftable_record *rec, uint8_t typ); /* see struct record_vtable */ -int reftable_record_cmp(struct reftable_record *a, struct reftable_record *b); +int reftable_record_cmp(struct reftable_record *a, struct reftable_record *b, int *cmp); int reftable_record_equal(struct reftable_record *a, struct reftable_record *b, uint32_t hash_size); int reftable_record_key(struct reftable_record *rec, struct reftable_buf *dest); int reftable_record_copy_from(struct reftable_record *rec, diff --git a/t/unit-tests/t-reftable-pq.c b/t/unit-tests/t-reftable-pq.c index d8a4c283a1..c128fe8616 100644 --- a/t/unit-tests/t-reftable-pq.c +++ b/t/unit-tests/t-reftable-pq.c @@ -21,7 +21,9 @@ static void merged_iter_pqueue_check(const struct merged_iter_pqueue *pq) static int pq_entry_equal(struct pq_entry *a, struct pq_entry *b) { - return !reftable_record_cmp(a->rec, b->rec) && (a->index == b->index); + int cmp; + check(!reftable_record_cmp(a->rec, b->rec, &cmp)); + return !cmp && (a->index == b->index); } static void t_pq_record(void) @@ -49,7 +51,9 @@ static void t_pq_record(void) while (!merged_iter_pqueue_is_empty(pq)) { struct pq_entry top = merged_iter_pqueue_top(pq); - struct pq_entry e = merged_iter_pqueue_remove(&pq); + struct pq_entry e; + + check(!merged_iter_pqueue_remove(&pq, &e)); merged_iter_pqueue_check(&pq); check(pq_entry_equal(&top, &e)); @@ -90,7 +94,9 @@ static void t_pq_index(void) for (i = N - 1; i > 0; i--) { struct pq_entry top = merged_iter_pqueue_top(pq); - struct pq_entry e = merged_iter_pqueue_remove(&pq); + struct pq_entry e; + + check(!merged_iter_pqueue_remove(&pq, &e)); merged_iter_pqueue_check(&pq); check(pq_entry_equal(&top, &e)); @@ -129,7 +135,9 @@ static void t_merged_iter_pqueue_top(void) for (i = N - 1; i > 0; i--) { struct pq_entry top = merged_iter_pqueue_top(pq); - struct pq_entry e = merged_iter_pqueue_remove(&pq); + struct pq_entry e; + + check(!merged_iter_pqueue_remove(&pq, &e)); merged_iter_pqueue_check(&pq); check(pq_entry_equal(&top, &e)); diff --git a/t/unit-tests/t-reftable-record.c b/t/unit-tests/t-reftable-record.c index 6540bd20e3..5954966373 100644 --- a/t/unit-tests/t-reftable-record.c +++ b/t/unit-tests/t-reftable-record.c @@ -100,16 +100,20 @@ static void t_reftable_ref_record_comparison(void) .u.ref.value.symref = (char *) "refs/heads/master", }, }; + int cmp; check(!reftable_record_equal(&in[0], &in[1], REFTABLE_HASH_SIZE_SHA1)); - check(!reftable_record_cmp(&in[0], &in[1])); + check(!reftable_record_cmp(&in[0], &in[1], &cmp)); + check(!cmp); check(!reftable_record_equal(&in[1], &in[2], REFTABLE_HASH_SIZE_SHA1)); - check_int(reftable_record_cmp(&in[1], &in[2]), >, 0); + check(!reftable_record_cmp(&in[1], &in[2], &cmp)); + check_int(cmp, >, 0); in[1].u.ref.value_type = in[0].u.ref.value_type; check(reftable_record_equal(&in[0], &in[1], REFTABLE_HASH_SIZE_SHA1)); - check(!reftable_record_cmp(&in[0], &in[1])); + check(!reftable_record_cmp(&in[0], &in[1], &cmp)); + check(!cmp); } static void t_reftable_ref_record_compare_name(void) @@ -209,17 +213,20 @@ static void t_reftable_log_record_comparison(void) .u.log.update_index = 22, }, }; + int cmp; check(!reftable_record_equal(&in[0], &in[1], REFTABLE_HASH_SIZE_SHA1)); check(!reftable_record_equal(&in[1], &in[2], REFTABLE_HASH_SIZE_SHA1)); - check_int(reftable_record_cmp(&in[1], &in[2]), >, 0); + check(!reftable_record_cmp(&in[1], &in[2], &cmp)); + check_int(cmp, >, 0); /* comparison should be reversed for equal keys, because * comparison is now performed on the basis of update indices */ - check_int(reftable_record_cmp(&in[0], &in[1]), <, 0); + check(!reftable_record_cmp(&in[0], &in[1], &cmp)); + check_int(cmp, <, 0); in[1].u.log.update_index = in[0].u.log.update_index; check(reftable_record_equal(&in[0], &in[1], REFTABLE_HASH_SIZE_SHA1)); - check(!reftable_record_cmp(&in[0], &in[1])); + check(!reftable_record_cmp(&in[0], &in[1], &cmp)); } static void t_reftable_log_record_compare_key(void) @@ -396,16 +403,20 @@ static void t_reftable_obj_record_comparison(void) .u.obj.hash_prefix_len = 5, }, }; + int cmp; check(!reftable_record_equal(&in[0], &in[1], REFTABLE_HASH_SIZE_SHA1)); - check(!reftable_record_cmp(&in[0], &in[1])); + check(!reftable_record_cmp(&in[0], &in[1], &cmp)); + check(!cmp); check(!reftable_record_equal(&in[1], &in[2], REFTABLE_HASH_SIZE_SHA1)); - check_int(reftable_record_cmp(&in[1], &in[2]), >, 0); + check(!reftable_record_cmp(&in[1], &in[2], &cmp)); + check_int(cmp, >, 0); in[1].u.obj.offset_len = in[0].u.obj.offset_len; check(reftable_record_equal(&in[0], &in[1], REFTABLE_HASH_SIZE_SHA1)); - check(!reftable_record_cmp(&in[0], &in[1])); + check(!reftable_record_cmp(&in[0], &in[1], &cmp)); + check(!cmp); } static void t_reftable_obj_record_roundtrip(void) @@ -486,19 +497,24 @@ static void t_reftable_index_record_comparison(void) .u.idx.last_key = REFTABLE_BUF_INIT, }, }; + int cmp; + check(!reftable_buf_addstr(&in[0].u.idx.last_key, "refs/heads/master")); check(!reftable_buf_addstr(&in[1].u.idx.last_key, "refs/heads/master")); check(!reftable_buf_addstr(&in[2].u.idx.last_key, "refs/heads/branch")); check(!reftable_record_equal(&in[0], &in[1], REFTABLE_HASH_SIZE_SHA1)); - check(!reftable_record_cmp(&in[0], &in[1])); + check(!reftable_record_cmp(&in[0], &in[1], &cmp)); + check(!cmp); check(!reftable_record_equal(&in[1], &in[2], REFTABLE_HASH_SIZE_SHA1)); - check_int(reftable_record_cmp(&in[1], &in[2]), >, 0); + check(!reftable_record_cmp(&in[1], &in[2], &cmp)); + check_int(cmp, >, 0); in[1].u.idx.offset = in[0].u.idx.offset; check(reftable_record_equal(&in[0], &in[1], REFTABLE_HASH_SIZE_SHA1)); - check(!reftable_record_cmp(&in[0], &in[1])); + check(!reftable_record_cmp(&in[0], &in[1], &cmp)); + check(!cmp); for (size_t i = 0; i < ARRAY_SIZE(in); i++) reftable_record_release(&in[i]); From patchwork Mon Jan 27 13:04:15 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Steinhardt X-Patchwork-Id: 13951356 Received: from fhigh-a1-smtp.messagingengine.com (fhigh-a1-smtp.messagingengine.com [103.168.172.152]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 2907E1FF609 for ; Mon, 27 Jan 2025 13:04:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.152 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983063; cv=none; b=KLhHvAafsJ0MGftB+U9VVf9lzK1Fl9pcArMsttpfDF2097TZxppsg54jC/ZJrzbZQWi4YZjDiGHVPrRKPLkwzq6J2XHClvGSikB9Cd1NQwf4o0pwLMyr/ajuD8MCKXAFmKtRv66weDB1UGYUhzoeed21nsSmN4eAV7SEaQRRJQ8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983063; c=relaxed/simple; bh=Xj0t7OUm0FAA2j2ZiRD0dBNHYUM+0vpI1xBwvt+7UYE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GtS2wwPyEF8stV0teypSBcAsR049ZRMpaqqNMGK8tomImJrZopmx6tqLGC4Jh3aAzrOMDvHYQ1WHR4G8Vcn8BVwuaF/qp3xvFpOLHcJJKjpbfjFmS2kkEV4n0rqy37XkfqjU1V+x3JLPeEjMBkK0wlX3DM2AKg5FzsUhrxgfq38= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im; spf=pass smtp.mailfrom=pks.im; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b=lGJArUMn; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=t5czppvk; arc=none smtp.client-ip=103.168.172.152 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pks.im Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b="lGJArUMn"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="t5czppvk" Received: from phl-compute-11.internal (phl-compute-11.phl.internal [10.202.2.51]) by mailfhigh.phl.internal (Postfix) with ESMTP id 2DDD51140236; Mon, 27 Jan 2025 08:04:21 -0500 (EST) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-11.internal (MEProxy); Mon, 27 Jan 2025 08:04:21 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pks.im; h=cc:cc :content-transfer-encoding:content-type:content-type:date:date :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm3; t=1737983061; x=1738069461; bh=Ojg+QT7n1TKpobEbDjVPCkYXS12/+9O7UADZnn1jQ9c=; b= lGJArUMnna/ibaCy0Hbj4fiH1cZYOYP6Tl55LfnmWYRI8o/a89WmVZIUKl7GsAM0 7ytGGxBSlk5YjDCOsua3bVF/jGQ7B6tcby8K1VOGc+G3AwJjRBeyc9lYn1REOgkH hux+XuyzUfEjCBK1OcYW2VbsQBS+qs+ikYGGDRPIa538dYPgRV2Z3lZSmj74N6uD rjoyn51GavUQPM9hPiyjZPxkYP/1/eMBMdjb/9xxCWJSCOibb0Xei1pQLRroyPcE VcDvyQw2JA0tg8FrqhNHTmeiICGApFDjA0s6ctsk8jssGlo4eeUMG14R7LYboGXE UGXJSV+Q897sqhXtyb6KdA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1737983061; x= 1738069461; bh=Ojg+QT7n1TKpobEbDjVPCkYXS12/+9O7UADZnn1jQ9c=; b=t 5czppvk9uKJu3LNp8YipiKtMd0aF4tT02g2cBd2fSIg+LVmm+YtkPiqsJC5xG1Dv ZMgSmC0Rixraj2/QBsfZJ2s9h7JA3b4uC2ASUHlSHIB26fseOMkfuByNRJ21hI9g GElJh0IFihGLV7qRggOZKAQJ1ZZYo4c4q9I6LLhp28yuW8dVuLCflV2OKzy42m3G f+pJSHFMxLnm7AxC2RJsQKoF9OD1BhHj69DGnVfPm2PTvVxeVNh3b5f+r7WljJUV uVpu74D/ZEZVjlwoGcxXoDjGO/6200gqmxaNmEB7OktTtcQXzP/qBfX1Zd0hnIqN aSgK04dqycMbx6YNH1HTQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefuddrudejgedgudefvdegucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdggtfgfnhhsuhgsshgtrhhisggv pdfurfetoffkrfgpnffqhgenuceurghilhhouhhtmecufedttdenucesvcftvggtihhpih gvnhhtshculddquddttddmnecujfgurhephfffufggtgfgkfhfjgfvvefosehtjeertder tdejnecuhfhrohhmpefrrghtrhhitghkucfuthgvihhnhhgrrhguthcuoehpshesphhksh drihhmqeenucggtffrrghtthgvrhhnpeffueeiudejvdekheeuvdekfeffiedvueelteek udehjeetkeegvddugfdtgfeileenucevlhhushhtvghrufhiiigvpedunecurfgrrhgrmh epmhgrihhlfhhrohhmpehpshesphhkshdrihhmpdhnsggprhgtphhtthhopedvpdhmohgu vgepshhmthhpohhuthdprhgtphhtthhopehgihhtsehvghgvrhdrkhgvrhhnvghlrdhorh hgpdhrtghpthhtohepvghthhhomhhsohhnsegvugifrghrughthhhomhhsohhnrdgtohhm X-ME-Proxy: Feedback-ID: i197146af:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 27 Jan 2025 08:04:20 -0500 (EST) Received: by vm-mail (OpenSMTPD) with ESMTPSA id abe4c613 (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Mon, 27 Jan 2025 13:04:19 +0000 (UTC) From: Patrick Steinhardt Date: Mon, 27 Jan 2025 14:04:15 +0100 Subject: [PATCH 07/19] reftable: stop using `BUG()` in trivial cases Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250127-pks-reftable-drop-git-compat-util-v1-7-6e280a564877@pks.im> References: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> In-Reply-To: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> To: git@vger.kernel.org Cc: Edward Thomson X-Mailer: b4 0.14.2 Stop using `BUG()` in the remaining trivial cases that we still have in the reftable library. Instead of aborting the program, we'll now bubble up a `REFTABLE_API_ERROR` to indicate misuse of the calling conventions. Note that in both `reftable_reader_{inc,dec}ref()` we simply stop calling `BUG()` altogether. The only situation where the counter should be zero is when the structure has already been free'd anyway, so we would run into undefined behaviour regardless of whether we try to abort the program or not. Signed-off-by: Patrick Steinhardt --- reftable/iter.c | 3 +-- reftable/reader.c | 4 ---- reftable/writer.c | 5 ++--- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/reftable/iter.c b/reftable/iter.c index 86e801ca9f..b2ffb09c16 100644 --- a/reftable/iter.c +++ b/reftable/iter.c @@ -146,8 +146,7 @@ static int indexed_table_ref_iter_next_block(struct indexed_table_ref_iter *it) static int indexed_table_ref_iter_seek(void *p UNUSED, struct reftable_record *want UNUSED) { - BUG("seeking indexed table is not supported"); - return -1; + return REFTABLE_API_ERROR; } static int indexed_table_ref_iter_next(void *p, struct reftable_record *rec) diff --git a/reftable/reader.c b/reftable/reader.c index de6e6dd932..36a5633ede 100644 --- a/reftable/reader.c +++ b/reftable/reader.c @@ -677,8 +677,6 @@ int reftable_reader_new(struct reftable_reader **out, void reftable_reader_incref(struct reftable_reader *r) { - if (!r->refcount) - BUG("cannot increment ref counter of dead reader"); r->refcount++; } @@ -686,8 +684,6 @@ void reftable_reader_decref(struct reftable_reader *r) { if (!r) return; - if (!r->refcount) - BUG("cannot decrement ref counter of dead reader"); if (--r->refcount) return; block_source_close(&r->source); diff --git a/reftable/writer.c b/reftable/writer.c index 91d6629486..155863ee5f 100644 --- a/reftable/writer.c +++ b/reftable/writer.c @@ -158,7 +158,7 @@ int reftable_writer_new(struct reftable_writer **out, opts = *_opts; options_set_defaults(&opts); if (opts.block_size >= (1 << 24)) - BUG("configured block size exceeds 16MB"); + return REFTABLE_API_ERROR; reftable_buf_init(&wp->block_writer_data.last_key); reftable_buf_init(&wp->last_key); @@ -289,8 +289,7 @@ static int writer_add_record(struct reftable_writer *w, } if (block_writer_type(w->block_writer) != reftable_record_type(rec)) - BUG("record of type %d added to writer of type %d", - reftable_record_type(rec), block_writer_type(w->block_writer)); + return REFTABLE_API_ERROR; /* * Try to add the record to the writer. If this succeeds then we're From patchwork Mon Jan 27 13:04:16 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Steinhardt X-Patchwork-Id: 13951357 Received: from fhigh-a1-smtp.messagingengine.com (fhigh-a1-smtp.messagingengine.com [103.168.172.152]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 297F71FF7CB for ; Mon, 27 Jan 2025 13:04:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.152 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983064; cv=none; b=e+XNw4VkmWPnMvu020rAM9dpIY7mdHYoXpZMn4484bN8gBJ86GR3uUXbbySpwdzNhAW0/MUpAKv1stz7m+1KnhSxVvE5M4em9xRzYt1VFjO/hdtOA5rsLDDZ3fiNCpxyzeylKeDzy6faTj6YlxRCZBsJND1tOJgqhTVKrwqPQNs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983064; c=relaxed/simple; bh=Et2KRIpZ50Ti8K5L+Hq3oKjm7iR2mXqbWRq/2ZcQm8I=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=HdaN/tvriu/6U6q1hvq0DF6eOHZXfpjWvhP2H8MA240yUsOhfNNuNLAk7LwKFhNspXaXU3obDMYLdsMffzF+PB8qYtwGmM+n1eqQhIRUth/R6Qrqy47w3fy0lBi1CL3MsXxMTsgFN82kVpP7WG0a9TR7N/qGjNoaspoLyxa8IBE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im; spf=pass smtp.mailfrom=pks.im; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b=ecJ8ma9m; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=VahU9W7x; arc=none smtp.client-ip=103.168.172.152 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pks.im Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b="ecJ8ma9m"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="VahU9W7x" Received: from phl-compute-11.internal (phl-compute-11.phl.internal [10.202.2.51]) by mailfhigh.phl.internal (Postfix) with ESMTP id 39F5811401E4; Mon, 27 Jan 2025 08:04:22 -0500 (EST) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-11.internal (MEProxy); Mon, 27 Jan 2025 08:04:22 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pks.im; h=cc:cc :content-transfer-encoding:content-type:content-type:date:date :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm3; t=1737983062; x=1738069462; bh=KrYZAgyOUV0fxo0mPxCdHkYI5Fum1vgO46A+ah3bT00=; b= ecJ8ma9mBApaIDrAXqaWIlaI3ErJhQnu6PnTiwMjDRnx948TpdcG5jw+WBKX+cM4 jblin6F1J66NyA7vGy5sX4RVB5VlpG0FDR8swLP1n5xWN9rTCS0tPxDo3nnYu/lf QtImNfnSIkABK82meJO00QNT6ER5DflqmrcdJJ152ssZpFZMTsLLP6Uj/YtOqgsw Nntq2Br/+jiXcyReHjdutyEqv202+4TxCwTR2wPJtZDVBDPZl+m6HGdG+eNl5W3g XMZdKcaDIhbH7JDNxEgSgE4muPDwW+izoNmxy5pnzq6o3nTrXYzlwZn5Mt+3w4K/ rMHx6uvCU75gcfofNDKcAA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1737983062; x= 1738069462; bh=KrYZAgyOUV0fxo0mPxCdHkYI5Fum1vgO46A+ah3bT00=; b=V ahU9W7xLG7FTeUrowN8t/0rUofBY1XwKLjP250TT0QXPG/1SlJS8hzTZKJYrsr/e Bw19+eZM3gGa/yOMuFmRzA3LGiVYQ+Nlfku2Dcq+pdWFd6hhsrI8m9teER7pUglB GXyWft7ydWW9eNO82idJtN30Eb4HvUR+ONFg8Iss7st3GC7HYeTQQC8B2ZU08LQJ pQNM1/jE4x8mTuEyrX8YsUjRvwy8QI+D5fMMpBJ/BRPVO5B2QbIYRhj4WV+0EX7V rHpF3AP8MUo5Rmvi1WUYOpNwWE5FIHFlW47CZbqwSVc+NLxyzvJUOEBmYdngL9dZ BrgZ29H0//g/cTO/x7Aow== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefuddrudejgedgudefvdegucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdggtfgfnhhsuhgsshgtrhhisggv pdfurfetoffkrfgpnffqhgenuceurghilhhouhhtmecufedttdenucesvcftvggtihhpih gvnhhtshculddquddttddmnecujfgurhephfffufggtgfgkfhfjgfvvefosehtjeertder tdejnecuhfhrohhmpefrrghtrhhitghkucfuthgvihhnhhgrrhguthcuoehpshesphhksh drihhmqeenucggtffrrghtthgvrhhnpeffueeiudejvdekheeuvdekfeffiedvueelteek udehjeetkeegvddugfdtgfeileenucevlhhushhtvghrufhiiigvpedunecurfgrrhgrmh epmhgrihhlfhhrohhmpehpshesphhkshdrihhmpdhnsggprhgtphhtthhopedvpdhmohgu vgepshhmthhpohhuthdprhgtphhtthhopegvthhhohhmshhonhesvggufigrrhguthhhoh hmshhonhdrtghomhdprhgtphhtthhopehgihhtsehvghgvrhdrkhgvrhhnvghlrdhorhhg X-ME-Proxy: Feedback-ID: i197146af:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 27 Jan 2025 08:04:21 -0500 (EST) Received: by vm-mail (OpenSMTPD) with ESMTPSA id 82c974a3 (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Mon, 27 Jan 2025 13:04:20 +0000 (UTC) From: Patrick Steinhardt Date: Mon, 27 Jan 2025 14:04:16 +0100 Subject: [PATCH 08/19] reftable/basics: stop using `st_mult()` in array allocators Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250127-pks-reftable-drop-git-compat-util-v1-8-6e280a564877@pks.im> References: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> In-Reply-To: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> To: git@vger.kernel.org Cc: Edward Thomson X-Mailer: b4 0.14.2 We're using `st_mult()` as part of our macro helpers that allocate arrays. This is bad due two two reasons: - `st_mult()` causes us to die in case the multiplication overflows. - `st_mult()` ties us to the Git codebase. Refactor the code to instead detect overflows manually and return an error in such cases. Signed-off-by: Patrick Steinhardt --- reftable/basics.h | 36 ++++++++++++++++++++++++++++++++---- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/reftable/basics.h b/reftable/basics.h index a2a010a0e1..646f8d67f2 100644 --- a/reftable/basics.h +++ b/reftable/basics.h @@ -117,18 +117,46 @@ void reftable_free(void *p); void *reftable_calloc(size_t nelem, size_t elsize); char *reftable_strdup(const char *str); -#define REFTABLE_ALLOC_ARRAY(x, alloc) (x) = reftable_malloc(st_mult(sizeof(*(x)), (alloc))) +static inline int reftable_alloc_size(size_t nelem, size_t elsize, size_t *out) +{ + if (nelem && elsize > SIZE_MAX / nelem) + return -1; + *out = nelem * elsize; + return 0; +} + +#define REFTABLE_ALLOC_ARRAY(x, alloc) do { \ + size_t alloc_size; \ + if (reftable_alloc_size(sizeof(*(x)), (alloc), &alloc_size) < 0) { \ + errno = ENOMEM; \ + (x) = NULL; \ + } else { \ + (x) = reftable_malloc(alloc_size); \ + } \ + } while (0) #define REFTABLE_CALLOC_ARRAY(x, alloc) (x) = reftable_calloc((alloc), sizeof(*(x))) -#define REFTABLE_REALLOC_ARRAY(x, alloc) (x) = reftable_realloc((x), st_mult(sizeof(*(x)), (alloc))) +#define REFTABLE_REALLOC_ARRAY(x, alloc) do { \ + size_t alloc_size; \ + if (reftable_alloc_size(sizeof(*(x)), (alloc), &alloc_size) < 0) { \ + errno = ENOMEM; \ + (x) = NULL; \ + } else { \ + (x) = reftable_realloc((x), alloc_size); \ + } \ + } while (0) static inline void *reftable_alloc_grow(void *p, size_t nelem, size_t elsize, size_t *allocp) { void *new_p; - size_t alloc = *allocp * 2 + 1; + size_t alloc = *allocp * 2 + 1, alloc_bytes; if (alloc < nelem) alloc = nelem; - new_p = reftable_realloc(p, st_mult(elsize, alloc)); + if (reftable_alloc_size(elsize, alloc, &alloc_bytes) < 0) { + errno = ENOMEM; + return p; + } + new_p = reftable_realloc(p, alloc_bytes); if (!new_p) return p; *allocp = alloc; From patchwork Mon Jan 27 13:04:17 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Steinhardt X-Patchwork-Id: 13951358 Received: from fhigh-a1-smtp.messagingengine.com (fhigh-a1-smtp.messagingengine.com [103.168.172.152]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 221861FFC44 for ; Mon, 27 Jan 2025 13:04:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.152 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983066; cv=none; b=Bd+R+6EFf1hRr5YoSKU32tn07yQQLxmdbIECEr85NpeCIbaSuNRXJVcJL8dpjWDouk9KB+QJEqINIUCPebT7i71+Y5fG6yjGYGnbDv9GV7aN9DNkAVwNyrmw3W1EIA5gMv2n6xSktpRK635l7PIVyBLTSzzIpF8aQtIuwwZCtFA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983066; c=relaxed/simple; bh=War32tBLIzvUATGNe9LweLzLOgcUPOOCHX38M2WjYQU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bRXOdc/rxB0H2C/FYmQtTOQqjX14MMmlD7Q4ghagrDQMJBX5T7djyb9AanPmIb7yXHtHJ4a3QGLsgOcFU1kjHU+2JlsnndM0/J/YgVrWdzWWAPdQ0zTwFmin9Ig6R0AXXTorz0zm+r3CFEfENeheIeTyF3FPr6wtNKBZAhSFBz4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im; spf=pass smtp.mailfrom=pks.im; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b=hNuc5QIA; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=hXiWnpKu; arc=none smtp.client-ip=103.168.172.152 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pks.im Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b="hNuc5QIA"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="hXiWnpKu" Received: from phl-compute-04.internal (phl-compute-04.phl.internal [10.202.2.44]) by mailfhigh.phl.internal (Postfix) with ESMTP id 351C71140235; Mon, 27 Jan 2025 08:04:23 -0500 (EST) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-04.internal (MEProxy); Mon, 27 Jan 2025 08:04:23 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pks.im; h=cc:cc :content-transfer-encoding:content-type:content-type:date:date :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm3; t=1737983063; x=1738069463; bh=I8CFGm4rnDGF4WqyQO9uQfFzGhrLD15UJ+ID3wFGIpA=; b= hNuc5QIAku//qqpcvOQl96Pck8Gr3N0XgoFph/L6rWttbT3vg5GGeoNPzSKW2nKR /pYijPe/8uNxWRShjkQuOnMiivLzMSgdBAa7025Bkn9haYSO6KKKYq/aZA95i1QV eWNZdyCDBNulrmIFGPdXgCWM2WpxqRwYi8dAcHx+PUYikCKUYYNTSXUZoWOxjpWT uNQqJ8DAKpp8Je7PcHiwXXxrSqVvMlKiQqaeagcEhFerF/slZ/68ICrWE9Ri74V9 C80mFDrMuT0pD4MmItaBsfkLTElKfl2Qm4GXGb7kh7/2dy2RncTLY3Iu5PDKceG1 kBk7E9/mbDqg/5u7hEWSGA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1737983063; x= 1738069463; bh=I8CFGm4rnDGF4WqyQO9uQfFzGhrLD15UJ+ID3wFGIpA=; b=h XiWnpKuMX1krPx//KvHN3iFmpm3166HxxSDpy1snsfdk6lPmGkCyf5XnxRTpqQir F03jCu2PmWhVLvp8c3x/ax/8eRQi0v2G8Cw3fEK3wqpQbfTKgDYPqJRQpLNSA9ji mY7Sd28tnMdFq75orGp9lArwlSZAxItk1sItftPvMqi+bWtLfpDVGxjj4Y8nwWtb ff+H3wXibIBz/s5UtdbrvLWTeUdOUfO3fyX3M0SUHNa8u9AeFj6WX6IzXxDEDuAb jez3nT7xwa7m5xyoK+Z2XlGUdEGasFOkcAjOiM7GY/JNMplHcmvHUNjOhqy0LSZw t3EnjsUnCr4dAQLQaGrhw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefuddrudejgedgudefvdegucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdggtfgfnhhsuhgsshgtrhhisggv pdfurfetoffkrfgpnffqhgenuceurghilhhouhhtmecufedttdenucesvcftvggtihhpih gvnhhtshculddquddttddmnecujfgurhephfffufggtgfgkfhfjgfvvefosehtjeertder tdejnecuhfhrohhmpefrrghtrhhitghkucfuthgvihhnhhgrrhguthcuoehpshesphhksh drihhmqeenucggtffrrghtthgvrhhnpefhfeeiveffudfhjedvveffhfdukefhvdekveev geeuieetteevgeelgffhvedtgfenucffohhmrghinhepuhhpuggrthgvrdhtiienucevlh hushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhrohhmpehpshesphhkshdr ihhmpdhnsggprhgtphhtthhopedvpdhmohguvgepshhmthhpohhuthdprhgtphhtthhope hgihhtsehvghgvrhdrkhgvrhhnvghlrdhorhhgpdhrtghpthhtohepvghthhhomhhsohhn segvugifrghrughthhhomhhsohhnrdgtohhm X-ME-Proxy: Feedback-ID: i197146af:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 27 Jan 2025 08:04:22 -0500 (EST) Received: by vm-mail (OpenSMTPD) with ESMTPSA id 35254559 (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Mon, 27 Jan 2025 13:04:21 +0000 (UTC) From: Patrick Steinhardt Date: Mon, 27 Jan 2025 14:04:17 +0100 Subject: [PATCH 09/19] reftable/basics: provide wrappers for big endian conversion Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250127-pks-reftable-drop-git-compat-util-v1-9-6e280a564877@pks.im> References: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> In-Reply-To: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> To: git@vger.kernel.org Cc: Edward Thomson X-Mailer: b4 0.14.2 We're using a mixture of big endian conversion functions provided by both the reftable library, but also by the Git codebase. Refactor the code so that we exclusively use reftable-provided wrappers in order to untangle us from the Git codebase. Signed-off-by: Patrick Steinhardt --- reftable/basics.c | 19 ---------- reftable/basics.h | 76 ++++++++++++++++++++++++++++++++++++++-- reftable/block.c | 12 +++---- reftable/reader.c | 22 ++++++------ reftable/record.c | 8 ++--- reftable/writer.c | 20 +++++------ t/unit-tests/t-reftable-basics.c | 28 ++++++++++++--- 7 files changed, 127 insertions(+), 58 deletions(-) diff --git a/reftable/basics.c b/reftable/basics.c index 3b5ea27bbd..8c4a4433e4 100644 --- a/reftable/basics.c +++ b/reftable/basics.c @@ -147,25 +147,6 @@ char *reftable_buf_detach(struct reftable_buf *buf) return result; } -void put_be24(uint8_t *out, uint32_t i) -{ - out[0] = (uint8_t)((i >> 16) & 0xff); - out[1] = (uint8_t)((i >> 8) & 0xff); - out[2] = (uint8_t)(i & 0xff); -} - -uint32_t get_be24(uint8_t *in) -{ - return (uint32_t)(in[0]) << 16 | (uint32_t)(in[1]) << 8 | - (uint32_t)(in[2]); -} - -void put_be16(uint8_t *out, uint16_t i) -{ - out[0] = (uint8_t)((i >> 8) & 0xff); - out[1] = (uint8_t)(i & 0xff); -} - size_t binsearch(size_t sz, int (*f)(size_t k, void *args), void *args) { size_t lo = 0; diff --git a/reftable/basics.h b/reftable/basics.h index 646f8d67f2..c1ddbaec3f 100644 --- a/reftable/basics.h +++ b/reftable/basics.h @@ -76,9 +76,79 @@ char *reftable_buf_detach(struct reftable_buf *buf); /* Bigendian en/decoding of integers */ -void put_be24(uint8_t *out, uint32_t i); -uint32_t get_be24(uint8_t *in); -void put_be16(uint8_t *out, uint16_t i); +static inline void reftable_put_be16(void *out, uint16_t i) +{ + unsigned char *p = out; + p[0] = (uint8_t)((i >> 8) & 0xff); + p[1] = (uint8_t)((i >> 0) & 0xff); +} + +static inline void reftable_put_be24(void *out, uint32_t i) +{ + unsigned char *p = out; + p[0] = (uint8_t)((i >> 16) & 0xff); + p[1] = (uint8_t)((i >> 8) & 0xff); + p[2] = (uint8_t)((i >> 0) & 0xff); +} + +static inline void reftable_put_be32(void *out, uint32_t i) +{ + unsigned char *p = out; + p[0] = (uint8_t)((i >> 24) & 0xff); + p[1] = (uint8_t)((i >> 16) & 0xff); + p[2] = (uint8_t)((i >> 8) & 0xff); + p[3] = (uint8_t)((i >> 0) & 0xff); +} + +static inline void reftable_put_be64(void *out, uint64_t i) +{ + unsigned char *p = out; + p[0] = (uint8_t)((i >> 56) & 0xff); + p[1] = (uint8_t)((i >> 48) & 0xff); + p[2] = (uint8_t)((i >> 40) & 0xff); + p[3] = (uint8_t)((i >> 32) & 0xff); + p[4] = (uint8_t)((i >> 24) & 0xff); + p[5] = (uint8_t)((i >> 16) & 0xff); + p[6] = (uint8_t)((i >> 8) & 0xff); + p[7] = (uint8_t)((i >> 0) & 0xff); +} + +static inline uint16_t reftable_get_be16(const void *in) +{ + const unsigned char *p = in; + return (uint16_t)(p[0]) << 8 | + (uint16_t)(p[1]) << 0; +} + +static inline uint32_t reftable_get_be24(const void *in) +{ + const unsigned char *p = in; + return (uint32_t)(p[0]) << 16 | + (uint32_t)(p[1]) << 8 | + (uint32_t)(p[2]) << 0; +} + +static inline uint32_t reftable_get_be32(const void *in) +{ + const unsigned char *p = in; + return (uint32_t)(p[0]) << 24 | + (uint32_t)(p[1]) << 16 | + (uint32_t)(p[2]) << 8| + (uint32_t)(p[3]) << 0; +} + +static inline uint64_t reftable_get_be64(const void *in) +{ + const unsigned char *p = in; + return (uint64_t)(p[0]) << 56 | + (uint64_t)(p[1]) << 48 | + (uint64_t)(p[2]) << 40 | + (uint64_t)(p[3]) << 32 | + (uint64_t)(p[4]) << 24 | + (uint64_t)(p[5]) << 16 | + (uint64_t)(p[6]) << 8 | + (uint64_t)(p[7]) << 0; +} /* * find smallest index i in [0, sz) at which `f(i) > 0`, assuming that f is diff --git a/reftable/block.c b/reftable/block.c index 255d566854..373908807e 100644 --- a/reftable/block.c +++ b/reftable/block.c @@ -148,13 +148,13 @@ int block_writer_add(struct block_writer *w, struct reftable_record *rec) int block_writer_finish(struct block_writer *w) { for (uint32_t i = 0; i < w->restart_len; i++) { - put_be24(w->block + w->next, w->restarts[i]); + reftable_put_be24(w->block + w->next, w->restarts[i]); w->next += 3; } - put_be16(w->block + w->next, w->restart_len); + reftable_put_be16(w->block + w->next, w->restart_len); w->next += 2; - put_be24(w->block + 1 + w->header_off, w->next); + reftable_put_be24(w->block + 1 + w->header_off, w->next); /* * Log records are stored zlib-compressed. Note that the compression @@ -216,7 +216,7 @@ int block_reader_init(struct block_reader *br, struct reftable_block *block, { uint32_t full_block_size = table_block_size; uint8_t typ = block->data[header_off]; - uint32_t sz = get_be24(block->data + header_off + 1); + uint32_t sz = reftable_get_be24(block->data + header_off + 1); int err = 0; uint16_t restart_count = 0; uint32_t restart_start = 0; @@ -300,7 +300,7 @@ int block_reader_init(struct block_reader *br, struct reftable_block *block, full_block_size = sz; } - restart_count = get_be16(block->data + sz - 2); + restart_count = reftable_get_be16(block->data + sz - 2); restart_start = sz - 2 - 3 * restart_count; restart_bytes = block->data + restart_start; @@ -355,7 +355,7 @@ int block_reader_first_key(const struct block_reader *br, struct reftable_buf *k static uint32_t block_reader_restart_offset(const struct block_reader *br, size_t idx) { - return get_be24(br->restart_bytes + 3 * idx); + return reftable_get_be24(br->restart_bytes + 3 * idx); } void block_iter_seek_start(struct block_iter *it, const struct block_reader *br) diff --git a/reftable/reader.c b/reftable/reader.c index 36a5633ede..bf07a0a586 100644 --- a/reftable/reader.c +++ b/reftable/reader.c @@ -101,18 +101,18 @@ static int parse_footer(struct reftable_reader *r, uint8_t *footer, } f++; - r->block_size = get_be24(f); + r->block_size = reftable_get_be24(f); f += 3; - r->min_update_index = get_be64(f); + r->min_update_index = reftable_get_be64(f); f += 8; - r->max_update_index = get_be64(f); + r->max_update_index = reftable_get_be64(f); f += 8; if (r->version == 1) { r->hash_id = REFTABLE_HASH_SHA1; } else { - switch (get_be32(f)) { + switch (reftable_get_be32(f)) { case REFTABLE_FORMAT_ID_SHA1: r->hash_id = REFTABLE_HASH_SHA1; break; @@ -127,24 +127,24 @@ static int parse_footer(struct reftable_reader *r, uint8_t *footer, f += 4; } - r->ref_offsets.index_offset = get_be64(f); + r->ref_offsets.index_offset = reftable_get_be64(f); f += 8; - r->obj_offsets.offset = get_be64(f); + r->obj_offsets.offset = reftable_get_be64(f); f += 8; r->object_id_len = r->obj_offsets.offset & ((1 << 5) - 1); r->obj_offsets.offset >>= 5; - r->obj_offsets.index_offset = get_be64(f); + r->obj_offsets.index_offset = reftable_get_be64(f); f += 8; - r->log_offsets.offset = get_be64(f); + r->log_offsets.offset = reftable_get_be64(f); f += 8; - r->log_offsets.index_offset = get_be64(f); + r->log_offsets.index_offset = reftable_get_be64(f); f += 8; computed_crc = crc32(0, footer, f - footer); - file_crc = get_be32(f); + file_crc = reftable_get_be32(f); f += 4; if (computed_crc != file_crc) { err = REFTABLE_FORMAT_ERROR; @@ -214,7 +214,7 @@ static int32_t extract_block_size(uint8_t *data, uint8_t *typ, uint64_t off, *typ = data[0]; if (reftable_is_block_type(*typ)) { - result = get_be24(data + 1); + result = reftable_get_be24(data + 1); } return result; } diff --git a/reftable/record.c b/reftable/record.c index da550494a2..286659c098 100644 --- a/reftable/record.c +++ b/reftable/record.c @@ -684,7 +684,7 @@ static int reftable_log_record_key(const void *r, struct reftable_buf *dest) return err; ts = (~ts) - rec->update_index; - put_be64(&i64[0], ts); + reftable_put_be64(&i64[0], ts); err = reftable_buf_add(dest, i64, sizeof(i64)); if (err < 0) @@ -809,7 +809,7 @@ static int reftable_log_record_encode(const void *rec, struct string_view s, if (s.len < 2) return -1; - put_be16(s.buf, r->value.update.tz_offset); + reftable_put_be16(s.buf, r->value.update.tz_offset); string_view_consume(&s, 2); n = encode_string( @@ -841,7 +841,7 @@ static int reftable_log_record_decode(void *rec, struct reftable_buf key, } memcpy(r->refname, key.buf, key.len - 8); - ts = get_be64(key.buf + key.len - 8); + ts = reftable_get_be64((unsigned char *)key.buf + key.len - 8); r->update_index = (~max) - ts; @@ -932,7 +932,7 @@ static int reftable_log_record_decode(void *rec, struct reftable_buf key, goto done; } - r->value.update.tz_offset = get_be16(in.buf); + r->value.update.tz_offset = reftable_get_be16(in.buf); string_view_consume(&in, 2); n = decode_string(scratch, in); diff --git a/reftable/writer.c b/reftable/writer.c index 155863ee5f..5961698311 100644 --- a/reftable/writer.c +++ b/reftable/writer.c @@ -99,9 +99,9 @@ static int writer_write_header(struct reftable_writer *w, uint8_t *dest) dest[4] = writer_version(w); - put_be24(dest + 5, w->opts.block_size); - put_be64(dest + 8, w->min_update_index); - put_be64(dest + 16, w->max_update_index); + reftable_put_be24(dest + 5, w->opts.block_size); + reftable_put_be64(dest + 8, w->min_update_index); + reftable_put_be64(dest + 16, w->max_update_index); if (writer_version(w) == 2) { uint32_t hash_id; @@ -116,7 +116,7 @@ static int writer_write_header(struct reftable_writer *w, uint8_t *dest) return -1; } - put_be32(dest + 24, hash_id); + reftable_put_be32(dest + 24, hash_id); } return header_size(writer_version(w)); @@ -717,19 +717,19 @@ int reftable_writer_close(struct reftable_writer *w) } p += writer_write_header(w, footer); - put_be64(p, w->stats.ref_stats.index_offset); + reftable_put_be64(p, w->stats.ref_stats.index_offset); p += 8; - put_be64(p, (w->stats.obj_stats.offset) << 5 | w->stats.object_id_len); + reftable_put_be64(p, (w->stats.obj_stats.offset) << 5 | w->stats.object_id_len); p += 8; - put_be64(p, w->stats.obj_stats.index_offset); + reftable_put_be64(p, w->stats.obj_stats.index_offset); p += 8; - put_be64(p, w->stats.log_stats.offset); + reftable_put_be64(p, w->stats.log_stats.offset); p += 8; - put_be64(p, w->stats.log_stats.index_offset); + reftable_put_be64(p, w->stats.log_stats.index_offset); p += 8; - put_be32(p, crc32(0, footer, p - footer)); + reftable_put_be32(p, crc32(0, footer, p - footer)); p += 4; err = w->flush(w->write_arg); diff --git a/t/unit-tests/t-reftable-basics.c b/t/unit-tests/t-reftable-basics.c index 9ba7eb05ad..c9e751e49e 100644 --- a/t/unit-tests/t-reftable-basics.c +++ b/t/unit-tests/t-reftable-basics.c @@ -128,12 +128,30 @@ int cmd_main(int argc UNUSED, const char *argv[] UNUSED) reftable_buf_release(&b); } - if_test ("put_be24 and get_be24 work") { + if_test ("reftable_put_be64 and reftable_get_be64 work") { + uint64_t in = 0x1122334455667788; + uint8_t dest[8]; + uint64_t out; + reftable_put_be64(dest, in); + out = reftable_get_be64(dest); + check_int(in, ==, out); + } + + if_test ("reftable_put_be32 and reftable_get_be32 work") { + uint32_t in = 0x11223344; + uint8_t dest[4]; + uint32_t out; + reftable_put_be32(dest, in); + out = reftable_get_be32(dest); + check_int(in, ==, out); + } + + if_test ("reftable_put_be24 and reftable_get_be24 work") { uint32_t in = 0x112233; uint8_t dest[3]; uint32_t out; - put_be24(dest, in); - out = get_be24(dest); + reftable_put_be24(dest, in); + out = reftable_get_be24(dest); check_int(in, ==, out); } @@ -141,8 +159,8 @@ int cmd_main(int argc UNUSED, const char *argv[] UNUSED) uint32_t in = 0xfef1; uint8_t dest[3]; uint32_t out; - put_be16(dest, in); - out = get_be16(dest); + reftable_put_be16(dest, in); + out = reftable_get_be16(dest); check_int(in, ==, out); } From patchwork Mon Jan 27 13:04:18 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Steinhardt X-Patchwork-Id: 13951359 Received: from fout-a5-smtp.messagingengine.com (fout-a5-smtp.messagingengine.com [103.168.172.148]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4B23B1FFC5D for ; Mon, 27 Jan 2025 13:04:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.148 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983066; cv=none; b=TREMZ5Z1oQwftRX5YPSm3KH2sd9qbXttGAnJ/xYxJHAczV7taJlOnjB3oqVuoDkzTuyNBi+yrRJI03U9kReFYQ9OOLbuOFlWwh+10c+wIntsUijEJpUCa8ABwNQgWXT02ah5ElJe1VeMYMYa606je5iPJTVy507X0F0/Xp+HTZI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983066; c=relaxed/simple; bh=yNiOIXNMH8qUXRFfatF/Hrv0zHHaZv1NHqVuolomlxg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=aTTW0E7Rmlz5vE1zRxTfnzRsFS/lOQn1QyKa7dBxyG8obO3rPaOwMwKyP2YUFI3bZzrq/yGU52dg1k0n0sxy76H8be4/khZrADKE7inlG3z0eIzyHg8VNa8wS0PvnZvyLu4qKfCF5tVP6wBztPFv+T8GPtIPykffDPrDrc32GcE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im; spf=pass smtp.mailfrom=pks.im; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b=EiGmj75i; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=P2Yju8A4; arc=none smtp.client-ip=103.168.172.148 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pks.im Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b="EiGmj75i"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="P2Yju8A4" Received: from phl-compute-04.internal (phl-compute-04.phl.internal [10.202.2.44]) by mailfout.phl.internal (Postfix) with ESMTP id 3151913801C4; Mon, 27 Jan 2025 08:04:24 -0500 (EST) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-04.internal (MEProxy); Mon, 27 Jan 2025 08:04:24 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pks.im; h=cc:cc :content-transfer-encoding:content-type:content-type:date:date :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm3; t=1737983064; x=1738069464; bh=WuG4AcUl6HDdJnnwSbtTHemegXqNW+IiTeBaIn9TSHA=; b= EiGmj75izMcTDEyOMVC56kA3conALZujyKHLCdtjyMAafzO/1CV0tRVzQ9nnCWcW FvQ6eqPFRNagXQ6KC7H8IiFR2gyZ+7v56xhHzTtC1++rS60xXRzoDTWXDBvr6iEW 4SEPhAaxspHWlL4fppIEFidoa0/C/pMxdQ6Rp53vwaKmL8rZZWFASANS9cKo49cY BLJNdL+xyyLBPMY3a70DwVBktUAm92KOHAPTKhS37Z5WFXvai6ofHBodyfCU04e7 aSAmT3R2fAB3bMvQN140GHFjFP5Z8KVhPywS2kfg33kog0gf4Hkb3lijX3Z8EXl9 3Yvd+/59EnMDhW9UYTDfYg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1737983064; x= 1738069464; bh=WuG4AcUl6HDdJnnwSbtTHemegXqNW+IiTeBaIn9TSHA=; b=P 2Yju8A4ZOEn2r83zXnvOkRszzRSoqCz/mIj7u8h3/Faq/s6rnPr0rl4Oe7JLRFfh aSXzqfc4DDDAa3f0QNuao4gNMeeLxw6/sxKSrFusO+PNSwK293KfqTtc3y7ltDUh cVJMqRHPsk4MA7wWp9vZiOosUNVyNTM3VdHXUAu8ZWvxC1LCuWLmXtSzx/akP033 PWyoNAjBQCbmuIlAxc0UPoEAqwDVASpKsfe6nUxexnCbr3F+0v77iFELm0qfSumP FAXFKwbNaFDaGXVLmAcrF/zJ1Jf5RHJkJiEI6I9zQgz5rGEZVE8/LTV3fCtoFmDj yQFunjPgsoKSYDC/wzHlw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefuddrudejgedgudefvdegucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdggtfgfnhhsuhgsshgtrhhisggv pdfurfetoffkrfgpnffqhgenuceurghilhhouhhtmecufedttdenucesvcftvggtihhpih gvnhhtshculddquddttddmnecujfgurhephfffufggtgfgkfhfjgfvvefosehtjeertder tdejnecuhfhrohhmpefrrghtrhhitghkucfuthgvihhnhhgrrhguthcuoehpshesphhksh drihhmqeenucggtffrrghtthgvrhhnpeffueeiudejvdekheeuvdekfeffiedvueelteek udehjeetkeegvddugfdtgfeileenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmh epmhgrihhlfhhrohhmpehpshesphhkshdrihhmpdhnsggprhgtphhtthhopedvpdhmohgu vgepshhmthhpohhuthdprhgtphhtthhopegvthhhohhmshhonhesvggufigrrhguthhhoh hmshhonhdrtghomhdprhgtphhtthhopehgihhtsehvghgvrhdrkhgvrhhnvghlrdhorhhg X-ME-Proxy: Feedback-ID: i197146af:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 27 Jan 2025 08:04:23 -0500 (EST) Received: by vm-mail (OpenSMTPD) with ESMTPSA id f3c4598a (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Mon, 27 Jan 2025 13:04:22 +0000 (UTC) From: Patrick Steinhardt Date: Mon, 27 Jan 2025 14:04:18 +0100 Subject: [PATCH 10/19] reftable/reader: stop using `ARRAY_SIZE()` macro Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250127-pks-reftable-drop-git-compat-util-v1-10-6e280a564877@pks.im> References: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> In-Reply-To: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> To: git@vger.kernel.org Cc: Edward Thomson X-Mailer: b4 0.14.2 We have a single user of the `ARRAY_SIZE()` macro in the reftable reader. Drop its use to reduce our dependence on the Git codebase. Signed-off-by: Patrick Steinhardt --- reftable/reader.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reftable/reader.c b/reftable/reader.c index bf07a0a586..c3a3674665 100644 --- a/reftable/reader.c +++ b/reftable/reader.c @@ -849,7 +849,7 @@ int reftable_reader_print_blocks(const char *tablename) printf("header:\n"); printf(" block_size: %d\n", r->block_size); - for (i = 0; i < ARRAY_SIZE(sections); i++) { + for (i = 0; i < sizeof(sections) / sizeof(*sections); i++) { err = table_iter_seek_start(&ti, sections[i].type, 0); if (err < 0) goto done; From patchwork Mon Jan 27 13:04:19 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Steinhardt X-Patchwork-Id: 13951360 Received: from fout-a5-smtp.messagingengine.com (fout-a5-smtp.messagingengine.com [103.168.172.148]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 394371FFC66 for ; Mon, 27 Jan 2025 13:04:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.148 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983067; cv=none; b=qTVUKnax5CRtN0JCLBDaOb+2uXbzlTQ2DOIE/chpbVmyML/+3GBedYhPvVyGG7/4E1bIGY+MPoGgsnFWYX0ngXx1AgGYSaTz9MuZeZLw4r1w9E0otPxnIOiJgeK4W/3y9Fa8cpwVSJkfxD6csYiSWOHvC1EjY9z6bbls6433oAA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983067; c=relaxed/simple; bh=+1ZfmkbfY7oQbi3mh98Cov4Tt5PalQNH5hpbNUu+aZc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bMor6DKN0MUWWtq7Ed4K4w28yKLpeovopEsE2DMhRybdjqEdYB2ebcsubG/nyoU4XjRnVXuk+fu69luFY+4tEusw4guRNfCf5oBIpl+fbNQtYsnDJWlLKMyt3dnYda51fdjbkUID8BNotE9F7ctLitQWxa9C063DOuV9BG4D0tQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im; spf=pass smtp.mailfrom=pks.im; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b=NneR5I8W; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=ChbCF877; arc=none smtp.client-ip=103.168.172.148 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pks.im Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b="NneR5I8W"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="ChbCF877" Received: from phl-compute-04.internal (phl-compute-04.phl.internal [10.202.2.44]) by mailfout.phl.internal (Postfix) with ESMTP id 429821380AF5; Mon, 27 Jan 2025 08:04:25 -0500 (EST) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-04.internal (MEProxy); Mon, 27 Jan 2025 08:04:25 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pks.im; h=cc:cc :content-transfer-encoding:content-type:content-type:date:date :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm3; t=1737983065; x=1738069465; bh=wRD3Ek5awySUciyux3HbTKfEqgbwtD0r0n4BcJTAH80=; b= NneR5I8WcQp9dYMQDxprUBfngIrWwVsd7ZobRCMq08TL91ruuIn7xnYwDQf2lEHH +3kDBe9kodyXuVQPHQYyNyq0OwepRqWlkRc9sxLKhTBYwWPm8pQSNrJOMMp0wYp5 XS8TWXP2yn8s13v5+SB61HeksSmF/uLFZfgwPhFZq6bFe0zQ0qOvy2FpOkjWUAQO ii0Pl0HjfAKiX+3idiSINs7KLwlAOVFIotkpaQC1RZujz8log0cpfNjTcdIV4VTh tTS3MQX0nrzgO4HyBL7ODVmdgXeGPAI8jx7BdraglDvaNhBUoRRp8mJ+HyHQqQnc HAYEXpPvtldPEFIBJ6oiPA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1737983065; x= 1738069465; bh=wRD3Ek5awySUciyux3HbTKfEqgbwtD0r0n4BcJTAH80=; b=C hbCF877NNOmtHMCf9TcHUlH/FbsCRI99S8M1ePbviA3y4Xkagr8NB7C/FFUmBT5+ Uqe7rk5dHIIpFPhHkGMEtoAXKDGdyNNmMSQFDy2k4ucIg/Rt2ijmdWdw76FUsF/f asz+Sna1g0U0ZYLyMn9/VnbgGKm0Nr/ybKhA4RkuF5tt8qXsYvwcdNZCtwE1myGA jdL6i0/Bi5uwhDZGc8EOhgx4hzsUUldi4ZwVSIdHwJyvIHO/S5X5PelrbvsfJnuT Gf6WH8TRotJ4ywBPDT+7KQ//TmwUZEkfheZfWinmTA50zHzqjMrL3RJ6/pGSPPQb Dv0Gf24WmjZHB7ibSMXQQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefuddrudejgedgudefvdegucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdggtfgfnhhsuhgsshgtrhhisggv pdfurfetoffkrfgpnffqhgenuceurghilhhouhhtmecufedttdenucesvcftvggtihhpih gvnhhtshculddquddttddmnecujfgurhephfffufggtgfgkfhfjgfvvefosehtjeertder tdejnecuhfhrohhmpefrrghtrhhitghkucfuthgvihhnhhgrrhguthcuoehpshesphhksh drihhmqeenucggtffrrghtthgvrhhnpeffueeiudejvdekheeuvdekfeffiedvueelteek udehjeetkeegvddugfdtgfeileenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmh epmhgrihhlfhhrohhmpehpshesphhkshdrihhmpdhnsggprhgtphhtthhopedvpdhmohgu vgepshhmthhpohhuthdprhgtphhtthhopehgihhtsehvghgvrhdrkhgvrhhnvghlrdhorh hgpdhrtghpthhtohepvghthhhomhhsohhnsegvugifrghrughthhhomhhsohhnrdgtohhm X-ME-Proxy: Feedback-ID: i197146af:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 27 Jan 2025 08:04:24 -0500 (EST) Received: by vm-mail (OpenSMTPD) with ESMTPSA id 336333fa (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Mon, 27 Jan 2025 13:04:23 +0000 (UTC) From: Patrick Steinhardt Date: Mon, 27 Jan 2025 14:04:19 +0100 Subject: [PATCH 11/19] reftable/system: introduce `reftable_rand()` Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250127-pks-reftable-drop-git-compat-util-v1-11-6e280a564877@pks.im> References: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> In-Reply-To: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> To: git@vger.kernel.org Cc: Edward Thomson X-Mailer: b4 0.14.2 Introduce a new system-level `reftable_rand()` function that generates a single unsigned integer for us. The implementation of this function is to be provided by the calling codebase, which allows us to more easily hook into pre-seeded random number generators. Adapt the two callsites where we generated random data. Signed-off-by: Patrick Steinhardt --- reftable/stack.c | 4 ++-- reftable/system.c | 5 +++++ reftable/system.h | 6 ++++++ 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/reftable/stack.c b/reftable/stack.c index 5f155b344b..82bdf5169f 100644 --- a/reftable/stack.c +++ b/reftable/stack.c @@ -523,7 +523,7 @@ static int reftable_stack_reload_maybe_reuse(struct reftable_stack *st, close(fd); fd = -1; - delay = delay + (delay * git_rand(CSPRNG_BYTES_INSECURE)) / UINT32_MAX + 1; + delay = delay + (delay * reftable_rand()) / UINT32_MAX + 1; sleep_millisec(delay); } @@ -688,7 +688,7 @@ int reftable_stack_add(struct reftable_stack *st, static int format_name(struct reftable_buf *dest, uint64_t min, uint64_t max) { char buf[100]; - uint32_t rnd = git_rand(CSPRNG_BYTES_INSECURE); + uint32_t rnd = reftable_rand(); snprintf(buf, sizeof(buf), "0x%012" PRIx64 "-0x%012" PRIx64 "-%08x", min, max, rnd); reftable_buf_reset(dest); diff --git a/reftable/system.c b/reftable/system.c index adf8e4d30b..e25ccc0da3 100644 --- a/reftable/system.c +++ b/reftable/system.c @@ -4,6 +4,11 @@ #include "../lockfile.h" #include "../tempfile.h" +uint32_t reftable_rand(void) +{ + return git_rand(CSPRNG_BYTES_INSECURE); +} + int tmpfile_from_pattern(struct reftable_tmpfile *out, const char *pattern) { struct tempfile *tempfile; diff --git a/reftable/system.h b/reftable/system.h index 7d5f803eeb..3bd4a4e322 100644 --- a/reftable/system.h +++ b/reftable/system.h @@ -13,6 +13,12 @@ license that can be found in the LICENSE file or at #include "git-compat-util.h" +/* + * Return a random 32 bit integer. This function is expected to return + * pre-seeded data. + */ +uint32_t reftable_rand(void); + /* * An implementation-specific temporary file. By making this specific to the * implementation it becomes possible to tie temporary files into any kind of From patchwork Mon Jan 27 13:04:20 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Steinhardt X-Patchwork-Id: 13951361 Received: from fhigh-a1-smtp.messagingengine.com (fhigh-a1-smtp.messagingengine.com [103.168.172.152]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 300A01FFC70 for ; Mon, 27 Jan 2025 13:04:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.152 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983068; cv=none; b=NdWHxLH3xRxa7fZ+zNoMd0SLqBQ+73onXNlrWCeawxuPF7nufpFmgIPpy6b0cB8z1fr4IYezv4LW7bn+kD8jToTEBrul47D2B9tyirSLLdbM2hc15iyhMgf0NYC9PvAFW20DnmgnoFYFRWrEZjXfx/YWvOHDV0XQa7ska1CWhIs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983068; c=relaxed/simple; bh=CVOCq3Ab9U1F43Ds5A24Ljd+idNRvmODkHX0xx2hVc8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gtAjOkxMpekWRns5HUd4iONzKvFfbcAomFd+9MEzO80ZiXqe8x6INJxNtjTbxWfSQNoBGQELKDTvTe8DT8UwuMrOunrMl7b6zymK81t79YA/Ryy5kewba34t3CpG61UYnhZ1HzEarYL4IhJCifkpW11lJTycL/Eiby5l9jFLSOs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im; spf=pass smtp.mailfrom=pks.im; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b=oF0DPzBZ; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=zmwwmhXr; arc=none smtp.client-ip=103.168.172.152 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pks.im Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b="oF0DPzBZ"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="zmwwmhXr" Received: from phl-compute-01.internal (phl-compute-01.phl.internal [10.202.2.41]) by mailfhigh.phl.internal (Postfix) with ESMTP id 4A58D1140234; Mon, 27 Jan 2025 08:04:26 -0500 (EST) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-01.internal (MEProxy); Mon, 27 Jan 2025 08:04:26 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pks.im; h=cc:cc :content-transfer-encoding:content-type:content-type:date:date :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm3; t=1737983066; x=1738069466; bh=tJrciiJiZemBwMMzIMvDYFX/gnjv40BjS+jAPdHH6zg=; b= oF0DPzBZI+cNHFqzXOfM+1qSvB+CysOZoBY36k3MxzWD6MCbcy/9ySLLSBT86txh rdAfA/NCmAn9PwUtU08V4R1p5aMC9B10xiWxf/VqpHLv765fylDydYt/wZRngeZe Wg4hnFkQQFIAVGnB4TW+VN3u+djG8m5mVNndyyarMVdGs5roill3Qu5/NvCWC0fQ 91X6UwWk9gSBzSlS+uvxjvHMMzTgQleVIcQ3NpPDhILf5YqVrGGIVlXit0/7vCSy 3dciXYo24BqMhEyx6rlnLFvOrtP6hmYs/lk42hkdPierptXehXC602HQi4v+znal pyKwZk63nibwfdVT6x7pKw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1737983066; x= 1738069466; bh=tJrciiJiZemBwMMzIMvDYFX/gnjv40BjS+jAPdHH6zg=; b=z mwwmhXra65TDjeBN9hNAFnNZRKSVMVuhTdHq6ov/7sQDt4FWqkpN4XTdgUKiI7I9 eGVDd4kq4uhKKBHR6VuA318X/bZ7lpeQa3yBh7a/FX0xX3xzqrNZ2bDsW9C+M+BT pj7np+Fk9STArNw9DAc/JZFhG7MKzByG6pyFY27gxUf1nNzZ255KGWYIXCsHP8zn +UA245D2wDpHz+dVt6zwxBzLKyuQqPQXK9hhLhzidZNcePWoFxWsx/lUwabLmOkU /YBGtkBk2DO310fxSOEn0ElbeUMWhGmna98PMRdG9/nCBxX8AjcsqzZjyC2SPic/ QCGFR0kDYuTStQc0HiVhg== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefuddrudejgedgudefvdehucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdggtfgfnhhsuhgsshgtrhhisggv pdfurfetoffkrfgpnffqhgenuceurghilhhouhhtmecufedttdenucesvcftvggtihhpih gvnhhtshculddquddttddmnecujfgurhephfffufggtgfgkfhfjgfvvefosehtjeertder tdejnecuhfhrohhmpefrrghtrhhitghkucfuthgvihhnhhgrrhguthcuoehpshesphhksh drihhmqeenucggtffrrghtthgvrhhnpeffueeiudejvdekheeuvdekfeffiedvueelteek udehjeetkeegvddugfdtgfeileenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmh epmhgrihhlfhhrohhmpehpshesphhkshdrihhmpdhnsggprhgtphhtthhopedvpdhmohgu vgepshhmthhpohhuthdprhgtphhtthhopehgihhtsehvghgvrhdrkhgvrhhnvghlrdhorh hgpdhrtghpthhtohepvghthhhomhhsohhnsegvugifrghrughthhhomhhsohhnrdgtohhm X-ME-Proxy: Feedback-ID: i197146af:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 27 Jan 2025 08:04:25 -0500 (EST) Received: by vm-mail (OpenSMTPD) with ESMTPSA id 24491101 (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Mon, 27 Jan 2025 13:04:24 +0000 (UTC) From: Patrick Steinhardt Date: Mon, 27 Jan 2025 14:04:20 +0100 Subject: [PATCH 12/19] reftable/stack: stop using `sleep_millisec()` Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250127-pks-reftable-drop-git-compat-util-v1-12-6e280a564877@pks.im> References: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> In-Reply-To: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> To: git@vger.kernel.org Cc: Edward Thomson X-Mailer: b4 0.14.2 Refactor our use of `sleep_millisec()` by open-coding it with poll(3p), which is the current implementation of this function. Ideally, we'd use a more direct way to sleep, but there is no equivalent to sleep(3p) that would accept milliseconds as input. Signed-off-by: Patrick Steinhardt --- reftable/stack.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reftable/stack.c b/reftable/stack.c index 82bdf5169f..8e9836aef3 100644 --- a/reftable/stack.c +++ b/reftable/stack.c @@ -524,7 +524,7 @@ static int reftable_stack_reload_maybe_reuse(struct reftable_stack *st, fd = -1; delay = delay + (delay * reftable_rand()) / UINT32_MAX + 1; - sleep_millisec(delay); + poll(NULL, 0, delay); } out: From patchwork Mon Jan 27 13:04:21 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Steinhardt X-Patchwork-Id: 13951362 Received: from fhigh-a1-smtp.messagingengine.com (fhigh-a1-smtp.messagingengine.com [103.168.172.152]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 31CCA1FFC7C for ; Mon, 27 Jan 2025 13:04:27 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.152 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983069; cv=none; b=CmaqvqwqXn6vyqr/rTbGU98KK+oBgds1+gh0synuZuMMT8b5VnvmTcbs/J1hi7My6Z6GYehuHuKk3xRLul/ZYvRlHfrPmOvwd8i+1021/2QSufPlWA9h8O6H93IbVRJdNb1LkTs+6HsNmoYFu7Jqpg5AJ0HmCbUVkdekY9CjJOU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983069; c=relaxed/simple; bh=JGkLARkeVoePA3IqCRJ5YFc2eBFUwobECUxEBi303kY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cZfUX9fPKYto3teRvt4aw9I4tnS/csIkoFyPjCjIBWFv6Gx4GzH7G2EcsWM1D9TCfBQdc/kHrw0UVvf+7fRRVQNxqygI0natSHGb3oSKofBCWJ1b5kXZHHQtfyWFbwfPtMNEi3PpCvEfu2ez4L5QfDX8I9IXOgK1i8AIWhHiUs8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im; spf=pass smtp.mailfrom=pks.im; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b=XE7w5W9s; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=Nu7Rh1Lw; arc=none smtp.client-ip=103.168.172.152 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pks.im Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b="XE7w5W9s"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="Nu7Rh1Lw" Received: from phl-compute-01.internal (phl-compute-01.phl.internal [10.202.2.41]) by mailfhigh.phl.internal (Postfix) with ESMTP id 46081114023E; Mon, 27 Jan 2025 08:04:27 -0500 (EST) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-01.internal (MEProxy); Mon, 27 Jan 2025 08:04:27 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pks.im; h=cc:cc :content-transfer-encoding:content-type:content-type:date:date :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm3; t=1737983067; x=1738069467; bh=DeNYQnmLw74mHIsyKpGYPDqi9jnUXrQF+XnjaP+/bEc=; b= XE7w5W9seBBsTOaHKWnkkrh5EljsoDxjRc7+AG9Z8mD17Px8yFpG6Rgw2Kw/BhbR m9ee79Hl5tsKYrQ6hVEWq89ShUgCzdWPmeBdloPebYnkJY27iErl9gOMUNbOXf2T iVBn9/pThZtBsUufEY44uMRIhEFJM/WwUI58VqpmrLeQC+O59Q1auKO2IucLl9C+ elIogyW5I9pyo1UKOS2V+1a12jlnGHlOe+wgV0cKtjA+Ry6ji/q9/GLD3JNTgenT RDoQlKQuIY0xEooEwVKQldsd9eGLQsgpSGIiF7JL1X09DLAygFu383FROk00t1O2 JMU9OJiDoH4ZBAYlwdJ8aA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1737983067; x= 1738069467; bh=DeNYQnmLw74mHIsyKpGYPDqi9jnUXrQF+XnjaP+/bEc=; b=N u7Rh1LwqEbirFvRY168Zfk1bMN/BZnH0u7JU1ZwojA0GomjbtLQeNWUQTpVBM7wY TBcSJqhfU+uxH9RdiuUXzgH6rQwYi+2ccGcFrHdV5P/WD81y+s/EhJ7VeBixhUWz PVOCHE8t53hUF3UuDi4Wmm3chfa5bkEbRV5sGS/Y9pBjHYZ2lpEhJ2w6FOZXbfxW L0ryWjkVStZjufnxMYnlSgJazWypXxgiq5j35ieNZ4gBPINPM/5C9PiFEn0rHZIm MESOswuUrWbZ37owLBYGXkCfVH5PmkNsol06GMtduwwg56GrBoRdiHCDQTOAsRJ+ yJYJkWyd+rV7xVhkKU7Cw== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefuddrudejgedgudefvdehucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdggtfgfnhhsuhgsshgtrhhisggv pdfurfetoffkrfgpnffqhgenuceurghilhhouhhtmecufedttdenucesvcftvggtihhpih gvnhhtshculddquddttddmnecujfgurhephfffufggtgfgkfhfjgfvvefosehtjeertder tdejnecuhfhrohhmpefrrghtrhhitghkucfuthgvihhnhhgrrhguthcuoehpshesphhksh drihhmqeenucggtffrrghtthgvrhhnpeffueeiudejvdekheeuvdekfeffiedvueelteek udehjeetkeegvddugfdtgfeileenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmh epmhgrihhlfhhrohhmpehpshesphhkshdrihhmpdhnsggprhgtphhtthhopedvpdhmohgu vgepshhmthhpohhuthdprhgtphhtthhopegvthhhohhmshhonhesvggufigrrhguthhhoh hmshhonhdrtghomhdprhgtphhtthhopehgihhtsehvghgvrhdrkhgvrhhnvghlrdhorhhg X-ME-Proxy: Feedback-ID: i197146af:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 27 Jan 2025 08:04:26 -0500 (EST) Received: by vm-mail (OpenSMTPD) with ESMTPSA id 4956ad0e (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Mon, 27 Jan 2025 13:04:25 +0000 (UTC) From: Patrick Steinhardt Date: Mon, 27 Jan 2025 14:04:21 +0100 Subject: [PATCH 13/19] reftable/basics: stop using `SWAP()` macro Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250127-pks-reftable-drop-git-compat-util-v1-13-6e280a564877@pks.im> References: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> In-Reply-To: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> To: git@vger.kernel.org Cc: Edward Thomson X-Mailer: b4 0.14.2 Stop using `SWAP()` macro in favor of an open-coded variant of it. Note that this also requires us to open-code the build assert that `SWAP()` itself uses to verify that the size of both variables matches. This is done to reduce our dependency on the Git codebase. Signed-off-by: Patrick Steinhardt --- reftable/basics.h | 9 +++++++++ reftable/merged.c | 2 +- reftable/pq.c | 4 ++-- reftable/record.c | 16 ++++++++-------- 4 files changed, 20 insertions(+), 11 deletions(-) diff --git a/reftable/basics.h b/reftable/basics.h index c1ddbaec3f..59000798f0 100644 --- a/reftable/basics.h +++ b/reftable/basics.h @@ -266,6 +266,15 @@ static inline void *reftable_alloc_grow(void *p, size_t nelem, size_t elsize, # define strdup(str) REFTABLE_BANNED(strdup) #endif +#define REFTABLE_SWAP(a, b) do { \ + void *_swap_a_ptr = &(a); \ + void *_swap_b_ptr = &(b); \ + unsigned char _swap_buffer[sizeof(a) - 2 * sizeof(a) * (sizeof(a) != sizeof(b))]; \ + memcpy(_swap_buffer, _swap_a_ptr, sizeof(a)); \ + memcpy(_swap_a_ptr, _swap_b_ptr, sizeof(a)); \ + memcpy(_swap_b_ptr, _swap_buffer, sizeof(a)); \ +} while (0) + /* Find the longest shared prefix size of `a` and `b` */ size_t common_prefix_size(struct reftable_buf *a, struct reftable_buf *b); diff --git a/reftable/merged.c b/reftable/merged.c index 563864068c..4ff1553772 100644 --- a/reftable/merged.c +++ b/reftable/merged.c @@ -155,7 +155,7 @@ static int merged_iter_next_entry(struct merged_iter *mi, } mi->advance_index = entry.index; - SWAP(*rec, *entry.rec); + REFTABLE_SWAP(*rec, *entry.rec); return 0; } diff --git a/reftable/pq.c b/reftable/pq.c index ef8035cfd9..82394a972d 100644 --- a/reftable/pq.c +++ b/reftable/pq.c @@ -57,7 +57,7 @@ int merged_iter_pqueue_remove(struct merged_iter_pqueue *pq, struct pq_entry *ou if (min == i) break; - SWAP(pq->heap[i], pq->heap[min]); + REFTABLE_SWAP(pq->heap[i], pq->heap[min]); i = min; } @@ -81,7 +81,7 @@ int merged_iter_pqueue_add(struct merged_iter_pqueue *pq, const struct pq_entry size_t j = (i - 1) / 2; if (pq_less(&pq->heap[j], &pq->heap[i])) break; - SWAP(pq->heap[j], pq->heap[i]); + REFTABLE_SWAP(pq->heap[j], pq->heap[i]); i = j; } diff --git a/reftable/record.c b/reftable/record.c index 286659c098..d86cd65bb4 100644 --- a/reftable/record.c +++ b/reftable/record.c @@ -237,11 +237,11 @@ static int reftable_ref_record_copy_from(void *rec, const void *src_rec, size_t refname_cap = 0; int err; - SWAP(refname, ref->refname); - SWAP(refname_cap, ref->refname_cap); + REFTABLE_SWAP(refname, ref->refname); + REFTABLE_SWAP(refname_cap, ref->refname_cap); reftable_ref_record_release(ref); - SWAP(ref->refname, refname); - SWAP(ref->refname_cap, refname_cap); + REFTABLE_SWAP(ref->refname, refname); + REFTABLE_SWAP(ref->refname_cap, refname_cap); if (src->refname) { size_t refname_len = strlen(src->refname); @@ -376,11 +376,11 @@ static int reftable_ref_record_decode(void *rec, struct reftable_buf key, return n; string_view_consume(&in, n); - SWAP(refname, r->refname); - SWAP(refname_cap, r->refname_cap); + REFTABLE_SWAP(refname, r->refname); + REFTABLE_SWAP(refname_cap, r->refname_cap); reftable_ref_record_release(r); - SWAP(r->refname, refname); - SWAP(r->refname_cap, refname_cap); + REFTABLE_SWAP(r->refname, refname); + REFTABLE_SWAP(r->refname_cap, refname_cap); REFTABLE_ALLOC_GROW_OR_NULL(r->refname, key.len + 1, r->refname_cap); if (!r->refname) { From patchwork Mon Jan 27 13:04:22 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Steinhardt X-Patchwork-Id: 13951363 Received: from fhigh-a1-smtp.messagingengine.com (fhigh-a1-smtp.messagingengine.com [103.168.172.152]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D69A11FF1D8 for ; Mon, 27 Jan 2025 13:04:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.152 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983070; cv=none; b=ZTsCzz+pj+kjzvQbg0DLZPv6ktJnQKr1I7CePxy4hS325XkyeCnZSTOQTY7AZ9xdHsIa2raOZpcbm8pTRWmuPWLbojfAA0qv0e8KmtOrYoEave79ekLnBVjdmcVk6erEdZRFj8o7LNHUuhJFfH7Yc9Awmpzk8ph6N2m/Aoak67Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983070; c=relaxed/simple; bh=VI0guBAnlrQx8ug+rNahw3HaYKaoL90XO6wmT73ZoD8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=FGPmGAGuaFjJ8EuR5drW9jOOiBn+6YoCEHch1rS63Jnyw5dryS+9O/Klk4yC54ELu8qQfYtrVA1sCaZV5eEMORlUY/iIEb0oOYVbcrKeOabh5Q1puRwY0houILRJfTG5Kta8cpTWVITrFUZpdwxaXQGuK6vWkrJWZO/rf4yFM0M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im; spf=pass smtp.mailfrom=pks.im; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b=TGK4eHjQ; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=deXX7lzq; arc=none smtp.client-ip=103.168.172.152 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pks.im Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b="TGK4eHjQ"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="deXX7lzq" Received: from phl-compute-04.internal (phl-compute-04.phl.internal [10.202.2.44]) by mailfhigh.phl.internal (Postfix) with ESMTP id 36E6C1140206; Mon, 27 Jan 2025 08:04:28 -0500 (EST) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-04.internal (MEProxy); Mon, 27 Jan 2025 08:04:28 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pks.im; h=cc:cc :content-transfer-encoding:content-type:content-type:date:date :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm3; t=1737983068; x=1738069468; bh=xkd0YUwGaxAHDbOLxLubeRD8GcdkulaMiz/zIRxrvlU=; b= TGK4eHjQHOBP/AnSVL6qtFxTM+AK0iwlpf8zk70ramXcLzIAx7HN8vipdYe5XrjS rmtBa9myS1iaON46/vtatuQHBR35B+b6eN1O/wJmvWuW54kT/EIzDv98u+xplz9z 4LMdBYoljybF5aqawezVo2NR9F5pxMVWY24Gwu/uEvpKMzCUaZwPDCX0uwMq9PRP svniq5ATkcsUMQLIb9RxWqzcmntKi4yClRyNNVZFraQYUqg5Y5X0xjB//jGNdwSf O+hQnpolbvFwEQkZv+XoIZQSppWkB+X8Wi2qNuicrNteqIC878U8JeEq3Gd9nD9g MmbLdTeiC2/7DYaYGrNRrQ== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1737983068; x= 1738069468; bh=xkd0YUwGaxAHDbOLxLubeRD8GcdkulaMiz/zIRxrvlU=; b=d eXX7lzqrvUJEefrLXm4xFnJNVfKuZ6ouzcePcsyBqEok4EccfvSYaxB1cxZifIdI 0CmFpS3zOOo/qlafZ3+aSXW5NUuHo8xrxyEK1nLIuY5STPWjTW4h4kBfmMMqs+Gi aP3kZoWv476oh/LjdH0EbXwZ6vU+ot/Ys2b/duj1/EKmWdYjBQ3NaPlN9pvfj1+1 Yyn03rvopwbyHUnm0Gh2JyPLVCzl8PE1yngXPsIcAfK0yvc6tEB3ubItgQ2lyv3f pqZFyCyr3dKJKPby4WX9FVlvf0wvInY2bAiU81Z+yakAB3XFN7rFr3iaICta57Hh g+1dwNmCYvQM/rFEP5Iwg== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefuddrudejgedgudefvdegucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdggtfgfnhhsuhgsshgtrhhisggv pdfurfetoffkrfgpnffqhgenuceurghilhhouhhtmecufedttdenucesvcftvggtihhpih gvnhhtshculddquddttddmnecujfgurhephfffufggtgfgkfhfjgfvvefosehtjeertder tdejnecuhfhrohhmpefrrghtrhhitghkucfuthgvihhnhhgrrhguthcuoehpshesphhksh drihhmqeenucggtffrrghtthgvrhhnpeffueeiudejvdekheeuvdekfeffiedvueelteek udehjeetkeegvddugfdtgfeileenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmh epmhgrihhlfhhrohhmpehpshesphhkshdrihhmpdhnsggprhgtphhtthhopedvpdhmohgu vgepshhmthhpohhuthdprhgtphhtthhopehgihhtsehvghgvrhdrkhgvrhhnvghlrdhorh hgpdhrtghpthhtohepvghthhhomhhsohhnsegvugifrghrughthhhomhhsohhnrdgtohhm X-ME-Proxy: Feedback-ID: i197146af:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 27 Jan 2025 08:04:27 -0500 (EST) Received: by vm-mail (OpenSMTPD) with ESMTPSA id 23fb95e0 (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Mon, 27 Jan 2025 13:04:26 +0000 (UTC) From: Patrick Steinhardt Date: Mon, 27 Jan 2025 14:04:22 +0100 Subject: [PATCH 14/19] reftable/basics: stop using `UNUSED` annotation Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250127-pks-reftable-drop-git-compat-util-v1-14-6e280a564877@pks.im> References: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> In-Reply-To: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> To: git@vger.kernel.org Cc: Edward Thomson X-Mailer: b4 0.14.2 Stop using the `UNUSED` annotation and replace it with a new `REFTABLE_UNUSED` macro. The latter is a weaker guarantee compared to `UNUSED` as it only suppresses unused parameters without generating a warning in case a parameter marked as unused is in fact used. But it's good enough, and by relaxing the behaviour a bit we avoid having to wire up compiler-specific logic. Signed-off-by: Patrick Steinhardt --- reftable/basics.h | 2 ++ reftable/blocksource.c | 10 +++++++--- reftable/iter.c | 17 ++++++++++++----- reftable/record.c | 51 ++++++++++++++++++++++++++++++++++++-------------- reftable/writer.c | 4 +++- 5 files changed, 61 insertions(+), 23 deletions(-) diff --git a/reftable/basics.h b/reftable/basics.h index 59000798f0..4d0645a4e9 100644 --- a/reftable/basics.h +++ b/reftable/basics.h @@ -16,6 +16,8 @@ license that can be found in the LICENSE file or at #include "system.h" #include "reftable-basics.h" +#define REFTABLE_UNUSED(x) (void)(x) + struct reftable_buf { size_t alloc; size_t len; diff --git a/reftable/blocksource.c b/reftable/blocksource.c index 02972c46f4..bfd64b0e48 100644 --- a/reftable/blocksource.c +++ b/reftable/blocksource.c @@ -13,15 +13,17 @@ license that can be found in the LICENSE file or at #include "reftable-blocksource.h" #include "reftable-error.h" -static void reftable_buf_return_block(void *b UNUSED, struct reftable_block *dest) +static void reftable_buf_return_block(void *b, struct reftable_block *dest) { + REFTABLE_UNUSED(b); if (dest->len) memset(dest->data, 0xff, dest->len); reftable_free(dest->data); } -static void reftable_buf_close(void *b UNUSED) +static void reftable_buf_close(void *b) { + REFTABLE_UNUSED(b); } static ssize_t reftable_buf_read_block(void *v, struct reftable_block *dest, @@ -67,8 +69,10 @@ static uint64_t file_size(void *b) return ((struct file_block_source *)b)->size; } -static void file_return_block(void *b UNUSED, struct reftable_block *dest UNUSED) +static void file_return_block(void *b, struct reftable_block *dest) { + REFTABLE_UNUSED(b); + REFTABLE_UNUSED(dest); } static void file_close(void *v) diff --git a/reftable/iter.c b/reftable/iter.c index b2ffb09c16..452add2705 100644 --- a/reftable/iter.c +++ b/reftable/iter.c @@ -25,18 +25,23 @@ int iterator_next(struct reftable_iterator *it, struct reftable_record *rec) return it->ops->next(it->iter_arg, rec); } -static int empty_iterator_seek(void *arg UNUSED, struct reftable_record *want UNUSED) +static int empty_iterator_seek(void *arg, struct reftable_record *want) { + REFTABLE_UNUSED(arg); + REFTABLE_UNUSED(want); return 0; } -static int empty_iterator_next(void *arg UNUSED, struct reftable_record *rec UNUSED) +static int empty_iterator_next(void *arg, struct reftable_record *rec) { + REFTABLE_UNUSED(arg); + REFTABLE_UNUSED(rec); return 1; } -static void empty_iterator_close(void *arg UNUSED) +static void empty_iterator_close(void *arg) { + REFTABLE_UNUSED(arg); } static struct reftable_iterator_vtable empty_vtable = { @@ -143,9 +148,11 @@ static int indexed_table_ref_iter_next_block(struct indexed_table_ref_iter *it) return 0; } -static int indexed_table_ref_iter_seek(void *p UNUSED, - struct reftable_record *want UNUSED) +static int indexed_table_ref_iter_seek(void *p, + struct reftable_record *want) { + REFTABLE_UNUSED(p); + REFTABLE_UNUSED(want); return REFTABLE_API_ERROR; } diff --git a/reftable/record.c b/reftable/record.c index d86cd65bb4..46093ef987 100644 --- a/reftable/record.c +++ b/reftable/record.c @@ -490,11 +490,13 @@ static void reftable_obj_record_release(void *rec) } static int reftable_obj_record_copy_from(void *rec, const void *src_rec, - uint32_t hash_size UNUSED) + uint32_t hash_size) { struct reftable_obj_record *obj = rec; const struct reftable_obj_record *src = src_rec; + REFTABLE_UNUSED(hash_size); + reftable_obj_record_release(obj); REFTABLE_ALLOC_ARRAY(obj->hash_prefix, src->hash_prefix_len); @@ -523,13 +525,16 @@ static uint8_t reftable_obj_record_val_type(const void *rec) } static int reftable_obj_record_encode(const void *rec, struct string_view s, - uint32_t hash_size UNUSED) + uint32_t hash_size) { const struct reftable_obj_record *r = rec; struct string_view start = s; int i = 0; int n = 0; uint64_t last = 0; + + REFTABLE_UNUSED(hash_size); + if (r->offset_len == 0 || r->offset_len >= 8) { n = put_var_int(&s, r->offset_len); if (n < 0) { @@ -558,8 +563,8 @@ static int reftable_obj_record_encode(const void *rec, struct string_view s, static int reftable_obj_record_decode(void *rec, struct reftable_buf key, uint8_t val_type, struct string_view in, - uint32_t hash_size UNUSED, - struct reftable_buf *scratch UNUSED) + uint32_t hash_size, + struct reftable_buf *scratch) { struct string_view start = in; struct reftable_obj_record *r = rec; @@ -567,6 +572,9 @@ static int reftable_obj_record_decode(void *rec, struct reftable_buf key, int n = 0; uint64_t last; + REFTABLE_UNUSED(hash_size); + REFTABLE_UNUSED(scratch); + reftable_obj_record_release(r); REFTABLE_ALLOC_ARRAY(r->hash_prefix, key.len); @@ -613,17 +621,20 @@ static int reftable_obj_record_decode(void *rec, struct reftable_buf key, return start.len - in.len; } -static int not_a_deletion(const void *p UNUSED) +static int not_a_deletion(const void *p) { + REFTABLE_UNUSED(p); return 0; } static int reftable_obj_record_equal_void(const void *a, const void *b, - uint32_t hash_size UNUSED) + uint32_t hash_size) { struct reftable_obj_record *ra = (struct reftable_obj_record *) a; struct reftable_obj_record *rb = (struct reftable_obj_record *) b; + REFTABLE_UNUSED(hash_size); + if (ra->hash_prefix_len != rb->hash_prefix_len || ra->offset_len != rb->offset_len) return 0; @@ -1049,12 +1060,14 @@ static int reftable_index_record_key(const void *r, struct reftable_buf *dest) } static int reftable_index_record_copy_from(void *rec, const void *src_rec, - uint32_t hash_size UNUSED) + uint32_t hash_size) { struct reftable_index_record *dst = rec; const struct reftable_index_record *src = src_rec; int err; + REFTABLE_UNUSED(hash_size); + reftable_buf_reset(&dst->last_key); err = reftable_buf_add(&dst->last_key, src->last_key.buf, src->last_key.len); if (err < 0) @@ -1070,19 +1083,23 @@ static void reftable_index_record_release(void *rec) reftable_buf_release(&idx->last_key); } -static uint8_t reftable_index_record_val_type(const void *rec UNUSED) +static uint8_t reftable_index_record_val_type(const void *rec) { + REFTABLE_UNUSED(rec); return 0; } static int reftable_index_record_encode(const void *rec, struct string_view out, - uint32_t hash_size UNUSED) + uint32_t hash_size) { const struct reftable_index_record *r = (const struct reftable_index_record *)rec; struct string_view start = out; + int n; - int n = put_var_int(&out, r->offset); + REFTABLE_UNUSED(hash_size); + + n = put_var_int(&out, r->offset); if (n < 0) return n; @@ -1092,15 +1109,19 @@ static int reftable_index_record_encode(const void *rec, struct string_view out, } static int reftable_index_record_decode(void *rec, struct reftable_buf key, - uint8_t val_type UNUSED, + uint8_t val_type, struct string_view in, - uint32_t hash_size UNUSED, - struct reftable_buf *scratch UNUSED) + uint32_t hash_size, + struct reftable_buf *scratch) { struct string_view start = in; struct reftable_index_record *r = rec; int err, n = 0; + REFTABLE_UNUSED(val_type); + REFTABLE_UNUSED(hash_size); + REFTABLE_UNUSED(scratch); + reftable_buf_reset(&r->last_key); err = reftable_buf_add(&r->last_key, key.buf, key.len); if (err < 0) @@ -1115,11 +1136,13 @@ static int reftable_index_record_decode(void *rec, struct reftable_buf key, } static int reftable_index_record_equal(const void *a, const void *b, - uint32_t hash_size UNUSED) + uint32_t hash_size) { struct reftable_index_record *ia = (struct reftable_index_record *) a; struct reftable_index_record *ib = (struct reftable_index_record *) b; + REFTABLE_UNUSED(hash_size); + return ia->offset == ib->offset && !reftable_buf_cmp(&ia->last_key, &ib->last_key); } diff --git a/reftable/writer.c b/reftable/writer.c index 5961698311..0040a1b1c4 100644 --- a/reftable/writer.c +++ b/reftable/writer.c @@ -636,10 +636,12 @@ static void write_object_record(void *void_arg, void *key) done:; } -static void object_record_free(void *void_arg UNUSED, void *key) +static void object_record_free(void *void_arg, void *key) { struct obj_index_tree_node *entry = key; + REFTABLE_UNUSED(void_arg); + REFTABLE_FREE_AND_NULL(entry->offsets); reftable_buf_release(&entry->hash); reftable_free(entry); From patchwork Mon Jan 27 13:04:23 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Steinhardt X-Patchwork-Id: 13951364 Received: from fout-a5-smtp.messagingengine.com (fout-a5-smtp.messagingengine.com [103.168.172.148]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E41D220011A for ; Mon, 27 Jan 2025 13:04:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.148 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983072; cv=none; b=raqm+3qY41cES1Y0Xbz7x9W0YhSyZmhG6eQ268GXToGjiDqaze4quX4IKCJIKPkoziGN4j7enzaBQwhCeChkmaj/QhtwMJZMHl6aCe7BY6F5QhE4MS9JF12CLEQ6jQiIzXkcmGQEGimJ4EDprHKzDqGKbXe4+vgpsntywK2wT54= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983072; c=relaxed/simple; bh=T6smRPFVZdqTO9lue3uuBlWgmspiFYHMmyb9VYtUIdM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Ecxbj/12GsDm3J6jet+e5zNByPyOkyFfqZsWRngkBBDrzTgnz1UJKWWSMLjeNUtZ+2ux2FRphY5ZTj/ch9TPBZkK2l/4k1WeO0KCY4KNVuOSMi4qW5DoMaOpjVDAmsTkug6628A8qFcD0ov19E5ScbbBR72C7m/HusdGIg4xSJU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im; spf=pass smtp.mailfrom=pks.im; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b=U/v6C5Td; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=DWqUsDvY; arc=none smtp.client-ip=103.168.172.148 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pks.im Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b="U/v6C5Td"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="DWqUsDvY" Received: from phl-compute-12.internal (phl-compute-12.phl.internal [10.202.2.52]) by mailfout.phl.internal (Postfix) with ESMTP id 46D9E1380AF5; Mon, 27 Jan 2025 08:04:29 -0500 (EST) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-12.internal (MEProxy); Mon, 27 Jan 2025 08:04:29 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pks.im; h=cc:cc :content-transfer-encoding:content-type:content-type:date:date :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm3; t=1737983069; x=1738069469; bh=fAWxB9dI7p2ItmTt8K9j08MASCaOeVa1uLKx5iU3djM=; b= U/v6C5TdMC0Cz39Ynf7l44IGLeJSKv8Pp61lrTZygoJjUNk3GOlHqCSenBQhGgSG Yoy1GSELpzmWuJOPWdDF5QHnr/fLuH47a29iuz6xL84/aM/yLllRArlH0oD0aDqy xv3UVfxfAqGkMa9w98RNeXBWkV7A/kVt4L0amgb9VukYaYg+Sod1FdCDbot7Z/xq yYl20LvoIwSajJEj9TqSM0v03hCzDMUlnO89fz1Jao+83UZcP/mtnoyHhmyb7CA9 EuxqP/AzvD7r3nlxJPMH5Bj5IkJtyyiOBupSScBdz4mbqW85YbppQJbw2MZcWUse ig8RNldrLcOPYX02XDpi3g== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1737983069; x= 1738069469; bh=fAWxB9dI7p2ItmTt8K9j08MASCaOeVa1uLKx5iU3djM=; b=D WqUsDvY000D6QOL2ulOyOTx5SFS3pOqw6bwqX3OmldFGqEiVIiluS6uG9U/PgDpx TkqR6auWBG8X8uNmgo1jG4oup2RhkiXSTZnUnGTQBXWfbrrFILuh3RV3HJKEsUYJ 892Nl0uyAHr0oE6I5Wfdys1M6pm+jBJBgSh2lN2wG+F2Pn+dMQ4c4M+TZXfs4AUo 7ROivR3do7+ULuRTmjkol6mag0QSKa0NI6mqyjkgK4alEcZaq+UqFdMtk4mJn2DW yByjlt0Wk+K4AS2A6v7rQOflVZzsSdG2eWaoI+iaXtt+Ed3XJpKTX7NKqcBhxOLY 78KLT4lMF4SCvfgsurzpg== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefuddrudejgedgudefvdegucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdggtfgfnhhsuhgsshgtrhhisggv pdfurfetoffkrfgpnffqhgenuceurghilhhouhhtmecufedttdenucesvcftvggtihhpih gvnhhtshculddquddttddmnecujfgurhephfffufggtgfgkfhfjgfvvefosehtjeertder tdejnecuhfhrohhmpefrrghtrhhitghkucfuthgvihhnhhgrrhguthcuoehpshesphhksh drihhmqeenucggtffrrghtthgvrhhnpeffueeiudejvdekheeuvdekfeffiedvueelteek udehjeetkeegvddugfdtgfeileenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmh epmhgrihhlfhhrohhmpehpshesphhkshdrihhmpdhnsggprhgtphhtthhopedvpdhmohgu vgepshhmthhpohhuthdprhgtphhtthhopehgihhtsehvghgvrhdrkhgvrhhnvghlrdhorh hgpdhrtghpthhtohepvghthhhomhhsohhnsegvugifrghrughthhhomhhsohhnrdgtohhm X-ME-Proxy: Feedback-ID: i197146af:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 27 Jan 2025 08:04:28 -0500 (EST) Received: by vm-mail (OpenSMTPD) with ESMTPSA id fca0ceda (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Mon, 27 Jan 2025 13:04:26 +0000 (UTC) From: Patrick Steinhardt Date: Mon, 27 Jan 2025 14:04:23 +0100 Subject: [PATCH 15/19] compat/mingw: split out POSIX-related bits Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250127-pks-reftable-drop-git-compat-util-v1-15-6e280a564877@pks.im> References: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> In-Reply-To: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> To: git@vger.kernel.org Cc: Edward Thomson X-Mailer: b4 0.14.2 Split out the POSIX-related bits from "compat/mingw.h". This is in preparation for splitting up "git-compat-utils.h" into a header that provides POSIX-compatibility and a header that provides common wrappers used by the Git project. Signed-off-by: Patrick Steinhardt --- compat/{mingw.c => mingw/compat-util.c} | 0 compat/mingw/compat-util.h | 220 ++++++++++++++++++++++++++++++++ compat/{mingw.h => mingw/posix.h} | 216 +------------------------------ compat/msvc.c | 2 +- compat/msvc.h | 2 +- config.mak.uname | 4 +- contrib/buildsystems/CMakeLists.txt | 2 +- git-compat-util.h | 4 +- meson.build | 6 +- 9 files changed, 234 insertions(+), 222 deletions(-) diff --git a/compat/mingw.c b/compat/mingw/compat-util.c similarity index 100% rename from compat/mingw.c rename to compat/mingw/compat-util.c diff --git a/compat/mingw/compat-util.h b/compat/mingw/compat-util.h new file mode 100644 index 0000000000..b433762526 --- /dev/null +++ b/compat/mingw/compat-util.h @@ -0,0 +1,220 @@ +#ifndef COMPAT_MINGW_COMPAT_UTIL_H +#define COMPAT_MINGW_COMPAT_UTIL_H + +#include "compat/mingw/posix.h" + +struct config_context; +int mingw_core_config(const char *var, const char *value, + const struct config_context *ctx, void *cb); +#define platform_core_config mingw_core_config + +#ifndef NO_OPENSSL +#include +static inline int mingw_SSL_set_fd(SSL *ssl, int fd) +{ + return SSL_set_fd(ssl, _get_osfhandle(fd)); +} +#define SSL_set_fd mingw_SSL_set_fd + +static inline int mingw_SSL_set_rfd(SSL *ssl, int fd) +{ + return SSL_set_rfd(ssl, _get_osfhandle(fd)); +} +#define SSL_set_rfd mingw_SSL_set_rfd + +static inline int mingw_SSL_set_wfd(SSL *ssl, int fd) +{ + return SSL_set_wfd(ssl, _get_osfhandle(fd)); +} +#define SSL_set_wfd mingw_SSL_set_wfd +#endif + +/* + * git specific compatibility + */ + +static inline void convert_slashes(char *path) +{ + for (; *path; path++) + if (*path == '\\') + *path = '/'; +} +#define PATH_SEP ';' +char *mingw_query_user_email(void); +#define query_user_email mingw_query_user_email + +/** + * Verifies that the specified path is owned by the user running the + * current process. + */ +int is_path_owned_by_current_sid(const char *path, struct strbuf *report); +#define is_path_owned_by_current_user is_path_owned_by_current_sid + +/** + * Verifies that the given path is a valid one on Windows. + * + * In particular, path segments are disallowed which + * + * - end in a period or a space (except the special directories `.` and `..`). + * + * - contain any of the reserved characters, e.g. `:`, `;`, `*`, etc + * + * - correspond to reserved names (such as `AUX`, `PRN`, etc) + * + * The `allow_literal_nul` parameter controls whether the path `NUL` should + * be considered valid (this makes sense e.g. before opening files, as it is + * perfectly legitimate to open `NUL` on Windows, just as it is to open + * `/dev/null` on Unix/Linux). + * + * Returns 1 upon success, otherwise 0. + */ +int is_valid_win32_path(const char *path, int allow_literal_nul); +#define is_valid_path(path) is_valid_win32_path(path, 0) + +/** + * Converts UTF-8 encoded string to UTF-16LE. + * + * To support repositories with legacy-encoded file names, invalid UTF-8 bytes + * 0xa0 - 0xff are converted to corresponding printable Unicode chars \u00a0 - + * \u00ff, and invalid UTF-8 bytes 0x80 - 0x9f (which would make non-printable + * Unicode) are converted to hex-code. + * + * Lead-bytes not followed by an appropriate number of trail-bytes, over-long + * encodings and 4-byte encodings > \u10ffff are detected as invalid UTF-8. + * + * Maximum space requirement for the target buffer is two wide chars per UTF-8 + * char (((strlen(utf) * 2) + 1) [* sizeof(wchar_t)]). + * + * The maximum space is needed only if the entire input string consists of + * invalid UTF-8 bytes in range 0x80-0x9f, as per the following table: + * + * | | UTF-8 | UTF-16 | + * Code point | UTF-8 sequence | bytes | words | ratio + * --------------+-------------------+-------+--------+------- + * 000000-00007f | 0-7f | 1 | 1 | 1 + * 000080-0007ff | c2-df + 80-bf | 2 | 1 | 0.5 + * 000800-00ffff | e0-ef + 2 * 80-bf | 3 | 1 | 0.33 + * 010000-10ffff | f0-f4 + 3 * 80-bf | 4 | 2 (a) | 0.5 + * invalid | 80-9f | 1 | 2 (b) | 2 + * invalid | a0-ff | 1 | 1 | 1 + * + * (a) encoded as UTF-16 surrogate pair + * (b) encoded as two hex digits + * + * Note that, while the UTF-8 encoding scheme can be extended to 5-byte, 6-byte + * or even indefinite-byte sequences, the largest valid code point \u10ffff + * encodes as only 4 UTF-8 bytes. + * + * Parameters: + * wcs: wide char target buffer + * utf: string to convert + * wcslen: size of target buffer (in wchar_t's) + * utflen: size of string to convert, or -1 if 0-terminated + * + * Returns: + * length of converted string (_wcslen(wcs)), or -1 on failure + * + * Errors: + * EINVAL: one of the input parameters is invalid (e.g. NULL) + * ERANGE: the output buffer is too small + */ +int xutftowcsn(wchar_t *wcs, const char *utf, size_t wcslen, int utflen); + +/** + * Simplified variant of xutftowcsn, assumes input string is \0-terminated. + */ +static inline int xutftowcs(wchar_t *wcs, const char *utf, size_t wcslen) +{ + return xutftowcsn(wcs, utf, wcslen, -1); +} + +/** + * Simplified file system specific variant of xutftowcsn, assumes output + * buffer size is MAX_PATH wide chars and input string is \0-terminated, + * fails with ENAMETOOLONG if input string is too long. + */ +static inline int xutftowcs_path(wchar_t *wcs, const char *utf) +{ + int result = xutftowcsn(wcs, utf, MAX_PATH, -1); + if (result < 0 && errno == ERANGE) + errno = ENAMETOOLONG; + return result; +} + +/** + * Converts UTF-16LE encoded string to UTF-8. + * + * Maximum space requirement for the target buffer is three UTF-8 chars per + * wide char ((_wcslen(wcs) * 3) + 1). + * + * The maximum space is needed only if the entire input string consists of + * UTF-16 words in range 0x0800-0xd7ff or 0xe000-0xffff (i.e. \u0800-\uffff + * modulo surrogate pairs), as per the following table: + * + * | | UTF-16 | UTF-8 | + * Code point | UTF-16 sequence | words | bytes | ratio + * --------------+-----------------------+--------+-------+------- + * 000000-00007f | 0000-007f | 1 | 1 | 1 + * 000080-0007ff | 0080-07ff | 1 | 2 | 2 + * 000800-00ffff | 0800-d7ff / e000-ffff | 1 | 3 | 3 + * 010000-10ffff | d800-dbff + dc00-dfff | 2 | 4 | 2 + * + * Note that invalid code points > 10ffff cannot be represented in UTF-16. + * + * Parameters: + * utf: target buffer + * wcs: wide string to convert + * utflen: size of target buffer + * + * Returns: + * length of converted string, or -1 on failure + * + * Errors: + * EINVAL: one of the input parameters is invalid (e.g. NULL) + * ERANGE: the output buffer is too small + */ +int xwcstoutf(char *utf, const wchar_t *wcs, size_t utflen); + +/* + * A critical section used in the implementation of the spawn + * functions (mingw_spawnv[p]e()) and waitpid(). Initialised in + * the replacement main() macro below. + */ +extern CRITICAL_SECTION pinfo_cs; + +/* + * Git, like most portable C applications, implements a main() function. On + * Windows, this main() function would receive parameters encoded in the + * current locale, but Git for Windows would prefer UTF-8 encoded parameters. + * + * To make that happen, we still declare main() here, and then declare and + * implement wmain() (which is the Unicode variant of main()) and compile with + * -municode. This wmain() function reencodes the parameters from UTF-16 to + * UTF-8 format, sets up a couple of other things as required on Windows, and + * then hands off to the main() function. + */ +int wmain(int argc, const wchar_t **w_argv); +int main(int argc, const char **argv); + +/* + * For debugging: if a problem occurs, say, in a Git process that is spawned + * from another Git process which in turn is spawned from yet another Git + * process, it can be quite daunting to figure out what is going on. + * + * Call this function to open a new MinTTY (this assumes you are in Git for + * Windows' SDK) with a GDB that attaches to the current process right away. + */ +void open_in_gdb(void); + +/* + * Used by Pthread API implementation for Windows + */ +int err_win_to_posix(DWORD winerr); + +#ifndef NO_UNIX_SOCKETS +int mingw_have_unix_sockets(void); +#undef have_unix_sockets +#define have_unix_sockets mingw_have_unix_sockets +#endif + +#endif /* COMPAT_MINGW_COMPAT_UTIL_H */ diff --git a/compat/mingw.h b/compat/mingw/posix.h similarity index 59% rename from compat/mingw.h rename to compat/mingw/posix.h index ebfb8ba423..8dddfa818d 100644 --- a/compat/mingw.h +++ b/compat/mingw/posix.h @@ -1,3 +1,6 @@ +#ifndef COMPAT_MINGW_POSIX_H +#define COMPAT_MINGW_POSIX_H + #ifdef __MINGW64_VERSION_MAJOR #include #include @@ -11,11 +14,6 @@ typedef _sigset_t sigset_t; #undef _POSIX_THREAD_SAFE_FUNCTIONS #endif -struct config_context; -int mingw_core_config(const char *var, const char *value, - const struct config_context *ctx, void *cb); -#define platform_core_config mingw_core_config - /* * things that are not available in header files */ @@ -180,27 +178,6 @@ int mingw_kill(pid_t pid, int sig); #define locate_in_PATH mingw_locate_in_PATH char *mingw_locate_in_PATH(const char *cmd); -#ifndef NO_OPENSSL -#include -static inline int mingw_SSL_set_fd(SSL *ssl, int fd) -{ - return SSL_set_fd(ssl, _get_osfhandle(fd)); -} -#define SSL_set_fd mingw_SSL_set_fd - -static inline int mingw_SSL_set_rfd(SSL *ssl, int fd) -{ - return SSL_set_rfd(ssl, _get_osfhandle(fd)); -} -#define SSL_set_rfd mingw_SSL_set_rfd - -static inline int mingw_SSL_set_wfd(SSL *ssl, int fd) -{ - return SSL_set_wfd(ssl, _get_osfhandle(fd)); -} -#define SSL_set_wfd mingw_SSL_set_wfd -#endif - /* * implementations of missing functions */ @@ -444,19 +421,6 @@ int winansi_dup2(int oldfd, int newfd); void winansi_init(void); HANDLE winansi_get_osfhandle(int fd); -/* - * git specific compatibility - */ - -static inline void convert_slashes(char *path) -{ - for (; *path; path++) - if (*path == '\\') - *path = '/'; -} -#define PATH_SEP ';' -char *mingw_query_user_email(void); -#define query_user_email mingw_query_user_email #if !defined(__MINGW64_VERSION_MAJOR) && (!defined(_MSC_VER) || _MSC_VER < 1800) #define PRIuMAX "I64u" #define PRId64 "I64d" @@ -464,176 +428,4 @@ char *mingw_query_user_email(void); #include #endif -/** - * Verifies that the specified path is owned by the user running the - * current process. - */ -int is_path_owned_by_current_sid(const char *path, struct strbuf *report); -#define is_path_owned_by_current_user is_path_owned_by_current_sid - -/** - * Verifies that the given path is a valid one on Windows. - * - * In particular, path segments are disallowed which - * - * - end in a period or a space (except the special directories `.` and `..`). - * - * - contain any of the reserved characters, e.g. `:`, `;`, `*`, etc - * - * - correspond to reserved names (such as `AUX`, `PRN`, etc) - * - * The `allow_literal_nul` parameter controls whether the path `NUL` should - * be considered valid (this makes sense e.g. before opening files, as it is - * perfectly legitimate to open `NUL` on Windows, just as it is to open - * `/dev/null` on Unix/Linux). - * - * Returns 1 upon success, otherwise 0. - */ -int is_valid_win32_path(const char *path, int allow_literal_nul); -#define is_valid_path(path) is_valid_win32_path(path, 0) - -/** - * Converts UTF-8 encoded string to UTF-16LE. - * - * To support repositories with legacy-encoded file names, invalid UTF-8 bytes - * 0xa0 - 0xff are converted to corresponding printable Unicode chars \u00a0 - - * \u00ff, and invalid UTF-8 bytes 0x80 - 0x9f (which would make non-printable - * Unicode) are converted to hex-code. - * - * Lead-bytes not followed by an appropriate number of trail-bytes, over-long - * encodings and 4-byte encodings > \u10ffff are detected as invalid UTF-8. - * - * Maximum space requirement for the target buffer is two wide chars per UTF-8 - * char (((strlen(utf) * 2) + 1) [* sizeof(wchar_t)]). - * - * The maximum space is needed only if the entire input string consists of - * invalid UTF-8 bytes in range 0x80-0x9f, as per the following table: - * - * | | UTF-8 | UTF-16 | - * Code point | UTF-8 sequence | bytes | words | ratio - * --------------+-------------------+-------+--------+------- - * 000000-00007f | 0-7f | 1 | 1 | 1 - * 000080-0007ff | c2-df + 80-bf | 2 | 1 | 0.5 - * 000800-00ffff | e0-ef + 2 * 80-bf | 3 | 1 | 0.33 - * 010000-10ffff | f0-f4 + 3 * 80-bf | 4 | 2 (a) | 0.5 - * invalid | 80-9f | 1 | 2 (b) | 2 - * invalid | a0-ff | 1 | 1 | 1 - * - * (a) encoded as UTF-16 surrogate pair - * (b) encoded as two hex digits - * - * Note that, while the UTF-8 encoding scheme can be extended to 5-byte, 6-byte - * or even indefinite-byte sequences, the largest valid code point \u10ffff - * encodes as only 4 UTF-8 bytes. - * - * Parameters: - * wcs: wide char target buffer - * utf: string to convert - * wcslen: size of target buffer (in wchar_t's) - * utflen: size of string to convert, or -1 if 0-terminated - * - * Returns: - * length of converted string (_wcslen(wcs)), or -1 on failure - * - * Errors: - * EINVAL: one of the input parameters is invalid (e.g. NULL) - * ERANGE: the output buffer is too small - */ -int xutftowcsn(wchar_t *wcs, const char *utf, size_t wcslen, int utflen); - -/** - * Simplified variant of xutftowcsn, assumes input string is \0-terminated. - */ -static inline int xutftowcs(wchar_t *wcs, const char *utf, size_t wcslen) -{ - return xutftowcsn(wcs, utf, wcslen, -1); -} - -/** - * Simplified file system specific variant of xutftowcsn, assumes output - * buffer size is MAX_PATH wide chars and input string is \0-terminated, - * fails with ENAMETOOLONG if input string is too long. - */ -static inline int xutftowcs_path(wchar_t *wcs, const char *utf) -{ - int result = xutftowcsn(wcs, utf, MAX_PATH, -1); - if (result < 0 && errno == ERANGE) - errno = ENAMETOOLONG; - return result; -} - -/** - * Converts UTF-16LE encoded string to UTF-8. - * - * Maximum space requirement for the target buffer is three UTF-8 chars per - * wide char ((_wcslen(wcs) * 3) + 1). - * - * The maximum space is needed only if the entire input string consists of - * UTF-16 words in range 0x0800-0xd7ff or 0xe000-0xffff (i.e. \u0800-\uffff - * modulo surrogate pairs), as per the following table: - * - * | | UTF-16 | UTF-8 | - * Code point | UTF-16 sequence | words | bytes | ratio - * --------------+-----------------------+--------+-------+------- - * 000000-00007f | 0000-007f | 1 | 1 | 1 - * 000080-0007ff | 0080-07ff | 1 | 2 | 2 - * 000800-00ffff | 0800-d7ff / e000-ffff | 1 | 3 | 3 - * 010000-10ffff | d800-dbff + dc00-dfff | 2 | 4 | 2 - * - * Note that invalid code points > 10ffff cannot be represented in UTF-16. - * - * Parameters: - * utf: target buffer - * wcs: wide string to convert - * utflen: size of target buffer - * - * Returns: - * length of converted string, or -1 on failure - * - * Errors: - * EINVAL: one of the input parameters is invalid (e.g. NULL) - * ERANGE: the output buffer is too small - */ -int xwcstoutf(char *utf, const wchar_t *wcs, size_t utflen); - -/* - * A critical section used in the implementation of the spawn - * functions (mingw_spawnv[p]e()) and waitpid(). Initialised in - * the replacement main() macro below. - */ -extern CRITICAL_SECTION pinfo_cs; - -/* - * Git, like most portable C applications, implements a main() function. On - * Windows, this main() function would receive parameters encoded in the - * current locale, but Git for Windows would prefer UTF-8 encoded parameters. - * - * To make that happen, we still declare main() here, and then declare and - * implement wmain() (which is the Unicode variant of main()) and compile with - * -municode. This wmain() function reencodes the parameters from UTF-16 to - * UTF-8 format, sets up a couple of other things as required on Windows, and - * then hands off to the main() function. - */ -int wmain(int argc, const wchar_t **w_argv); -int main(int argc, const char **argv); - -/* - * For debugging: if a problem occurs, say, in a Git process that is spawned - * from another Git process which in turn is spawned from yet another Git - * process, it can be quite daunting to figure out what is going on. - * - * Call this function to open a new MinTTY (this assumes you are in Git for - * Windows' SDK) with a GDB that attaches to the current process right away. - */ -void open_in_gdb(void); - -/* - * Used by Pthread API implementation for Windows - */ -int err_win_to_posix(DWORD winerr); - -#ifndef NO_UNIX_SOCKETS -int mingw_have_unix_sockets(void); -#undef have_unix_sockets -#define have_unix_sockets mingw_have_unix_sockets -#endif +#endif /* COMPAT_MINGW_POSIX_H */ diff --git a/compat/msvc.c b/compat/msvc.c index 71843d7eef..7f228a6399 100644 --- a/compat/msvc.c +++ b/compat/msvc.c @@ -3,4 +3,4 @@ #include #include "../strbuf.h" -#include "mingw.c" +#include "mingw/compat-util.c" diff --git a/compat/msvc.h b/compat/msvc.h index 1d7a8c6145..df39978f4f 100644 --- a/compat/msvc.h +++ b/compat/msvc.h @@ -28,6 +28,6 @@ typedef int sigset_t; /* open for reading, writing, or both (not in fcntl.h) */ #define O_ACCMODE (_O_RDONLY | _O_WRONLY | _O_RDWR) -#include "compat/mingw.h" +#include "compat/mingw/compat-util.h" #endif diff --git a/config.mak.uname b/config.mak.uname index b12d4e168a..cc4152e87e 100644 --- a/config.mak.uname +++ b/config.mak.uname @@ -541,7 +541,7 @@ endif EXTRA_PROGRAMS += headless-git$X -compat/msvc.o: compat/msvc.c compat/mingw.c GIT-CFLAGS +compat/msvc.o: compat/msvc.c compat/mingw/compat-util.c GIT-CFLAGS endif ifeq ($(uname_S),Interix) NO_INITGROUPS = YesPlease @@ -694,7 +694,7 @@ ifeq ($(uname_S),MINGW) BASIC_LDFLAGS += -municode COMPAT_CFLAGS += -DNOGDI -Icompat -Icompat/win32 COMPAT_CFLAGS += -DSTRIP_EXTENSION=\".exe\" - COMPAT_OBJS += compat/mingw.o compat/winansi.o \ + COMPAT_OBJS += compat/mingw/compat-util.o compat/winansi.o \ compat/win32/trace2_win32_process_info.o \ compat/win32/flush.o \ compat/win32/path-utils.o \ diff --git a/contrib/buildsystems/CMakeLists.txt b/contrib/buildsystems/CMakeLists.txt index 10dc54fdcb..65ce8705f0 100644 --- a/contrib/buildsystems/CMakeLists.txt +++ b/contrib/buildsystems/CMakeLists.txt @@ -258,7 +258,7 @@ if(CMAKE_SYSTEM_NAME STREQUAL "Windows") USE_NED_ALLOCATOR OVERRIDE_STRDUP MMAP_PREVENTS_DELETE USE_WIN32_MMAP HAVE_WPGMPTR ENSURE_MSYSTEM_IS_SET HAVE_RTLGENRANDOM) list(APPEND compat_SOURCES - compat/mingw.c + compat/mingw/compat-util.c compat/winansi.c compat/win32/flush.c compat/win32/path-utils.c diff --git a/git-compat-util.h b/git-compat-util.h index e283c46c6f..b96fb98e1e 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -304,10 +304,10 @@ static inline int is_xplatform_dir_sep(int c) #if defined(__MINGW32__) /* pull in Windows compatibility stuff */ #include "compat/win32/path-utils.h" -#include "compat/mingw.h" +#include "compat/mingw/compat-util.h" #elif defined(_MSC_VER) #include "compat/win32/path-utils.h" -#include "compat/msvc.h" +#include "compat/msvc/compat-util.h" #else #include #include diff --git a/meson.build b/meson.build index 2297f5e9dd..32eb0a86d5 100644 --- a/meson.build +++ b/meson.build @@ -1054,7 +1054,7 @@ if host_machine.system() == 'cygwin' ] elif host_machine.system() == 'windows' libgit_sources += [ - 'compat/mingw.c', + 'compat/mingw/compat-util.c', 'compat/winansi.c', 'compat/win32/flush.c', 'compat/win32/path-utils.c', @@ -1157,7 +1157,7 @@ else error('Native regex support requested but not found') endif -# setitimer and friends are provided by compat/mingw.c. +# setitimer and friends are provided by compat/mingw/compat-util.c. if host_machine.system() != 'windows' if not compiler.compiles(''' #include @@ -1237,7 +1237,7 @@ if not compiler.has_function('qsort') endif libgit_sources += 'compat/qsort_s.c' -# unsetenv is provided by compat/mingw.c. +# unsetenv is provided by compat/mingw/compat-util.c. if host_machine.system() != 'windows' and not compiler.has_function('unsetenv') libgit_c_args += '-DNO_UNSETENV' libgit_sources += 'compat/unsetenv.c' From patchwork Mon Jan 27 13:04:24 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Steinhardt X-Patchwork-Id: 13951365 Received: from fout-a5-smtp.messagingengine.com (fout-a5-smtp.messagingengine.com [103.168.172.148]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 13978200130 for ; Mon, 27 Jan 2025 13:04:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.148 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983072; cv=none; b=fFwnrWm50jMRrN2A7ypEiwltdM4njSREGWlWKg8LIKR22OPun/z90o2FD4ZkqvTLBFre1tTkQdtJ42S8vIRSBkZA5quDXkQL6I/aGX2tAMLHh9B9D7ttsfQkoC9/c8dOh2FtEwzAb9j8tGrrUEMQL3DagggIQv4l+39azIQAHDI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983072; c=relaxed/simple; bh=EnaLw+NLNmnlMJN23Isi1K/JhgAg7qp4GARB5M/TpGg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=CTsWmviOEgCnI4MOV7Rw+48lk2XkXM5NV8W3Poip+QKqxjhz/o5G3NEODk3e+ucsmQYP8d+lOiloHxgfClOaOo3l95HVkYduDOasX+hbJNVkPkntf+kov5kag+GGK8V0i7qrrNfIMSif3gVDDSUju1IIK2nmT4PwGn9SyJ742/A= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im; spf=pass smtp.mailfrom=pks.im; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b=Mwts0sq3; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=egd6tzZM; arc=none smtp.client-ip=103.168.172.148 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pks.im Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b="Mwts0sq3"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="egd6tzZM" Received: from phl-compute-04.internal (phl-compute-04.phl.internal [10.202.2.44]) by mailfout.phl.internal (Postfix) with ESMTP id 4019E13801C4; Mon, 27 Jan 2025 08:04:30 -0500 (EST) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-04.internal (MEProxy); Mon, 27 Jan 2025 08:04:30 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pks.im; h=cc:cc :content-transfer-encoding:content-type:content-type:date:date :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm3; t=1737983070; x=1738069470; bh=odlaHGn4S/YL9fx5ULUZ2Ifb22LuPqxkrEIvVpC872Q=; b= Mwts0sq3SOrQR4axP5NHpaFamVBXYx+rLnaRpeNkTg5ZzSIOg4zCZWr5ZyWgDzfC ja+09PBCI1hco7g8HCjYdiNVKMrAjXOn966tIA7GzWOfEzsvc+V6Da2SC/jeIImB 9Q4f2F8jx8lGOqQoaxUw7T6tuKkhKEU95xZPaHa7Zww/QRbsJ/SDKPwHQj337VpV cGsHKPOFshQUlQ10LDqq2tYlyD/Ff7eTO3WzyKxoopHr1d7284Wv0kmp0wBrwB/4 +JpwUHytYrOfQI4m5BTvmG0yCgyWrG8RArv6drkgTE5PfJVBwVyE/FjIhaE4uAPS cEFOpvyzfK6rrc7B8r0stg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1737983070; x= 1738069470; bh=odlaHGn4S/YL9fx5ULUZ2Ifb22LuPqxkrEIvVpC872Q=; b=e gd6tzZM4OTn7zVridMYHjqnhfzaOMAKdv6u85aJ0PfSM+ecCQJMrsyPeccmswcW/ MhyAnd9KF2ORk09CtXBi2fatbYVu83EpUMN0pl5jXIuczW1InExiWbTCLOER3UON CNv0V87gNu0uAWRiVJj6Ux677XOryYDKxEZQUpsng7oeln1DjMdqqp7moMDVuine HPUJvbAedFnfWH0l6HVNQ+tGM7wYrehtbfF8G4QPo9aNsuipKS7OktIQSgEtmkq6 c2NT7XgXGKL/MQGqlrh4hNG2+SfNQOmPCP2+DAiJlqjAM03F7uvED/NynSFy+PBm jcEFrEA5nNZTnGftlqQ6g== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefuddrudejgedgudefvdegucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdggtfgfnhhsuhgsshgtrhhisggv pdfurfetoffkrfgpnffqhgenuceurghilhhouhhtmecufedttdenucesvcftvggtihhpih gvnhhtshculddquddttddmnecujfgurhephfffufggtgfgkfhfjgfvvefosehtjeertder tdejnecuhfhrohhmpefrrghtrhhitghkucfuthgvihhnhhgrrhguthcuoehpshesphhksh drihhmqeenucggtffrrghtthgvrhhnpeffueeiudejvdekheeuvdekfeffiedvueelteek udehjeetkeegvddugfdtgfeileenucevlhhushhtvghrufhiiigvpeefnecurfgrrhgrmh epmhgrihhlfhhrohhmpehpshesphhkshdrihhmpdhnsggprhgtphhtthhopedvpdhmohgu vgepshhmthhpohhuthdprhgtphhtthhopehgihhtsehvghgvrhdrkhgvrhhnvghlrdhorh hgpdhrtghpthhtohepvghthhhomhhsohhnsegvugifrghrughthhhomhhsohhnrdgtohhm X-ME-Proxy: Feedback-ID: i197146af:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 27 Jan 2025 08:04:29 -0500 (EST) Received: by vm-mail (OpenSMTPD) with ESMTPSA id d571247e (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Mon, 27 Jan 2025 13:04:27 +0000 (UTC) From: Patrick Steinhardt Date: Mon, 27 Jan 2025 14:04:24 +0100 Subject: [PATCH 16/19] compat/msvc: split out POSIX-related bits Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250127-pks-reftable-drop-git-compat-util-v1-16-6e280a564877@pks.im> References: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> In-Reply-To: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> To: git@vger.kernel.org Cc: Edward Thomson X-Mailer: b4 0.14.2 Split out the POSIX-related bits from "compat/msvc.h". This is in preparation for splitting up "git-compat-utils.h" into a header that provides POSIX-compatibility and a header that provides common wrappers used by the Git project. Signed-off-by: Patrick Steinhardt --- compat/{msvc.c => msvc/compat-util.c} | 0 compat/msvc/compat-util.h | 7 +++++++ compat/{msvc.h => msvc/posix.h} | 8 ++++---- config.mak.uname | 4 ++-- meson.build | 4 +++- 5 files changed, 16 insertions(+), 7 deletions(-) diff --git a/compat/msvc.c b/compat/msvc/compat-util.c similarity index 100% rename from compat/msvc.c rename to compat/msvc/compat-util.c diff --git a/compat/msvc/compat-util.h b/compat/msvc/compat-util.h new file mode 100644 index 0000000000..e409e9910c --- /dev/null +++ b/compat/msvc/compat-util.h @@ -0,0 +1,7 @@ +#ifndef COMPAT_MSVC_COMPAT_UTIL_H +#define COMPAT_MSVC_COMPAT_UTIL_H + +#include "compat/msvc/posix.h" +#include "compat/mingw/compat-util.h" + +#endif /* COMPAT_MSVC_COMPAT_UTIL_H */ diff --git a/compat/msvc.h b/compat/msvc/posix.h similarity index 86% rename from compat/msvc.h rename to compat/msvc/posix.h index df39978f4f..47062293cb 100644 --- a/compat/msvc.h +++ b/compat/msvc/posix.h @@ -1,5 +1,5 @@ -#ifndef __MSVC__HEAD -#define __MSVC__HEAD +#ifndef COMPAT_MSVC_POSIX_H +#define COMPAT_MSVC_POSIX_H #include #include @@ -28,6 +28,6 @@ typedef int sigset_t; /* open for reading, writing, or both (not in fcntl.h) */ #define O_ACCMODE (_O_RDONLY | _O_WRONLY | _O_RDWR) -#include "compat/mingw/compat-util.h" +#include "compat/mingw/posix.h" -#endif +#endif /* COMPAT_MSVC_POSIX_H */ diff --git a/config.mak.uname b/config.mak.uname index cc4152e87e..dbd05adb5d 100644 --- a/config.mak.uname +++ b/config.mak.uname @@ -495,7 +495,7 @@ endif AR = compat/vcbuild/scripts/lib.pl CFLAGS = BASIC_CFLAGS = -nologo -I. -Icompat/vcbuild/include -DWIN32 -D_CONSOLE -DHAVE_STRING_H -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_DEPRECATE - COMPAT_OBJS = compat/msvc.o compat/winansi.o \ + COMPAT_OBJS = compat/msvc/compat-util.o compat/winansi.o \ compat/win32/flush.o \ compat/win32/path-utils.o \ compat/win32/pthread.o compat/win32/syslog.o \ @@ -541,7 +541,7 @@ endif EXTRA_PROGRAMS += headless-git$X -compat/msvc.o: compat/msvc.c compat/mingw/compat-util.c GIT-CFLAGS +compat/msvc/compat-util.o: compat/msvc/compat-util.c compat/mingw/compat-util.c GIT-CFLAGS endif ifeq ($(uname_S),Interix) NO_INITGROUPS = YesPlease diff --git a/meson.build b/meson.build index 32eb0a86d5..e8abf798f5 100644 --- a/meson.build +++ b/meson.build @@ -1054,7 +1054,6 @@ if host_machine.system() == 'cygwin' ] elif host_machine.system() == 'windows' libgit_sources += [ - 'compat/mingw/compat-util.c', 'compat/winansi.c', 'compat/win32/flush.c', 'compat/win32/path-utils.c', @@ -1081,6 +1080,9 @@ elif host_machine.system() == 'windows' libgit_include_directories += 'compat/win32' if compiler.get_id() == 'msvc' libgit_include_directories += 'compat/vcbuild/include' + libgit_sources += 'compat/msvc/compat-util.c' + else + libgit_sources += 'compat/mingw/compat-util.c' endif endif From patchwork Mon Jan 27 13:04:25 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Steinhardt X-Patchwork-Id: 13951368 Received: from fhigh-a1-smtp.messagingengine.com (fhigh-a1-smtp.messagingengine.com [103.168.172.152]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 36FA4200B89 for ; Mon, 27 Jan 2025 13:04:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.152 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983075; cv=none; b=eW0U6Fs0jLmbNWCRlo6R2hLAx3XMOhOV2D+ReoJMiWVo8lZb/dFaJIbvApOFBuTi75YQVDXrBkovNTFqCTSK+hUHHdieQKmszLE9x3NhhxxI1zuCXiPDQMEH6sWFtRRPWCBMwByXzEv7AJPYzfYE3LWmN1pjzRiC8tKLAclt1KM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983075; c=relaxed/simple; bh=3QD9mVmCScRv3bvDyURW4x81SE2lCvs4efeqjdK0TbQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tIgPvtGkYWv+qALP0W9CMSpUEKqaJximXpEexLLFGf01JTJVif8L3SkaPpjgQh2R124A+/g843ltQDkQfRElv4YnUoEOuUFq0QXEuO9UT5TWGJvaVPcgFMESsx/8CuEv3aCCfobtcju0/tsJSZzB58N3AhCO1ySnjhYpXI71Q/g= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im; spf=pass smtp.mailfrom=pks.im; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b=UMU6DSAk; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=M3jsuBCD; arc=none smtp.client-ip=103.168.172.152 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pks.im Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b="UMU6DSAk"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="M3jsuBCD" Received: from phl-compute-04.internal (phl-compute-04.phl.internal [10.202.2.44]) by mailfhigh.phl.internal (Postfix) with ESMTP id 4270411401EF; Mon, 27 Jan 2025 08:04:31 -0500 (EST) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-04.internal (MEProxy); Mon, 27 Jan 2025 08:04:31 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pks.im; h=cc:cc :content-transfer-encoding:content-type:content-type:date:date :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm3; t=1737983071; x=1738069471; bh=3DgyeKFHPKkCvik0RCPSerV/pYoYEd48qKyrvnSNC9s=; b= UMU6DSAktOAOkdjvzNvs6d2MdjjFa/iUlgLFPQBnXd7ZoH4M9a9LuRiXvuImJRiB O1lUcNGQnmnnwBRJ1C2DjwOLwCOK5c9HS9xX056Alnwq6MlRyM3AfC0UjeWdJT/N N9LvDRZOrq4CttqQCKyoruDXs8eOa0RHyjIVaeeGYmJcwB39xYYQUxPGGs9x1esg Vf++6L1DuKJ1PeggXFAepZiKGpDxQcUP+Q4fvRRSF2/y6vUOf/rDqobK2mURFKAj 1/OwXv2lKWOFiZaTh2FhBGEEAwbqz26VeBFFfosaJ//jsbHaULhhfjBXILZGeWNJ bQjj8KfwgQan6msYyKvLQg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1737983071; x= 1738069471; bh=3DgyeKFHPKkCvik0RCPSerV/pYoYEd48qKyrvnSNC9s=; b=M 3jsuBCDZ41BIH369fHarnnao2AoKedQYg+vwUkV+SCyhdiIIL0mlPKoMGfx0+ouk /JlNgAl8rsWpzLQ4QxcUMy/ZfG1M56U3ft3YRhbEbkY+mfXDl3Di54kywZWMENgK DgEQdOzJ0G3XPo+OrpE35I0B6ju6pP9aMoXmo+YeffwRxBukQsUCyDY/Ca4wOWOM fHLoj/bmdQuwBi25l3khrVOWM/1qnKgvqSWVFdTBhRsQi+nLTwTzbBkcWHKijGSg +pePWr5U4Yvyc5gT5utAnnYTJdx7bwDtnp7Oqq+X7cnD6NfTOL7fjfSfJeVcxwmX Gs1+pjcUDxyx1BJMrEhpA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefuddrudejgedgudefvdegucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdggtfgfnhhsuhgsshgtrhhisggv pdfurfetoffkrfgpnffqhgenuceurghilhhouhhtmecufedttdenucesvcftvggtihhpih gvnhhtshculddquddttddmnecujfgurhephfffufggtgfgkfhfjgfvvefosehtjeertder tdejnecuhfhrohhmpefrrghtrhhitghkucfuthgvihhnhhgrrhguthcuoehpshesphhksh drihhmqeenucggtffrrghtthgvrhhnpeffueeiudejvdekheeuvdekfeffiedvueelteek udehjeetkeegvddugfdtgfeileenucevlhhushhtvghrufhiiigvpeefnecurfgrrhgrmh epmhgrihhlfhhrohhmpehpshesphhkshdrihhmpdhnsggprhgtphhtthhopedvpdhmohgu vgepshhmthhpohhuthdprhgtphhtthhopegvthhhohhmshhonhesvggufigrrhguthhhoh hmshhonhdrtghomhdprhgtphhtthhopehgihhtsehvghgvrhdrkhgvrhhnvghlrdhorhhg X-ME-Proxy: Feedback-ID: i197146af:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 27 Jan 2025 08:04:30 -0500 (EST) Received: by vm-mail (OpenSMTPD) with ESMTPSA id 053f6899 (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Mon, 27 Jan 2025 13:04:28 +0000 (UTC) From: Patrick Steinhardt Date: Mon, 27 Jan 2025 14:04:25 +0100 Subject: [PATCH 17/19] git-compat-util.h: split out POSIX-emulating bits Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250127-pks-reftable-drop-git-compat-util-v1-17-6e280a564877@pks.im> References: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> In-Reply-To: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> To: git@vger.kernel.org Cc: Edward Thomson X-Mailer: b4 0.14.2 The "git-compat-util.h" header is a treasure trove of various bits and pieces used throughout the project. It basically mixes two different things into one: - Providing a POSIX-like interface even on platforms that aren't POSIX-compliant. - Providing low-level functionality that is specific to Git. This intermixing is a bit of a problem for the reftable library as we don't want to recreate the POSIX-like interface there. But neither do we want to pull in the Git-specific functionality, as it is otherwise quite easy to start depedning on the Git codebase again. Split out a new header "compat/posix.h" that only contains the bits and pieces relevant for the emulation of POSIX, which we will start using in the next commit. Signed-off-by: Patrick Steinhardt --- compat/posix.h | 541 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ git-compat-util.h | 531 +---------------------------------------------------- 2 files changed, 543 insertions(+), 529 deletions(-) diff --git a/compat/posix.h b/compat/posix.h new file mode 100644 index 0000000000..2b2da97965 --- /dev/null +++ b/compat/posix.h @@ -0,0 +1,541 @@ +#ifndef COMPAT_POSIX_H +#define COMPAT_POSIX_H + +#define _FILE_OFFSET_BITS 64 + +/* + * Derived from Linux "Features Test Macro" header + * Convenience macros to test the versions of gcc (or + * a compatible compiler). + * Use them like this: + * #if GIT_GNUC_PREREQ (2,8) + * ... code requiring gcc 2.8 or later ... + * #endif + * + * This macro of course is not part of POSIX, but we need it for the UNUSED + * macro which is used by some of our POSIX compatibility wrappers. +*/ +#if defined(__GNUC__) && defined(__GNUC_MINOR__) +# define GIT_GNUC_PREREQ(maj, min) \ + ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) +#else + #define GIT_GNUC_PREREQ(maj, min) 0 +#endif + +/* + * UNUSED marks a function parameter that is always unused. It also + * can be used to annotate a function, a variable, or a type that is + * always unused. + * + * A callback interface may dictate that a function accepts a + * parameter at that position, but the implementation of the function + * may not need to use the parameter. In such a case, mark the parameter + * with UNUSED. + * + * When a parameter may be used or unused, depending on conditional + * compilation, consider using MAYBE_UNUSED instead. + */ +#if GIT_GNUC_PREREQ(4, 5) +#define UNUSED __attribute__((unused)) \ + __attribute__((deprecated ("parameter declared as UNUSED"))) +#elif defined(__GNUC__) +#define UNUSED __attribute__((unused)) \ + __attribute__((deprecated)) +#else +#define UNUSED +#endif + +#ifdef __MINGW64__ +#define _POSIX_C_SOURCE 1 +#elif defined(__sun__) + /* + * On Solaris, when _XOPEN_EXTENDED is set, its header file + * forces the programs to be XPG4v2, defeating any _XOPEN_SOURCE + * setting to say we are XPG5 or XPG6. Also on Solaris, + * XPG6 programs must be compiled with a c99 compiler, while + * non XPG6 programs must be compiled with a pre-c99 compiler. + */ +# if __STDC_VERSION__ - 0 >= 199901L +# define _XOPEN_SOURCE 600 +# else +# define _XOPEN_SOURCE 500 +# endif +#elif !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__USLC__) && \ + !defined(_M_UNIX) && !defined(__sgi) && !defined(__DragonFly__) && \ + !defined(__TANDEM) && !defined(__QNX__) && !defined(__MirBSD__) && \ + !defined(__CYGWIN__) +#define _XOPEN_SOURCE 600 /* glibc2 and AIX 5.3L need 500, OpenBSD needs 600 for S_ISLNK() */ +#define _XOPEN_SOURCE_EXTENDED 1 /* AIX 5.3L needs this */ +#endif +#define _ALL_SOURCE 1 +#define _GNU_SOURCE 1 +#define _BSD_SOURCE 1 +#define _DEFAULT_SOURCE 1 +#define _NETBSD_SOURCE 1 +#define _SGI_SOURCE 1 + +#if defined(WIN32) && !defined(__CYGWIN__) /* Both MinGW and MSVC */ +# if !defined(_WIN32_WINNT) +# define _WIN32_WINNT 0x0600 +# endif +#define WIN32_LEAN_AND_MEAN /* stops windows.h including winsock.h */ +#include +#ifndef NO_UNIX_SOCKETS +#include +#endif +#include +#define GIT_WINDOWS_NATIVE +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef HAVE_STRINGS_H +#include /* for strcasecmp() */ +#endif +#include +#include +#include +#ifdef NEEDS_SYS_PARAM_H +#include +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if !defined(NO_POLL_H) +#include +#elif !defined(NO_SYS_POLL_H) +#include +#else +/* Pull the compat stuff */ +#include +#endif +#ifdef HAVE_BSD_SYSCTL +#include +#endif + +#if defined(__MINGW32__) +#include "compat/mingw/posix.h" +#elif defined(_MSC_VER) +#include "compat/msvc/posix.h" +#else +#include +#include +#include +#include +#include +#include +#include +#ifndef NO_SYS_SELECT_H +#include +#endif +#include +#include +#include +#include +#include +#include +#ifndef NO_INTTYPES_H +#include +#else +#include +#endif +#ifdef HAVE_ARC4RANDOM_LIBBSD +#include +#endif +#ifdef HAVE_GETRANDOM +#include +#endif +#ifdef NO_INTPTR_T +/* + * On I16LP32, ILP32 and LP64 "long" is the safe bet, however + * on LLP86, IL33LLP64 and P64 it needs to be "long long", + * while on IP16 and IP16L32 it is "int" (resp. "short") + * Size needs to match (or exceed) 'sizeof(void *)'. + * We can't take "long long" here as not everybody has it. + */ +typedef long intptr_t; +typedef unsigned long uintptr_t; +#endif +#undef _ALL_SOURCE /* AIX 5.3L defines a struct list with _ALL_SOURCE. */ +#include +#define _ALL_SOURCE 1 +#endif + +#ifdef MKDIR_WO_TRAILING_SLASH +#define mkdir(a,b) compat_mkdir_wo_trailing_slash((a),(b)) +int compat_mkdir_wo_trailing_slash(const char*, mode_t); +#endif + +#ifdef time +#undef time +#endif +static inline time_t git_time(time_t *tloc) +{ + struct timeval tv; + + /* + * Avoid time(NULL), which can disagree with gettimeofday(2) + * and filesystem timestamps. + */ + gettimeofday(&tv, NULL); + + if (tloc) + *tloc = tv.tv_sec; + return tv.tv_sec; +} +#define time git_time + +#ifdef NO_STRUCT_ITIMERVAL +struct itimerval { + struct timeval it_interval; + struct timeval it_value; +}; +#endif + +#ifdef NO_SETITIMER +static inline int git_setitimer(int which UNUSED, + const struct itimerval *value UNUSED, + struct itimerval *newvalue UNUSED) { + return 0; /* pretend success */ +} +#undef setitimer +#define setitimer(which,value,ovalue) git_setitimer(which,value,ovalue) +#endif + +#ifndef NO_LIBGEN_H +#include +#else +#define basename gitbasename +char *gitbasename(char *); +#define dirname gitdirname +char *gitdirname(char *); +#endif + +#ifndef NO_ICONV +#include +#endif + +/* On most systems would have given us this, but + * not on some systems (e.g. z/OS). + */ +#ifndef NI_MAXHOST +#define NI_MAXHOST 1025 +#endif + +#ifndef NI_MAXSERV +#define NI_MAXSERV 32 +#endif + +/* On most systems would have given us this, but + * not on some systems (e.g. GNU/Hurd). + */ +#ifndef PATH_MAX +#define PATH_MAX 4096 +#endif + +#ifndef NAME_MAX +#define NAME_MAX 255 +#endif + +typedef uintmax_t timestamp_t; +#define PRItime PRIuMAX +#define parse_timestamp strtoumax +#define TIME_MAX UINTMAX_MAX +#define TIME_MIN 0 + +int lstat_cache_aware_rmdir(const char *path); +#if !defined(__MINGW32__) && !defined(_MSC_VER) +#define rmdir lstat_cache_aware_rmdir +#endif + +#if defined(NO_MMAP) || defined(USE_WIN32_MMAP) + +#ifndef PROT_READ +#define PROT_READ 1 +#define PROT_WRITE 2 +#define MAP_PRIVATE 1 +#endif + +#define mmap git_mmap +#define munmap git_munmap +void *git_mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset); +int git_munmap(void *start, size_t length); + +#else /* NO_MMAP || USE_WIN32_MMAP */ + +#include + +#endif /* NO_MMAP || USE_WIN32_MMAP */ + +#ifndef MAP_FAILED +#define MAP_FAILED ((void *)-1) +#endif + +#ifdef NEEDS_MODE_TRANSLATION +#undef S_IFMT +#undef S_IFREG +#undef S_IFDIR +#undef S_IFLNK +#undef S_IFBLK +#undef S_IFCHR +#undef S_IFIFO +#undef S_IFSOCK +#define S_IFMT 0170000 +#define S_IFREG 0100000 +#define S_IFDIR 0040000 +#define S_IFLNK 0120000 +#define S_IFBLK 0060000 +#define S_IFCHR 0020000 +#define S_IFIFO 0010000 +#define S_IFSOCK 0140000 +#ifdef stat +#undef stat +#endif +#define stat(path, buf) git_stat(path, buf) +int git_stat(const char *, struct stat *); +#ifdef fstat +#undef fstat +#endif +#define fstat(fd, buf) git_fstat(fd, buf) +int git_fstat(int, struct stat *); +#ifdef lstat +#undef lstat +#endif +#define lstat(path, buf) git_lstat(path, buf) +int git_lstat(const char *, struct stat *); +#endif + +#ifdef NO_PREAD +#define pread git_pread +ssize_t git_pread(int fd, void *buf, size_t count, off_t offset); +#endif + +#ifdef NO_SETENV +#define setenv gitsetenv +int gitsetenv(const char *, const char *, int); +#endif + +#ifdef NO_MKDTEMP +#define mkdtemp gitmkdtemp +char *gitmkdtemp(char *); +#endif + +#ifdef NO_UNSETENV +#define unsetenv gitunsetenv +int gitunsetenv(const char *); +#endif + +#ifdef NO_STRCASESTR +#define strcasestr gitstrcasestr +char *gitstrcasestr(const char *haystack, const char *needle); +#endif + +#ifdef NO_STRLCPY +#define strlcpy gitstrlcpy +size_t gitstrlcpy(char *, const char *, size_t); +#endif + +#ifdef NO_STRTOUMAX +#define strtoumax gitstrtoumax +uintmax_t gitstrtoumax(const char *, char **, int); +#define strtoimax gitstrtoimax +intmax_t gitstrtoimax(const char *, char **, int); +#endif + +#ifdef NO_HSTRERROR +#define hstrerror githstrerror +const char *githstrerror(int herror); +#endif + +#ifdef NO_MEMMEM +#define memmem gitmemmem +void *gitmemmem(const void *haystack, size_t haystacklen, + const void *needle, size_t needlelen); +#endif + +#ifdef OVERRIDE_STRDUP +#ifdef strdup +#undef strdup +#endif +#define strdup gitstrdup +char *gitstrdup(const char *s); +#endif + +#ifdef NO_GETPAGESIZE +#define getpagesize() sysconf(_SC_PAGESIZE) +#endif + +#ifndef O_CLOEXEC +#define O_CLOEXEC 0 +#endif + +#ifdef FREAD_READS_DIRECTORIES +# if !defined(SUPPRESS_FOPEN_REDEFINITION) +# ifdef fopen +# undef fopen +# endif +# define fopen(a,b) git_fopen(a,b) +# endif +FILE *git_fopen(const char*, const char*); +#endif + +#ifdef SNPRINTF_RETURNS_BOGUS +#ifdef snprintf +#undef snprintf +#endif +#define snprintf git_snprintf +int git_snprintf(char *str, size_t maxsize, + const char *format, ...); +#ifdef vsnprintf +#undef vsnprintf +#endif +#define vsnprintf git_vsnprintf +int git_vsnprintf(char *str, size_t maxsize, + const char *format, va_list ap); +#endif + +#ifdef OPEN_RETURNS_EINTR +#undef open +#define open git_open_with_retry +int git_open_with_retry(const char *path, int flag, ...); +#endif + +#ifdef __GLIBC_PREREQ +#if __GLIBC_PREREQ(2, 1) +#define HAVE_STRCHRNUL +#endif +#endif + +#ifndef HAVE_STRCHRNUL +#define strchrnul gitstrchrnul +static inline char *gitstrchrnul(const char *s, int c) +{ + while (*s && *s != c) + s++; + return (char *)s; +} +#endif + +#ifdef NO_INET_PTON +int inet_pton(int af, const char *src, void *dst); +#endif + +#ifdef NO_INET_NTOP +const char *inet_ntop(int af, const void *src, char *dst, size_t size); +#endif + +#ifdef NO_PTHREADS +#define atexit git_atexit +int git_atexit(void (*handler)(void)); +#endif + +#ifndef HOST_NAME_MAX +#define HOST_NAME_MAX 256 +#endif + +#include "sane-ctype.h" + +void git_stable_qsort(void *base, size_t nmemb, size_t size, + int(*compar)(const void *, const void *)); +#ifdef INTERNAL_QSORT +#define qsort git_stable_qsort +#endif + +#define QSORT(base, n, compar) sane_qsort((base), (n), sizeof(*(base)), compar) +static inline void sane_qsort(void *base, size_t nmemb, size_t size, + int(*compar)(const void *, const void *)) +{ + if (nmemb > 1) + qsort(base, nmemb, size, compar); +} + +#define STABLE_QSORT(base, n, compar) \ + git_stable_qsort((base), (n), sizeof(*(base)), compar) + +#ifndef HAVE_ISO_QSORT_S +int git_qsort_s(void *base, size_t nmemb, size_t size, + int (*compar)(const void *, const void *, void *), void *ctx); +#define qsort_s git_qsort_s +#endif + +#define QSORT_S(base, n, compar, ctx) do { \ + if (qsort_s((base), (n), sizeof(*(base)), compar, ctx)) \ + BUG("qsort_s() failed"); \ +} while (0) + +#ifdef NO_NSEC +#undef USE_NSEC +#define ST_CTIME_NSEC(st) 0 +#define ST_MTIME_NSEC(st) 0 +#else +#ifdef USE_ST_TIMESPEC +#define ST_CTIME_NSEC(st) ((unsigned int)((st).st_ctimespec.tv_nsec)) +#define ST_MTIME_NSEC(st) ((unsigned int)((st).st_mtimespec.tv_nsec)) +#else +#define ST_CTIME_NSEC(st) ((unsigned int)((st).st_ctim.tv_nsec)) +#define ST_MTIME_NSEC(st) ((unsigned int)((st).st_mtim.tv_nsec)) +#endif +#endif + +#ifndef va_copy +/* + * Since an obvious implementation of va_list would be to make it a + * pointer into the stack frame, a simple assignment will work on + * many systems. But let's try to be more portable. + */ +#ifdef __va_copy +#define va_copy(dst, src) __va_copy(dst, src) +#else +#define va_copy(dst, src) ((dst) = (src)) +#endif +#endif + +#ifndef _POSIX_THREAD_SAFE_FUNCTIONS +static inline void git_flockfile(FILE *fh UNUSED) +{ + ; /* nothing */ +} +static inline void git_funlockfile(FILE *fh UNUSED) +{ + ; /* nothing */ +} +#undef flockfile +#undef funlockfile +#undef getc_unlocked +#define flockfile(fh) git_flockfile(fh) +#define funlockfile(fh) git_funlockfile(fh) +#define getc_unlocked(fh) getc(fh) +#endif + +#ifdef FILENO_IS_A_MACRO +int git_fileno(FILE *stream); +# ifndef COMPAT_CODE_FILENO +# undef fileno +# define fileno(p) git_fileno(p) +# endif +#endif + +#ifdef NEED_ACCESS_ROOT_HANDLER +int git_access(const char *path, int mode); +# ifndef COMPAT_CODE_ACCESS +# ifdef access +# undef access +# endif +# define access(path, mode) git_access(path, mode) +# endif +#endif + +#endif /* COMPAT_POSIX_H */ diff --git a/git-compat-util.h b/git-compat-util.h index b96fb98e1e..30ad0725fb 100644 --- a/git-compat-util.h +++ b/git-compat-util.h @@ -23,26 +23,9 @@ #include #endif -struct strbuf; - - -#define _FILE_OFFSET_BITS 64 +#include "compat/posix.h" - -/* Derived from Linux "Features Test Macro" header - * Convenience macros to test the versions of gcc (or - * a compatible compiler). - * Use them like this: - * #if GIT_GNUC_PREREQ (2,8) - * ... code requiring gcc 2.8 or later ... - * #endif -*/ -#if defined(__GNUC__) && defined(__GNUC_MINOR__) -# define GIT_GNUC_PREREQ(maj, min) \ - ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) -#else - #define GIT_GNUC_PREREQ(maj, min) 0 -#endif +struct strbuf; #if defined(__GNUC__) || defined(__clang__) # define PRAGMA(pragma) _Pragma(#pragma) @@ -176,71 +159,6 @@ DISABLE_WARNING(-Wsign-compare) /* Approximation of the length of the decimal representation of this type. */ #define decimal_length(x) ((int)(sizeof(x) * 2.56 + 0.5) + 1) -#ifdef __MINGW64__ -#define _POSIX_C_SOURCE 1 -#elif defined(__sun__) - /* - * On Solaris, when _XOPEN_EXTENDED is set, its header file - * forces the programs to be XPG4v2, defeating any _XOPEN_SOURCE - * setting to say we are XPG5 or XPG6. Also on Solaris, - * XPG6 programs must be compiled with a c99 compiler, while - * non XPG6 programs must be compiled with a pre-c99 compiler. - */ -# if __STDC_VERSION__ - 0 >= 199901L -# define _XOPEN_SOURCE 600 -# else -# define _XOPEN_SOURCE 500 -# endif -#elif !defined(__APPLE__) && !defined(__FreeBSD__) && !defined(__USLC__) && \ - !defined(_M_UNIX) && !defined(__sgi) && !defined(__DragonFly__) && \ - !defined(__TANDEM) && !defined(__QNX__) && !defined(__MirBSD__) && \ - !defined(__CYGWIN__) -#define _XOPEN_SOURCE 600 /* glibc2 and AIX 5.3L need 500, OpenBSD needs 600 for S_ISLNK() */ -#define _XOPEN_SOURCE_EXTENDED 1 /* AIX 5.3L needs this */ -#endif -#define _ALL_SOURCE 1 -#define _GNU_SOURCE 1 -#define _BSD_SOURCE 1 -#define _DEFAULT_SOURCE 1 -#define _NETBSD_SOURCE 1 -#define _SGI_SOURCE 1 - -/* - * UNUSED marks a function parameter that is always unused. It also - * can be used to annotate a function, a variable, or a type that is - * always unused. - * - * A callback interface may dictate that a function accepts a - * parameter at that position, but the implementation of the function - * may not need to use the parameter. In such a case, mark the parameter - * with UNUSED. - * - * When a parameter may be used or unused, depending on conditional - * compilation, consider using MAYBE_UNUSED instead. - */ -#if GIT_GNUC_PREREQ(4, 5) -#define UNUSED __attribute__((unused)) \ - __attribute__((deprecated ("parameter declared as UNUSED"))) -#elif defined(__GNUC__) -#define UNUSED __attribute__((unused)) \ - __attribute__((deprecated)) -#else -#define UNUSED -#endif - -#if defined(WIN32) && !defined(__CYGWIN__) /* Both MinGW and MSVC */ -# if !defined(_WIN32_WINNT) -# define _WIN32_WINNT 0x0600 -# endif -#define WIN32_LEAN_AND_MEAN /* stops windows.h including winsock.h */ -#include -#ifndef NO_UNIX_SOCKETS -#include -#endif -#include -#define GIT_WINDOWS_NATIVE -#endif - #if defined(NO_UNIX_SOCKETS) || !defined(GIT_WINDOWS_NATIVE) static inline int _have_unix_sockets(void) { @@ -253,45 +171,6 @@ static inline int _have_unix_sockets(void) #define have_unix_sockets _have_unix_sockets #endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#ifdef HAVE_STRINGS_H -#include /* for strcasecmp() */ -#endif -#include -#include -#include -#ifdef NEEDS_SYS_PARAM_H -#include -#endif -#include -#include -#include -#include -#include -#include -#include -#include -#include -#if !defined(NO_POLL_H) -#include -#elif !defined(NO_SYS_POLL_H) -#include -#else -/* Pull the compat stuff */ -#include -#endif -#ifdef HAVE_BSD_SYSCTL -#include -#endif - /* Used by compat/win32/path-utils.h, and more */ static inline int is_xplatform_dir_sep(int c) { @@ -308,48 +187,6 @@ static inline int is_xplatform_dir_sep(int c) #elif defined(_MSC_VER) #include "compat/win32/path-utils.h" #include "compat/msvc/compat-util.h" -#else -#include -#include -#include -#include -#include -#include -#include -#ifndef NO_SYS_SELECT_H -#include -#endif -#include -#include -#include -#include -#include -#include -#ifndef NO_INTTYPES_H -#include -#else -#include -#endif -#ifdef HAVE_ARC4RANDOM_LIBBSD -#include -#endif -#ifdef HAVE_GETRANDOM -#include -#endif -#ifdef NO_INTPTR_T -/* - * On I16LP32, ILP32 and LP64 "long" is the safe bet, however - * on LLP86, IL33LLP64 and P64 it needs to be "long long", - * while on IP16 and IP16L32 it is "int" (resp. "short") - * Size needs to match (or exceed) 'sizeof(void *)'. - * We can't take "long long" here as not everybody has it. - */ -typedef long intptr_t; -typedef unsigned long uintptr_t; -#endif -#undef _ALL_SOURCE /* AIX 5.3L defines a struct list with _ALL_SOURCE. */ -#include -#define _ALL_SOURCE 1 #endif /* used on Mac OS X */ @@ -370,60 +207,6 @@ static inline const char *precompose_string_if_needed(const char *in) #define probe_utf8_pathname_composition() #endif -#ifdef MKDIR_WO_TRAILING_SLASH -#define mkdir(a,b) compat_mkdir_wo_trailing_slash((a),(b)) -int compat_mkdir_wo_trailing_slash(const char*, mode_t); -#endif - -#ifdef time -#undef time -#endif -static inline time_t git_time(time_t *tloc) -{ - struct timeval tv; - - /* - * Avoid time(NULL), which can disagree with gettimeofday(2) - * and filesystem timestamps. - */ - gettimeofday(&tv, NULL); - - if (tloc) - *tloc = tv.tv_sec; - return tv.tv_sec; -} -#define time git_time - -#ifdef NO_STRUCT_ITIMERVAL -struct itimerval { - struct timeval it_interval; - struct timeval it_value; -}; -#endif - -#ifdef NO_SETITIMER -static inline int git_setitimer(int which UNUSED, - const struct itimerval *value UNUSED, - struct itimerval *newvalue UNUSED) { - return 0; /* pretend success */ -} -#undef setitimer -#define setitimer(which,value,ovalue) git_setitimer(which,value,ovalue) -#endif - -#ifndef NO_LIBGEN_H -#include -#else -#define basename gitbasename -char *gitbasename(char *); -#define dirname gitdirname -char *gitdirname(char *); -#endif - -#ifndef NO_ICONV -#include -#endif - #ifndef NO_OPENSSL #ifdef __APPLE__ #undef __AVAILABILITY_MACROS_USES_AVAILABILITY @@ -441,34 +224,6 @@ char *gitdirname(char *); # include #endif -/* On most systems would have given us this, but - * not on some systems (e.g. z/OS). - */ -#ifndef NI_MAXHOST -#define NI_MAXHOST 1025 -#endif - -#ifndef NI_MAXSERV -#define NI_MAXSERV 32 -#endif - -/* On most systems would have given us this, but - * not on some systems (e.g. GNU/Hurd). - */ -#ifndef PATH_MAX -#define PATH_MAX 4096 -#endif - -#ifndef NAME_MAX -#define NAME_MAX 255 -#endif - -typedef uintmax_t timestamp_t; -#define PRItime PRIuMAX -#define parse_timestamp strtoumax -#define TIME_MAX UINTMAX_MAX -#define TIME_MIN 0 - #ifndef PATH_SEP #define PATH_SEP ':' #endif @@ -492,11 +247,6 @@ static inline int noop_core_config(const char *var UNUSED, #define platform_core_config noop_core_config #endif -int lstat_cache_aware_rmdir(const char *path); -#if !defined(__MINGW32__) && !defined(_MSC_VER) -#define rmdir lstat_cache_aware_rmdir -#endif - #ifndef has_dos_drive_prefix static inline int git_has_dos_drive_prefix(const char *path UNUSED) { @@ -822,25 +572,6 @@ static inline bool strip_suffix(const char *str, const char *suffix, memcpy(_swap_b_ptr, _swap_buffer, sizeof(a)); \ } while (0) -#if defined(NO_MMAP) || defined(USE_WIN32_MMAP) - -#ifndef PROT_READ -#define PROT_READ 1 -#define PROT_WRITE 2 -#define MAP_PRIVATE 1 -#endif - -#define mmap git_mmap -#define munmap git_munmap -void *git_mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset); -int git_munmap(void *start, size_t length); - -#else /* NO_MMAP || USE_WIN32_MMAP */ - -#include - -#endif /* NO_MMAP || USE_WIN32_MMAP */ - #ifdef NO_MMAP /* This value must be multiple of (pagesize * 2) */ @@ -856,177 +587,15 @@ int git_munmap(void *start, size_t length); #endif /* NO_MMAP */ -#ifndef MAP_FAILED -#define MAP_FAILED ((void *)-1) -#endif - #ifdef NO_ST_BLOCKS_IN_STRUCT_STAT #define on_disk_bytes(st) ((st).st_size) #else #define on_disk_bytes(st) ((st).st_blocks * 512) #endif -#ifdef NEEDS_MODE_TRANSLATION -#undef S_IFMT -#undef S_IFREG -#undef S_IFDIR -#undef S_IFLNK -#undef S_IFBLK -#undef S_IFCHR -#undef S_IFIFO -#undef S_IFSOCK -#define S_IFMT 0170000 -#define S_IFREG 0100000 -#define S_IFDIR 0040000 -#define S_IFLNK 0120000 -#define S_IFBLK 0060000 -#define S_IFCHR 0020000 -#define S_IFIFO 0010000 -#define S_IFSOCK 0140000 -#ifdef stat -#undef stat -#endif -#define stat(path, buf) git_stat(path, buf) -int git_stat(const char *, struct stat *); -#ifdef fstat -#undef fstat -#endif -#define fstat(fd, buf) git_fstat(fd, buf) -int git_fstat(int, struct stat *); -#ifdef lstat -#undef lstat -#endif -#define lstat(path, buf) git_lstat(path, buf) -int git_lstat(const char *, struct stat *); -#endif - #define DEFAULT_PACKED_GIT_LIMIT \ ((1024L * 1024L) * (size_t)(sizeof(void*) >= 8 ? (32 * 1024L * 1024L) : 256)) -#ifdef NO_PREAD -#define pread git_pread -ssize_t git_pread(int fd, void *buf, size_t count, off_t offset); -#endif - -#ifdef NO_SETENV -#define setenv gitsetenv -int gitsetenv(const char *, const char *, int); -#endif - -#ifdef NO_MKDTEMP -#define mkdtemp gitmkdtemp -char *gitmkdtemp(char *); -#endif - -#ifdef NO_UNSETENV -#define unsetenv gitunsetenv -int gitunsetenv(const char *); -#endif - -#ifdef NO_STRCASESTR -#define strcasestr gitstrcasestr -char *gitstrcasestr(const char *haystack, const char *needle); -#endif - -#ifdef NO_STRLCPY -#define strlcpy gitstrlcpy -size_t gitstrlcpy(char *, const char *, size_t); -#endif - -#ifdef NO_STRTOUMAX -#define strtoumax gitstrtoumax -uintmax_t gitstrtoumax(const char *, char **, int); -#define strtoimax gitstrtoimax -intmax_t gitstrtoimax(const char *, char **, int); -#endif - -#ifdef NO_HSTRERROR -#define hstrerror githstrerror -const char *githstrerror(int herror); -#endif - -#ifdef NO_MEMMEM -#define memmem gitmemmem -void *gitmemmem(const void *haystack, size_t haystacklen, - const void *needle, size_t needlelen); -#endif - -#ifdef OVERRIDE_STRDUP -#ifdef strdup -#undef strdup -#endif -#define strdup gitstrdup -char *gitstrdup(const char *s); -#endif - -#ifdef NO_GETPAGESIZE -#define getpagesize() sysconf(_SC_PAGESIZE) -#endif - -#ifndef O_CLOEXEC -#define O_CLOEXEC 0 -#endif - -#ifdef FREAD_READS_DIRECTORIES -# if !defined(SUPPRESS_FOPEN_REDEFINITION) -# ifdef fopen -# undef fopen -# endif -# define fopen(a,b) git_fopen(a,b) -# endif -FILE *git_fopen(const char*, const char*); -#endif - -#ifdef SNPRINTF_RETURNS_BOGUS -#ifdef snprintf -#undef snprintf -#endif -#define snprintf git_snprintf -int git_snprintf(char *str, size_t maxsize, - const char *format, ...); -#ifdef vsnprintf -#undef vsnprintf -#endif -#define vsnprintf git_vsnprintf -int git_vsnprintf(char *str, size_t maxsize, - const char *format, va_list ap); -#endif - -#ifdef OPEN_RETURNS_EINTR -#undef open -#define open git_open_with_retry -int git_open_with_retry(const char *path, int flag, ...); -#endif - -#ifdef __GLIBC_PREREQ -#if __GLIBC_PREREQ(2, 1) -#define HAVE_STRCHRNUL -#endif -#endif - -#ifndef HAVE_STRCHRNUL -#define strchrnul gitstrchrnul -static inline char *gitstrchrnul(const char *s, int c) -{ - while (*s && *s != c) - s++; - return (char *)s; -} -#endif - -#ifdef NO_INET_PTON -int inet_pton(int af, const char *src, void *dst); -#endif - -#ifdef NO_INET_NTOP -const char *inet_ntop(int af, const void *src, char *dst, size_t size); -#endif - -#ifdef NO_PTHREADS -#define atexit git_atexit -int git_atexit(void (*handler)(void)); -#endif - static inline size_t st_add(size_t a, size_t b) { if (unsigned_add_overflows(a, b)) @@ -1293,12 +862,6 @@ static inline size_t xsize_t(off_t len) return (size_t) len; } -#ifndef HOST_NAME_MAX -#define HOST_NAME_MAX 256 -#endif - -#include "sane-ctype.h" - /* * Like skip_prefix, but compare case-insensitively. Note that the comparison * is done via tolower(), so it is strictly ASCII (no multi-byte characters or @@ -1364,34 +927,6 @@ static inline int strtol_i(char const *s, int base, int *result) return 0; } -void git_stable_qsort(void *base, size_t nmemb, size_t size, - int(*compar)(const void *, const void *)); -#ifdef INTERNAL_QSORT -#define qsort git_stable_qsort -#endif - -#define QSORT(base, n, compar) sane_qsort((base), (n), sizeof(*(base)), compar) -static inline void sane_qsort(void *base, size_t nmemb, size_t size, - int(*compar)(const void *, const void *)) -{ - if (nmemb > 1) - qsort(base, nmemb, size, compar); -} - -#define STABLE_QSORT(base, n, compar) \ - git_stable_qsort((base), (n), sizeof(*(base)), compar) - -#ifndef HAVE_ISO_QSORT_S -int git_qsort_s(void *base, size_t nmemb, size_t size, - int (*compar)(const void *, const void *, void *), void *ctx); -#define qsort_s git_qsort_s -#endif - -#define QSORT_S(base, n, compar, ctx) do { \ - if (qsort_s((base), (n), sizeof(*(base)), compar, ctx)) \ - BUG("qsort_s() failed"); \ -} while (0) - #ifndef REG_STARTEND #error "Git requires REG_STARTEND support. Compile with NO_REGEX=NeedsStartEnd" #endif @@ -1416,39 +951,12 @@ int git_regcomp(regex_t *preg, const char *pattern, int cflags); # define FORCE_DIR_SET_GID 0 #endif -#ifdef NO_NSEC -#undef USE_NSEC -#define ST_CTIME_NSEC(st) 0 -#define ST_MTIME_NSEC(st) 0 -#else -#ifdef USE_ST_TIMESPEC -#define ST_CTIME_NSEC(st) ((unsigned int)((st).st_ctimespec.tv_nsec)) -#define ST_MTIME_NSEC(st) ((unsigned int)((st).st_mtimespec.tv_nsec)) -#else -#define ST_CTIME_NSEC(st) ((unsigned int)((st).st_ctim.tv_nsec)) -#define ST_MTIME_NSEC(st) ((unsigned int)((st).st_mtim.tv_nsec)) -#endif -#endif - #ifdef UNRELIABLE_FSTAT #define fstat_is_reliable() 0 #else #define fstat_is_reliable() 1 #endif -#ifndef va_copy -/* - * Since an obvious implementation of va_list would be to make it a - * pointer into the stack frame, a simple assignment will work on - * many systems. But let's try to be more portable. - */ -#ifdef __va_copy -#define va_copy(dst, src) __va_copy(dst, src) -#else -#define va_copy(dst, src) ((dst) = (src)) -#endif -#endif - /* usage.c: only to be used for testing BUG() implementation (see test-tool) */ extern int BUG_exit_code; @@ -1478,41 +986,6 @@ void bug_fl(const char *file, int line, const char *fmt, ...); # define SHELL_PATH "/bin/sh" #endif -#ifndef _POSIX_THREAD_SAFE_FUNCTIONS -static inline void git_flockfile(FILE *fh UNUSED) -{ - ; /* nothing */ -} -static inline void git_funlockfile(FILE *fh UNUSED) -{ - ; /* nothing */ -} -#undef flockfile -#undef funlockfile -#undef getc_unlocked -#define flockfile(fh) git_flockfile(fh) -#define funlockfile(fh) git_funlockfile(fh) -#define getc_unlocked(fh) getc(fh) -#endif - -#ifdef FILENO_IS_A_MACRO -int git_fileno(FILE *stream); -# ifndef COMPAT_CODE_FILENO -# undef fileno -# define fileno(p) git_fileno(p) -# endif -#endif - -#ifdef NEED_ACCESS_ROOT_HANDLER -int git_access(const char *path, int mode); -# ifndef COMPAT_CODE_ACCESS -# ifdef access -# undef access -# endif -# define access(path, mode) git_access(path, mode) -# endif -#endif - /* * Our code often opens a path to an optional file, to work on its * contents when we can successfully open it. We can ignore a failure From patchwork Mon Jan 27 13:04:26 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Steinhardt X-Patchwork-Id: 13951366 Received: from fout-a5-smtp.messagingengine.com (fout-a5-smtp.messagingengine.com [103.168.172.148]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 397FB200BA1 for ; Mon, 27 Jan 2025 13:04:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.148 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983074; cv=none; b=MQWn0Anodva/t4DS8huYPn7PcG1fJM4l0tTsVNd3w4V5XCyPzJdLEH2Dy3lOrgtlJjzJDSPIym8GR2gtYBk4RQUfhF07BCvyx7FcwwtKK4zV0EEIzT8PjOx1020viIFw3Frdc0zReJIrVjBz1RNK5dUP9I7KXlPzMPPJxq4Ob/c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983074; c=relaxed/simple; bh=1cfGhv2CtVDI+uEnfhoidh6GGJu7m6+3q1YI4IY2DdI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=lcm0PQAhkGkmMzhxyz/lDmiDD79JL/BA3qc0OWZBzewEPgdM3JZaphB1LpbK4XCmuZrUP06906T3Ye9RRPZkwoZHcmRHgyHrytwg9e/B1CfEnQK2fMvy2I40+kP/uEBc751U9uQhs9Db4H1GDjVRAwzSTWLF6tsk3C9Q31Ktj7k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im; spf=pass smtp.mailfrom=pks.im; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b=qm+0U46f; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=FPQN4PMq; arc=none smtp.client-ip=103.168.172.148 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pks.im Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b="qm+0U46f"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="FPQN4PMq" Received: from phl-compute-01.internal (phl-compute-01.phl.internal [10.202.2.41]) by mailfout.phl.internal (Postfix) with ESMTP id 3DDFA1380B1B; Mon, 27 Jan 2025 08:04:32 -0500 (EST) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-01.internal (MEProxy); Mon, 27 Jan 2025 08:04:32 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pks.im; h=cc:cc :content-transfer-encoding:content-type:content-type:date:date :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm3; t=1737983072; x=1738069472; bh=2YvloPgJ0adqNdO3FdP2VF6v6pumLPMKOE7ELd1HVTE=; b= qm+0U46fyjz1BgZ62P/w4ZpJ7X3cUjzzm4BJkkhiZrOhxex9RSP54FAVEhzlXzYT wOGRXPAPAnOfyQ4hWmUEk5IKs3skGOx+n2nCSJaSEg/wpwRgTetwrNXAKueIATan T0sJtaSdj2jKq2uUdeJfXS088B3cK4J/hMDSZECIzMfAgbeaAT/l7FUoVzRJVvLe xei9ePL2K8bLWZatuu9CTh9mG1tdLDH+4dx8AOKyAM1bsmc9+WpXWF5QDh+dOu+R Ovkhzu1R+Nb+h075kdiFFO+sWeBT4NgYRwJuF0SFMBccogvd6L0yL3jVMFAMHgM4 AQCD7a1TDWqLGoM3pH+Wxw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1737983072; x= 1738069472; bh=2YvloPgJ0adqNdO3FdP2VF6v6pumLPMKOE7ELd1HVTE=; b=F PQN4PMqrIqJ87vy3DJpwfEFE7mJiVwaB+CwKC+oijAIMMBBVwdo4c6z8K2RkTV9g VT9trAQHi3/d2mN6F4uC4WPl2llpZ+tZnjliFY4wIZFC/QVtavPFlSL0AHc0ov42 npAdBFWqhRt3NR+7ArDNOrtMm32BYBlkxMXj2QBwpPB4PnE7u7/dfV8VTlUbC6tV 6SdXbcLTfqeO5sna+rxPbNX5Tupv9Ccs3Q+YnAEqNuFKwrx0aRFdpZSg8bNiyQyO nvAHH3u7psfOS8HJllPMOBV98MWe1Fejm37Xsu2cn8a0ZH+nV2/wdehKZ7UWwkfB wf77BL8bQ9y0o4Eu1nj/A== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefuddrudejgedgudefvdehucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdggtfgfnhhsuhgsshgtrhhisggv pdfurfetoffkrfgpnffqhgenuceurghilhhouhhtmecufedttdenucesvcftvggtihhpih gvnhhtshculddquddttddmnecujfgurhephfffufggtgfgkfhfjgfvvefosehtjeertder tdejnecuhfhrohhmpefrrghtrhhitghkucfuthgvihhnhhgrrhguthcuoehpshesphhksh drihhmqeenucggtffrrghtthgvrhhnpeffueeiudejvdekheeuvdekfeffiedvueelteek udehjeetkeegvddugfdtgfeileenucevlhhushhtvghrufhiiigvpedvnecurfgrrhgrmh epmhgrihhlfhhrohhmpehpshesphhkshdrihhmpdhnsggprhgtphhtthhopedvpdhmohgu vgepshhmthhpohhuthdprhgtphhtthhopehgihhtsehvghgvrhdrkhgvrhhnvghlrdhorh hgpdhrtghpthhtohepvghthhhomhhsohhnsegvugifrghrughthhhomhhsohhnrdgtohhm X-ME-Proxy: Feedback-ID: i197146af:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 27 Jan 2025 08:04:31 -0500 (EST) Received: by vm-mail (OpenSMTPD) with ESMTPSA id 03817797 (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Mon, 27 Jan 2025 13:04:29 +0000 (UTC) From: Patrick Steinhardt Date: Mon, 27 Jan 2025 14:04:26 +0100 Subject: [PATCH 18/19] reftable: decouple from Git codebase by pulling in "compat/posix.h" Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250127-pks-reftable-drop-git-compat-util-v1-18-6e280a564877@pks.im> References: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> In-Reply-To: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> To: git@vger.kernel.org Cc: Edward Thomson X-Mailer: b4 0.14.2 The reftable library includes "git-compat-util.h" in order to get a POSIX-like programming environment that papers over various differences between platforms. The header also brings with it a couple of helpers specific to the Git codebase though, and over time we have started to use these helpers in the reftable library, as well. This makes it very hard to use the reftable library as a standalone library without the rest of the Git codebase, so other libraries like e.g. libgit2 cannot easily use it. But now that we have removed all calls to Git-specific functionality and have split out "compat/posix.h" as a separate header we can address this. Stop including "git-compat-util.h" and instead include "compat/posix.h" to finalize the decoupling of the reftable library from the rest of the Git codebase. The only bits which remain specific to Git are "system.h" and "system.c", which projects will have to provide. Signed-off-by: Patrick Steinhardt --- reftable/system.c | 2 ++ reftable/system.h | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/reftable/system.c b/reftable/system.c index e25ccc0da3..1ee268b125 100644 --- a/reftable/system.c +++ b/reftable/system.c @@ -1,3 +1,5 @@ +#include "../git-compat-util.h" + #include "system.h" #include "basics.h" #include "reftable-error.h" diff --git a/reftable/system.h b/reftable/system.h index 3bd4a4e322..e4a8944a70 100644 --- a/reftable/system.h +++ b/reftable/system.h @@ -11,7 +11,8 @@ license that can be found in the LICENSE file or at /* This header glues the reftable library to the rest of Git */ -#include "git-compat-util.h" +#include "compat/posix.h" +#include /* * Return a random 32 bit integer. This function is expected to return From patchwork Mon Jan 27 13:04:27 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Steinhardt X-Patchwork-Id: 13951367 Received: from fhigh-a1-smtp.messagingengine.com (fhigh-a1-smtp.messagingengine.com [103.168.172.152]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3A895200BB8 for ; Mon, 27 Jan 2025 13:04:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=103.168.172.152 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983075; cv=none; b=CYN1Ua7H1bQeRfdoBrAe0np+Mye6wT3+Fo3KVGqVJkxDCebxG1w2P9QHh2vcY4DYKCfW32xkPPMkJm449zAP+wM+mYyaji/WSt2SuifcbFk37s7Tx5td81//lI/RSJ+cbfmh2qoPlOWwKn2S9LgrrG0AMXoV423wVKN1B4GRQsc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737983075; c=relaxed/simple; bh=+8IM53TbqpUgRfB/inFpjOz9489TvwK+2iXKydpy3II=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OGaOmLqlV47+Zsludg5qHN5I9SVX47YftErI2wIzmXKJoFreyjEE3HnMmLGHW1V3T/IG48SGEKqGRd4SQrz4BLcIZ6AO/7uW045gRbOn5imlODyCXE6yb9YC+2o81I7UVr5F/DRr2xqNm7tbBsTiIfyIHMpr/dbcPL9xAXhp5R0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im; spf=pass smtp.mailfrom=pks.im; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b=bM/BUr0l; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b=IMlzQAMr; arc=none smtp.client-ip=103.168.172.152 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=pks.im Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pks.im Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=pks.im header.i=@pks.im header.b="bM/BUr0l"; dkim=pass (2048-bit key) header.d=messagingengine.com header.i=@messagingengine.com header.b="IMlzQAMr" Received: from phl-compute-11.internal (phl-compute-11.phl.internal [10.202.2.51]) by mailfhigh.phl.internal (Postfix) with ESMTP id 3AF6E11401B7; Mon, 27 Jan 2025 08:04:33 -0500 (EST) Received: from phl-mailfrontend-02 ([10.202.2.163]) by phl-compute-11.internal (MEProxy); Mon, 27 Jan 2025 08:04:33 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=pks.im; h=cc:cc :content-transfer-encoding:content-type:content-type:date:date :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to; s=fm3; t=1737983073; x=1738069473; bh=fZf1W4LUEYyZlqON29LdWuZDASC2Q90kB/sAd3jZi9U=; b= bM/BUr0lnEBSUWwaOb1VXgno3E2zaTIT9YyzLI6nlsAVa0eYh11533RuXj3KLM8r CtUwjsAKPu60x5Sg634lLbaR3VY88woNGRJFWvKIKX1x4hqxUa1dj6S9gMtgzbrL MCekThMdE3HbzX9JyMYkWqkKmModGykR31I3289QD96U2rvcpm+fD/PWkjUpHH1K sNW/4o1ADYMWaM4RagNHHr5fX9T2HjSekw4To+7y2s++FJ9bKg2OMptS62zUlfDn pTpMo2/xvhpD8cihg530/x0Y1KS1rNAfZxmBB26yjjgzFfiB7bZW1XlfIZ86mdon O9Zc+cxJyExKKXhDhRRRYA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding :content-type:content-type:date:date:feedback-id:feedback-id :from:from:in-reply-to:in-reply-to:message-id:mime-version :references:reply-to:subject:subject:to:to:x-me-proxy :x-me-sender:x-me-sender:x-sasl-enc; s=fm3; t=1737983073; x= 1738069473; bh=fZf1W4LUEYyZlqON29LdWuZDASC2Q90kB/sAd3jZi9U=; b=I MlzQAMrvdOwvlasobg4xbq/3zKe7JAk17XhmAbOsFR5penh2Nr3ei7q3zDvyFajV hRqDL4xUFPCkqa7MihiN1Njan5kvEC+jVWTdwHlQe5v3ePo2jEY47XQZDXFtADVs p9xYu3B5OeGK64UoXAlJeJ/2s8FHS+iNZTY64cBZDK7IZqGc5rGyppB7aYK1Dvxa TF9S1WgBSFSW7PJz3nlnRwV4yUodb5xwStTwjp7qNEVUjzfXD5wrW/HdjtGnVR49 JINjmMZ4/IkjaNoGpEWEmZO25urVBYcg6lxl2dfBVXWItrveP5+5LMnk+j8nTvQS DRE8Sqw5cTZewJjOQDVvQ== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgeefuddrudejgedgudefvdegucetufdoteggodetrf dotffvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdggtfgfnhhsuhgsshgtrhhisggv pdfurfetoffkrfgpnffqhgenuceurghilhhouhhtmecufedttdenucesvcftvggtihhpih gvnhhtshculddquddttddmnecujfgurhephfffufggtgfgkfhfjgfvvefosehtjeertder tdejnecuhfhrohhmpefrrghtrhhitghkucfuthgvihhnhhgrrhguthcuoehpshesphhksh drihhmqeenucggtffrrghtthgvrhhnpeffueeiudejvdekheeuvdekfeffiedvueelteek udehjeetkeegvddugfdtgfeileenucevlhhushhtvghrufhiiigvpeefnecurfgrrhgrmh epmhgrihhlfhhrohhmpehpshesphhkshdrihhmpdhnsggprhgtphhtthhopedvpdhmohgu vgepshhmthhpohhuthdprhgtphhtthhopehgihhtsehvghgvrhdrkhgvrhhnvghlrdhorh hgpdhrtghpthhtohepvghthhhomhhsohhnsegvugifrghrughthhhomhhsohhnrdgtohhm X-ME-Proxy: Feedback-ID: i197146af:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Mon, 27 Jan 2025 08:04:32 -0500 (EST) Received: by vm-mail (OpenSMTPD) with ESMTPSA id 6ead0ad8 (TLSv1.3:TLS_AES_256_GCM_SHA384:256:NO); Mon, 27 Jan 2025 13:04:30 +0000 (UTC) From: Patrick Steinhardt Date: Mon, 27 Jan 2025 14:04:27 +0100 Subject: [PATCH 19/19] Makefile: skip reftable library for Coccinelle Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-Id: <20250127-pks-reftable-drop-git-compat-util-v1-19-6e280a564877@pks.im> References: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> In-Reply-To: <20250127-pks-reftable-drop-git-compat-util-v1-0-6e280a564877@pks.im> To: git@vger.kernel.org Cc: Edward Thomson X-Mailer: b4 0.14.2 The reftable library does not use any of the common helpers that the Git project has. Consequently, most of the rules that we have in Coccinelle do not apply to the library at all and may even generate false positives when a pattern can be converted to use a Git helper function. Exclude reftable library sources from being checked by Coccinelle to avoid such false positives. Signed-off-by: Patrick Steinhardt --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index d3011e30f7..dc2ac32e4a 100644 --- a/Makefile +++ b/Makefile @@ -946,7 +946,7 @@ FOUND_SOURCE_FILES := $(filter-out $(GENERATED_H),$(shell $(SOURCES_CMD))) FOUND_C_SOURCES = $(filter %.c,$(FOUND_SOURCE_FILES)) FOUND_H_SOURCES = $(filter %.h,$(FOUND_SOURCE_FILES)) -COCCI_SOURCES = $(filter-out $(THIRD_PARTY_SOURCES),$(FOUND_C_SOURCES)) +COCCI_SOURCES = $(filter-out $(THIRD_PARTY_SOURCES) reftable/%,$(FOUND_C_SOURCES)) LIB_H = $(FOUND_H_SOURCES)