Skip to content

Commit 964d65f

Browse files
authored
Issue 1195 (#1196)
Closes #1195
1 parent c90fade commit 964d65f

File tree

3 files changed

+31
-5
lines changed

3 files changed

+31
-5
lines changed

CHANGES/1195.bugfix.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
Fix a bug in C implementation when during multidict resizing the function could drop
2+
last item under some circumstances.
3+
4+
The bug was introduced by multidict 6.5.0 release.
5+
6+
Patch by :user:`asvetlov`.

multidict/_multilib/hashtable.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -207,12 +207,12 @@ _md_resize(MultiDictObject *md, uint8_t log2_newsize, bool update)
207207
if (oldkeys->nentries == numentries) {
208208
memcpy(newentries, oldentries, numentries * sizeof(entry_t));
209209
} else {
210-
entry_t *ep = oldentries;
211-
for (Py_ssize_t i = 0; i < numentries; i++) {
212-
if (!update) {
213-
while (ep->identity == NULL) ep++;
210+
entry_t *new_ep = newentries;
211+
entry_t *old_ep = oldentries;
212+
for (Py_ssize_t i = 0; i < oldkeys->nentries; ++i, ++old_ep) {
213+
if (old_ep->identity != NULL) {
214+
*new_ep++ = *old_ep;
214215
}
215-
newentries[i] = *ep++;
216216
}
217217
}
218218

tests/test_mutable_multidict.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -793,3 +793,23 @@ def test_keys_type(
793793

794794
k, v = d.popitem()
795795
assert type(k) is case_insensitive_str_class
796+
797+
def test_issue_1195(
798+
self, case_insensitive_multidict_class: type[CIMultiDict[bytes]]
799+
) -> None:
800+
md = case_insensitive_multidict_class(
801+
{
802+
"User-Agent": b"Bacon/1.0",
803+
"Cookie": b"valued-visitor=yes;foo=bar",
804+
"X-Bar": b"Foo",
805+
"X-Foo": b"Bar",
806+
"Referer": b"https://httpie.org/",
807+
}
808+
)
809+
810+
md2 = md.copy()
811+
812+
md.popone("User-Agent")
813+
assert md.keys() == md2.keys() - {"User-Agent"}
814+
md.update([("User-Agent", b"Bacon/1.0")])
815+
assert md.keys() == md2.keys()

0 commit comments

Comments
 (0)