Fix a race condition in a threaded fopen test (RHEL-83007)
Resolves: RHEL-83007
This commit is contained in:
parent
7de5dcc17c
commit
f98d82d9fc
62
glibc-RHEL-83007.patch
Normal file
62
glibc-RHEL-83007.patch
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
commit 10af00f7a135c85796a9c4c75228358b8898da5c
|
||||||
|
Author: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||||||
|
Date: Fri Mar 14 10:18:21 2025 -0400
|
||||||
|
|
||||||
|
tst-fopen-threaded: Only check EOF for failing read
|
||||||
|
|
||||||
|
The fread race checker looks for EOF in every thread, which is incorrect
|
||||||
|
since threads calling fread successfully could lag behind and read the
|
||||||
|
EOF condition, resulting in multiple threads thinking that they
|
||||||
|
encountered an EOF.
|
||||||
|
|
||||||
|
Only look for EOF condition if fread fails to read a char. Also drop
|
||||||
|
the clearerr() since it could mask the failure of another reader, thus
|
||||||
|
hiding a test failure.
|
||||||
|
|
||||||
|
Finally, also check for error in the stream for completeness.
|
||||||
|
|
||||||
|
Signed-off-by: Siddhesh Poyarekar <siddhesh@sourceware.org>
|
||||||
|
Reviewed-by: Florian Weimer <fweimer@redhat.com>
|
||||||
|
|
||||||
|
diff --git a/sysdeps/pthread/tst-fopen-threaded.c b/sysdeps/pthread/tst-fopen-threaded.c
|
||||||
|
index 5c792c93e3711621..ade58ad19eb209d1 100644
|
||||||
|
--- a/sysdeps/pthread/tst-fopen-threaded.c
|
||||||
|
+++ b/sysdeps/pthread/tst-fopen-threaded.c
|
||||||
|
@@ -64,19 +64,27 @@ threadReadRoutine (void *argv)
|
||||||
|
/* Wait for all threads to be ready to read. */
|
||||||
|
xpthread_barrier_wait (&barrier);
|
||||||
|
|
||||||
|
- ret =
|
||||||
|
- fread (&read_buffer, sizeof (char), sizeof (read_buffer), my_data->fd);
|
||||||
|
- if (feof (my_data->fd) != 0)
|
||||||
|
+ ret = fread (&read_buffer, 1, sizeof (read_buffer), my_data->fd);
|
||||||
|
+ /* If no data is returned (we read only 1 byte, so there's no short read
|
||||||
|
+ situation here), look for EOF flag and record it in MY_DATA. The EOF flag
|
||||||
|
+ is not cleared because that could result in a test failure being masked
|
||||||
|
+ when two threads fail to read and one of them clears error/EOF flags
|
||||||
|
+ before the second one has the chance to observe it.
|
||||||
|
+
|
||||||
|
+ Successful readers could still see the EOF if they fall behind the failing
|
||||||
|
+ read when calling feof(), which could result in a false test failure. To
|
||||||
|
+ avoid this race, we only make the failing reader check for EOF or
|
||||||
|
+ error. */
|
||||||
|
+ if (ret == 0)
|
||||||
|
{
|
||||||
|
- clearerr (my_data->fd);
|
||||||
|
- my_data->eof = true;
|
||||||
|
+ if (feof (my_data->fd) != 0)
|
||||||
|
+ my_data->eof = true;
|
||||||
|
+ else
|
||||||
|
+ FAIL_EXIT1 ("fread failed (ferror: %d): %m", ferror (my_data->fd));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
- {
|
||||||
|
- TEST_COMPARE (ret, 1);
|
||||||
|
- /* Save the read value. */
|
||||||
|
- my_data->value = read_buffer;
|
||||||
|
- }
|
||||||
|
+ /* Save the read value. */
|
||||||
|
+ my_data->value = read_buffer;
|
||||||
|
TEST_COMPARE (ferror (my_data->fd), 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
@ -157,7 +157,7 @@ end \
|
|||||||
Summary: The GNU libc libraries
|
Summary: The GNU libc libraries
|
||||||
Name: glibc
|
Name: glibc
|
||||||
Version: %{glibcversion}
|
Version: %{glibcversion}
|
||||||
Release: 179%{?dist}
|
Release: 180%{?dist}
|
||||||
|
|
||||||
# In general, GPLv2+ is used by programs, LGPLv2+ is used for
|
# In general, GPLv2+ is used by programs, LGPLv2+ is used for
|
||||||
# libraries.
|
# libraries.
|
||||||
@ -1152,6 +1152,7 @@ Patch844: glibc-RHEL-28119.patch
|
|||||||
Patch845: glibc-RHEL-61561.patch
|
Patch845: glibc-RHEL-61561.patch
|
||||||
Patch846: glibc-RHEL-83527-1.patch
|
Patch846: glibc-RHEL-83527-1.patch
|
||||||
Patch847: glibc-RHEL-83527-2.patch
|
Patch847: glibc-RHEL-83527-2.patch
|
||||||
|
Patch848: glibc-RHEL-83007.patch
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
# Continued list of core "glibc" package information:
|
# Continued list of core "glibc" package information:
|
||||||
@ -3145,6 +3146,9 @@ update_gconv_modules_cache ()
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Fri Mar 14 2025 Arjun Shankar <arjun@redhat.com> - 2.34-180
|
||||||
|
- Fix a race condition in a threaded fopen test (RHEL-83007)
|
||||||
|
|
||||||
* Fri Mar 14 2025 Arjun Shankar <arjun@redhat.com> - 2.34-179
|
* Fri Mar 14 2025 Arjun Shankar <arjun@redhat.com> - 2.34-179
|
||||||
- assert: Add test for CVE-2025-0395 (RHEL-83527)
|
- assert: Add test for CVE-2025-0395 (RHEL-83527)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user