Skip to content

Commit 645293d

Browse files
committed
gh-153852: Fix data race in list.sort()
1 parent 206788a commit 645293d

1 file changed

Lines changed: 16 additions & 16 deletions

File tree

Objects/listobject.c

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1653,25 +1653,25 @@ typedef struct {
16531653
Py_LOCAL_INLINE(void)
16541654
sortslice_copy(sortslice *s1, Py_ssize_t i, sortslice *s2, Py_ssize_t j)
16551655
{
1656-
s1->keys[i] = s2->keys[j];
1656+
FT_ATOMIC_STORE_PTR_RELEASE(s1->keys[i], s2->keys[j]);
16571657
if (s1->values != NULL)
1658-
s1->values[i] = s2->values[j];
1658+
FT_ATOMIC_STORE_PTR_RELEASE(s1->values[i], s2->values[j]);
16591659
}
16601660

16611661
Py_LOCAL_INLINE(void)
16621662
sortslice_copy_incr(sortslice *dst, sortslice *src)
16631663
{
1664-
*dst->keys++ = *src->keys++;
1664+
FT_ATOMIC_STORE_PTR_RELEASE(*dst->keys++, *src->keys++);
16651665
if (dst->values != NULL)
1666-
*dst->values++ = *src->values++;
1666+
FT_ATOMIC_STORE_PTR_RELEASE(*dst->values++, *src->values++);
16671667
}
16681668

16691669
Py_LOCAL_INLINE(void)
16701670
sortslice_copy_decr(sortslice *dst, sortslice *src)
16711671
{
1672-
*dst->keys-- = *src->keys--;
1672+
FT_ATOMIC_STORE_PTR_RELEASE(*dst->keys--, *src->keys--);
16731673
if (dst->values != NULL)
1674-
*dst->values-- = *src->values--;
1674+
FT_ATOMIC_STORE_PTR_RELEASE(*dst->values--, *src->values--);
16751675
}
16761676

16771677

@@ -1855,22 +1855,22 @@ binarysort(MergeState *ms, const sortslice *ss, Py_ssize_t n, Py_ssize_t ok)
18551855
for (M = ok - 1; M >= 0; --M) {
18561856
k = ISLT(pivot, a[M]);
18571857
if (k < 0) {
1858-
a[M + 1] = pivot;
1858+
FT_ATOMIC_STORE_PTR_RELEASE(a[M + 1], pivot);
18591859
if (has_values)
1860-
v[M + 1] = vpivot;
1860+
FT_ATOMIC_STORE_PTR_RELEASE(v[M + 1], vpivot);
18611861
goto fail;
18621862
}
18631863
else if (k) {
1864-
a[M + 1] = a[M];
1864+
FT_ATOMIC_STORE_PTR_RELEASE(a[M + 1], a[M]);
18651865
if (has_values)
1866-
v[M + 1] = v[M];
1866+
FT_ATOMIC_STORE_PTR_RELEASE(v[M + 1], v[M]);
18671867
}
18681868
else
18691869
break;
18701870
}
1871-
a[M + 1] = pivot;
1871+
FT_ATOMIC_STORE_PTR_RELEASE(a[M + 1], pivot);
18721872
if (has_values)
1873-
v[M + 1] = vpivot;
1873+
FT_ATOMIC_STORE_PTR_RELEASE(v[M + 1], vpivot);
18741874
}
18751875
#else // binary insertion sort
18761876
Py_ssize_t L, R;
@@ -1915,13 +1915,13 @@ binarysort(MergeState *ms, const sortslice *ss, Py_ssize_t n, Py_ssize_t ok)
19151915
usually moving many slots. Years later: under Visual Studio 2022,
19161916
memmove seems just slightly slower than doing it "by hand". */
19171917
for (M = ok; M > L; --M)
1918-
a[M] = a[M - 1];
1919-
a[L] = pivot;
1918+
FT_ATOMIC_STORE_PTR_RELEASE(a[M], a[M - 1]);
1919+
FT_ATOMIC_STORE_PTR_RELEASE(a[L], pivot);
19201920
if (has_values) {
19211921
pivot = v[ok];
19221922
for (M = ok; M > L; --M)
1923-
v[M] = v[M - 1];
1924-
v[L] = pivot;
1923+
FT_ATOMIC_STORE_PTR_RELEASE(v[M], v[M - 1]);
1924+
FT_ATOMIC_STORE_PTR_RELEASE(v[L], pivot);
19251925
}
19261926
}
19271927
#endif // pick binary or regular insertion sort

0 commit comments

Comments
 (0)