blob: fd73b23c88b4b40be13e3a49c75ab2363a0932c4 [file] [log] [blame]
Patrick Williams213cb262021-08-07 19:21:33 -05001From 42d359350510506b87101cf77202fefcbfc790cb Mon Sep 17 00:00:00 2001
2From: Andreas Schwab <schwab@linux-m68k.org>
3Date: Thu, 27 May 2021 12:49:47 +0200
4Subject: [PATCH] Use __pthread_attr_copy in mq_notify (bug 27896)
5
6Make a deep copy of the pthread attribute object to remove a potential
7use-after-free issue.
8
9Upstream-Status: Backport [https://sourceware.org/git/?p=glibc.git;a=commit;h=42d359350510506b87101cf77202fefcbfc790cb]
10CVE: CVE-2021-33574
11Signed-off-by: Vinay Kumar <vinay.m.engg@gmail.com>
12---
13diff --git a/sysdeps/unix/sysv/linux/mq_notify.c b/sysdeps/unix/sysv/linux/mq_notify.c
14index cc575a0cdd8..6f46d29d1dc 100644
15--- a/sysdeps/unix/sysv/linux/mq_notify.c
16+++ b/sysdeps/unix/sysv/linux/mq_notify.c
17@@ -133,8 +133,11 @@ helper_thread (void *arg)
18 (void) __pthread_barrier_wait (&notify_barrier);
19 }
20 else if (data.raw[NOTIFY_COOKIE_LEN - 1] == NOTIFY_REMOVED)
21- /* The only state we keep is the copy of the thread attributes. */
22- free (data.attr);
23+ {
24+ /* The only state we keep is the copy of the thread attributes. */
25+ pthread_attr_destroy (data.attr);
26+ free (data.attr);
27+ }
28 }
29 return NULL;
30 }
31@@ -255,8 +258,14 @@ mq_notify (mqd_t mqdes, const struct sigevent *notification)
32 if (data.attr == NULL)
33 return -1;
34
35- memcpy (data.attr, notification->sigev_notify_attributes,
36- sizeof (pthread_attr_t));
37+ int ret = __pthread_attr_copy (data.attr,
38+ notification->sigev_notify_attributes);
39+ if (ret != 0)
40+ {
41+ free (data.attr);
42+ __set_errno (ret);
43+ return -1;
44+ }
45 }
46
47 /* Construct the new request. */
48@@ -269,8 +278,11 @@ mq_notify (mqd_t mqdes, const struct sigevent *notification)
49 int retval = INLINE_SYSCALL (mq_notify, 2, mqdes, &se);
50
51 /* If it failed, free the allocated memory. */
52- if (__glibc_unlikely (retval != 0))
53- free (data.attr);
54+ if (retval != 0 && data.attr != NULL)
55+ {
56+ pthread_attr_destroy (data.attr);
57+ free (data.attr);
58+ }
59
60 return retval;
61 }