gh-155830: properly initialize BLAKE-2 objects before GC tracking (#155831)
diff --git a/Misc/NEWS.d/next/Library/2026-08-15-11-49-30.gh-issue-155830.cY5xgK.rst b/Misc/NEWS.d/next/Library/2026-08-15-11-49-30.gh-issue-155830.cY5xgK.rst
new file mode 100644
index 0000000..9d6c2a8
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2026-08-15-11-49-30.gh-issue-155830.cY5xgK.rst
@@ -0,0 +1,2 @@
+:mod:`!_blake2`: Ensure that BLAKE-2 objects are correctly initialized
+before being tracked by the garbage collector. Patch by Bénédikt Tran.
diff --git a/Modules/blake2module.c b/Modules/blake2module.c
index c69c425..551ebd7 100644
--- a/Modules/blake2module.c
+++ b/Modules/blake2module.c
@@ -392,6 +392,29 @@ new_Blake2Object(PyTypeObject *type)
         return NULL;
     }
     HASHLIB_INIT_MUTEX(self);
+    self->impl = type_to_impl(type);
+    // Ensure that the states are NULL-initialized in case of an error.
+    // See: py_blake2_clear() for more details.
+    switch (self->impl) {
+#if _Py_HACL_CAN_COMPILE_VEC256
+        case Blake2b_256:
+            self->blake2b_256_state = NULL;
+            break;
+#endif
+#if _Py_HACL_CAN_COMPILE_VEC128
+        case Blake2s_128:
+            self->blake2s_128_state = NULL;
+            break;
+#endif
+        case Blake2b:
+            self->blake2b_state = NULL;
+            break;
+        case Blake2s:
+            self->blake2s_state = NULL;
+            break;
+        default:
+            Py_UNREACHABLE();
+    }
 
     PyObject_GC_Track(self);
     return self;
@@ -553,30 +576,6 @@ py_blake2_new(PyTypeObject *type, PyObject *data, int digest_size,
         goto error;
     }
 
-    self->impl = type_to_impl(type);
-    // Ensure that the states are NULL-initialized in case of an error.
-    // See: py_blake2_clear() for more details.
-    switch (self->impl) {
-#if _Py_HACL_CAN_COMPILE_VEC256
-        case Blake2b_256:
-            self->blake2b_256_state = NULL;
-            break;
-#endif
-#if _Py_HACL_CAN_COMPILE_VEC128
-        case Blake2s_128:
-            self->blake2s_128_state = NULL;
-            break;
-#endif
-        case Blake2b:
-            self->blake2b_state = NULL;
-            break;
-        case Blake2s:
-            self->blake2s_state = NULL;
-            break;
-        default:
-            Py_UNREACHABLE();
-    }
-
     // Unlike the state types, the parameters share a single (client-friendly)
     // structure.
     if (py_blake2_validate_params(self,