On 2026/03/19 18:49, Bjorn Ketelaars wrote:
> borgbackup-1.4.4 has been released, which fixes a memory leak. Overview
> on changes can be found at [0].
>
> I cherry-picked [1] to ensure that this update does not crash on big
> endian arches. The latter is caused by missing _le32toh() calls.
>
> Run tested on amd64. It would be helpful if someone can test this update
> on a big endian arch.
>
> Comments/OK?
OK with me, though I have no big-endian to test on.
> Any interest in having this is -stable?
Yes please. (big-endian is not much of an issue for -stable anyway..)
> +++ patches/patch-src_borg__hashindex_c
> @@ -0,0 +1,48 @@
> +Fix checks for big endian archs. Taken from
> +https://github.com/borgbackup/borg/pull/9522
It's been merged, so you could reference the commit instead if you like:
From 7fd6df2514c084fdf28dea557e49018610ffb10a Mon Sep 17 00:00:00 2001
From: Thomas Waldmann <tw@waldmann-edv.de>
Date: Thu, 19 Mar 2026 15:14:57 +0100
Subject: [PATCH] hashindex: fix new checks for big endian archs, fixes #9521
OpenBSD Mail Box
BTC:1BsNfN6m7xtT4PqDb9jJHnDDFBb38zS9Yi
Thursday, March 19, 2026
UPDATE sysutils/borgbackup/1.4 1.4.4
borgbackup-1.4.4 has been released, which fixes a memory leak. Overview
on changes can be found at [0].
I cherry-picked [1] to ensure that this update does not crash on big
endian arches. The latter is caused by missing _le32toh() calls.
Run tested on amd64. It would be helpful if someone can test this update
on a big endian arch.
Comments/OK?
Any interest in having this is -stable?
[0] https://borgbackup.readthedocs.io/en/1.4.4/changes.html#version-1-4-4-2026-03-19
[1] https://github.com/borgbackup/borg/pull/9522
diff --git Makefile Makefile
index 5c1318b6bdf..6dab0991e14 100644
--- Makefile
+++ Makefile
@@ -1,5 +1,5 @@
MODULES = lang/python
-MODPY_DISTV = 1.4.3
+MODPY_DISTV = 1.4.4
WANTLIB = crypto
diff --git distinfo distinfo
index e7ead607839..7ee2cd13eb9 100644
--- distinfo
+++ distinfo
@@ -1,2 +1,2 @@
-SHA256 (borgbackup-1.4.3.tar.gz) = ebv6dF0ZAdaFlzWEvS0Wo1Bobd0Xb2oiREkPsBmWRB8=
-SIZE (borgbackup-1.4.3.tar.gz) = 4014143
+SHA256 (borgbackup-1.4.4.tar.gz) = Jxa8EkokkI78rJQ23zG3FtHwu9gorTmxj3O/3XcqZRo=
+SIZE (borgbackup-1.4.4.tar.gz) = 3995698
diff --git patches/patch-src_borg__hashindex_c patches/patch-src_borg__hashindex_c
new file mode 100644
index 00000000000..a3a6de58e67
--- /dev/null
+++ patches/patch-src_borg__hashindex_c
@@ -0,0 +1,48 @@
+Fix checks for big endian archs. Taken from
+https://github.com/borgbackup/borg/pull/9522
+
+Index: src/borg/_hashindex.c
+--- src/borg/_hashindex.c.orig
++++ src/borg/_hashindex.c
+@@ -371,6 +371,9 @@ hashindex_read(PyObject *file_py, int permit_compact,
+ }
+
+ // check if key / value sizes match the expected sizes.
++ int header_num_buckets = _le32toh(header->num_buckets);
++ int header_num_entries = _le32toh(header->num_entries);
++
+ if (expected_key_size != -1 && header->key_size != expected_key_size) {
+ PyErr_Format(PyExc_ValueError, "Expected key size %d, got %d.",
+ expected_key_size, header->key_size);
+@@ -391,24 +394,24 @@ hashindex_read(PyObject *file_py, int permit_compact,
+ goto fail_decref_header;
+ }
+ // sanity check for num_buckets and num_entries.
+- if (header->num_buckets < 1) {
+- PyErr_Format(PyExc_ValueError, "Expected num_buckets >= 1, got %d.", header->num_buckets);
++ if (header_num_buckets < 1) {
++ PyErr_Format(PyExc_ValueError, "Expected num_buckets >= 1, got %d.", header_num_buckets);
+ goto fail_decref_header;
+ }
+- if ((header->num_entries < 0) || (header->num_entries > header->num_buckets)) {
+- PyErr_Format(PyExc_ValueError, "Expected 0 <= num_entries <= num_buckets, got %d.", header->num_entries);
++ if ((header_num_entries < 0) || (header_num_entries > header_num_buckets)) {
++ PyErr_Format(PyExc_ValueError, "Expected 0 <= num_entries <= num_buckets, got %d.", header_num_entries);
+ goto fail_decref_header;
+ }
+
+- buckets_length = (Py_ssize_t)_le32toh(header->num_buckets) * (header->key_size + header->value_size);
++ buckets_length = (Py_ssize_t)header_num_buckets * (header->key_size + header->value_size);
+ if((Py_ssize_t)length != (Py_ssize_t)sizeof(HashHeader) + buckets_length) {
+ PyErr_Format(PyExc_ValueError, "Incorrect file length (expected %zd, got %zd)",
+ sizeof(HashHeader) + buckets_length, length);
+ goto fail_release_header_buffer;
+ }
+
+- index->num_entries = _le32toh(header->num_entries);
+- index->num_buckets = _le32toh(header->num_buckets);
++ index->num_entries = header_num_entries;
++ index->num_buckets = header_num_buckets;
+ index->key_size = header->key_size;
+ index->value_size = header->value_size;
+ index->bucket_size = index->key_size + index->value_size;
diff --git pkg/PLIST pkg/PLIST
index ff6dfd67ad2..fc4e668af97 100644
--- pkg/PLIST
+++ pkg/PLIST
@@ -184,8 +184,8 @@ lib/python${MODPY_VERSION}/site-packages/borg/testsuite/${MODPY_PYCACHE}file_int
lib/python${MODPY_VERSION}/site-packages/borg/testsuite/${MODPY_PYCACHE}file_integrity.${MODPY_PYC_MAGIC_TAG}pyc
lib/python${MODPY_VERSION}/site-packages/borg/testsuite/${MODPY_PYCACHE}hashindex.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
lib/python${MODPY_VERSION}/site-packages/borg/testsuite/${MODPY_PYCACHE}hashindex.${MODPY_PYC_MAGIC_TAG}pyc
-lib/python${MODPY_VERSION}/site-packages/borg/testsuite/${MODPY_PYCACHE}hashindex_stress.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
-lib/python${MODPY_VERSION}/site-packages/borg/testsuite/${MODPY_PYCACHE}hashindex_stress.${MODPY_PYC_MAGIC_TAG}pyc
+lib/python${MODPY_VERSION}/site-packages/borg/testsuite/${MODPY_PYCACHE}hashindex_pytest.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
+lib/python${MODPY_VERSION}/site-packages/borg/testsuite/${MODPY_PYCACHE}hashindex_pytest.${MODPY_PYC_MAGIC_TAG}pyc
lib/python${MODPY_VERSION}/site-packages/borg/testsuite/${MODPY_PYCACHE}helpers.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
lib/python${MODPY_VERSION}/site-packages/borg/testsuite/${MODPY_PYCACHE}helpers.${MODPY_PYC_MAGIC_TAG}pyc
lib/python${MODPY_VERSION}/site-packages/borg/testsuite/${MODPY_PYCACHE}issue_8535.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
@@ -235,7 +235,7 @@ lib/python${MODPY_VERSION}/site-packages/borg/testsuite/crypto.py
lib/python${MODPY_VERSION}/site-packages/borg/testsuite/efficient_collection_queue.py
lib/python${MODPY_VERSION}/site-packages/borg/testsuite/file_integrity.py
lib/python${MODPY_VERSION}/site-packages/borg/testsuite/hashindex.py
-lib/python${MODPY_VERSION}/site-packages/borg/testsuite/hashindex_stress.py
+lib/python${MODPY_VERSION}/site-packages/borg/testsuite/hashindex_pytest.py
lib/python${MODPY_VERSION}/site-packages/borg/testsuite/helpers.py
lib/python${MODPY_VERSION}/site-packages/borg/testsuite/issue_8535.py
lib/python${MODPY_VERSION}/site-packages/borg/testsuite/item.py
on changes can be found at [0].
I cherry-picked [1] to ensure that this update does not crash on big
endian arches. The latter is caused by missing _le32toh() calls.
Run tested on amd64. It would be helpful if someone can test this update
on a big endian arch.
Comments/OK?
Any interest in having this is -stable?
[0] https://borgbackup.readthedocs.io/en/1.4.4/changes.html#version-1-4-4-2026-03-19
[1] https://github.com/borgbackup/borg/pull/9522
diff --git Makefile Makefile
index 5c1318b6bdf..6dab0991e14 100644
--- Makefile
+++ Makefile
@@ -1,5 +1,5 @@
MODULES = lang/python
-MODPY_DISTV = 1.4.3
+MODPY_DISTV = 1.4.4
WANTLIB = crypto
diff --git distinfo distinfo
index e7ead607839..7ee2cd13eb9 100644
--- distinfo
+++ distinfo
@@ -1,2 +1,2 @@
-SHA256 (borgbackup-1.4.3.tar.gz) = ebv6dF0ZAdaFlzWEvS0Wo1Bobd0Xb2oiREkPsBmWRB8=
-SIZE (borgbackup-1.4.3.tar.gz) = 4014143
+SHA256 (borgbackup-1.4.4.tar.gz) = Jxa8EkokkI78rJQ23zG3FtHwu9gorTmxj3O/3XcqZRo=
+SIZE (borgbackup-1.4.4.tar.gz) = 3995698
diff --git patches/patch-src_borg__hashindex_c patches/patch-src_borg__hashindex_c
new file mode 100644
index 00000000000..a3a6de58e67
--- /dev/null
+++ patches/patch-src_borg__hashindex_c
@@ -0,0 +1,48 @@
+Fix checks for big endian archs. Taken from
+https://github.com/borgbackup/borg/pull/9522
+
+Index: src/borg/_hashindex.c
+--- src/borg/_hashindex.c.orig
++++ src/borg/_hashindex.c
+@@ -371,6 +371,9 @@ hashindex_read(PyObject *file_py, int permit_compact,
+ }
+
+ // check if key / value sizes match the expected sizes.
++ int header_num_buckets = _le32toh(header->num_buckets);
++ int header_num_entries = _le32toh(header->num_entries);
++
+ if (expected_key_size != -1 && header->key_size != expected_key_size) {
+ PyErr_Format(PyExc_ValueError, "Expected key size %d, got %d.",
+ expected_key_size, header->key_size);
+@@ -391,24 +394,24 @@ hashindex_read(PyObject *file_py, int permit_compact,
+ goto fail_decref_header;
+ }
+ // sanity check for num_buckets and num_entries.
+- if (header->num_buckets < 1) {
+- PyErr_Format(PyExc_ValueError, "Expected num_buckets >= 1, got %d.", header->num_buckets);
++ if (header_num_buckets < 1) {
++ PyErr_Format(PyExc_ValueError, "Expected num_buckets >= 1, got %d.", header_num_buckets);
+ goto fail_decref_header;
+ }
+- if ((header->num_entries < 0) || (header->num_entries > header->num_buckets)) {
+- PyErr_Format(PyExc_ValueError, "Expected 0 <= num_entries <= num_buckets, got %d.", header->num_entries);
++ if ((header_num_entries < 0) || (header_num_entries > header_num_buckets)) {
++ PyErr_Format(PyExc_ValueError, "Expected 0 <= num_entries <= num_buckets, got %d.", header_num_entries);
+ goto fail_decref_header;
+ }
+
+- buckets_length = (Py_ssize_t)_le32toh(header->num_buckets) * (header->key_size + header->value_size);
++ buckets_length = (Py_ssize_t)header_num_buckets * (header->key_size + header->value_size);
+ if((Py_ssize_t)length != (Py_ssize_t)sizeof(HashHeader) + buckets_length) {
+ PyErr_Format(PyExc_ValueError, "Incorrect file length (expected %zd, got %zd)",
+ sizeof(HashHeader) + buckets_length, length);
+ goto fail_release_header_buffer;
+ }
+
+- index->num_entries = _le32toh(header->num_entries);
+- index->num_buckets = _le32toh(header->num_buckets);
++ index->num_entries = header_num_entries;
++ index->num_buckets = header_num_buckets;
+ index->key_size = header->key_size;
+ index->value_size = header->value_size;
+ index->bucket_size = index->key_size + index->value_size;
diff --git pkg/PLIST pkg/PLIST
index ff6dfd67ad2..fc4e668af97 100644
--- pkg/PLIST
+++ pkg/PLIST
@@ -184,8 +184,8 @@ lib/python${MODPY_VERSION}/site-packages/borg/testsuite/${MODPY_PYCACHE}file_int
lib/python${MODPY_VERSION}/site-packages/borg/testsuite/${MODPY_PYCACHE}file_integrity.${MODPY_PYC_MAGIC_TAG}pyc
lib/python${MODPY_VERSION}/site-packages/borg/testsuite/${MODPY_PYCACHE}hashindex.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
lib/python${MODPY_VERSION}/site-packages/borg/testsuite/${MODPY_PYCACHE}hashindex.${MODPY_PYC_MAGIC_TAG}pyc
-lib/python${MODPY_VERSION}/site-packages/borg/testsuite/${MODPY_PYCACHE}hashindex_stress.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
-lib/python${MODPY_VERSION}/site-packages/borg/testsuite/${MODPY_PYCACHE}hashindex_stress.${MODPY_PYC_MAGIC_TAG}pyc
+lib/python${MODPY_VERSION}/site-packages/borg/testsuite/${MODPY_PYCACHE}hashindex_pytest.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
+lib/python${MODPY_VERSION}/site-packages/borg/testsuite/${MODPY_PYCACHE}hashindex_pytest.${MODPY_PYC_MAGIC_TAG}pyc
lib/python${MODPY_VERSION}/site-packages/borg/testsuite/${MODPY_PYCACHE}helpers.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
lib/python${MODPY_VERSION}/site-packages/borg/testsuite/${MODPY_PYCACHE}helpers.${MODPY_PYC_MAGIC_TAG}pyc
lib/python${MODPY_VERSION}/site-packages/borg/testsuite/${MODPY_PYCACHE}issue_8535.${MODPY_PYC_MAGIC_TAG}${MODPY_PYOEXTENSION}
@@ -235,7 +235,7 @@ lib/python${MODPY_VERSION}/site-packages/borg/testsuite/crypto.py
lib/python${MODPY_VERSION}/site-packages/borg/testsuite/efficient_collection_queue.py
lib/python${MODPY_VERSION}/site-packages/borg/testsuite/file_integrity.py
lib/python${MODPY_VERSION}/site-packages/borg/testsuite/hashindex.py
-lib/python${MODPY_VERSION}/site-packages/borg/testsuite/hashindex_stress.py
+lib/python${MODPY_VERSION}/site-packages/borg/testsuite/hashindex_pytest.py
lib/python${MODPY_VERSION}/site-packages/borg/testsuite/helpers.py
lib/python${MODPY_VERSION}/site-packages/borg/testsuite/issue_8535.py
lib/python${MODPY_VERSION}/site-packages/borg/testsuite/item.py
Subscribe to:
Comments (Atom)