All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marco Elver <elver@google.com>
To: Christian Brauner <christian.brauner@ubuntu.com>
Cc: syzbot+c5d03165a1bd1dead0c1@syzkaller.appspotmail.com,
	bsingharora@gmail.com, LKML <linux-kernel@vger.kernel.org>,
	syzkaller-bugs@googlegroups.com
Subject: Re: [PATCH] taskstats: fix data-race
Date: Sat, 5 Oct 2019 15:33:07 +0200	[thread overview]
Message-ID: <CANpmjNMqTupyPc6-PCviB1HPTHawjzNL1r1gmdQqnwCvE=BNNA@mail.gmail.com> (raw)
In-Reply-To: <20191005112806.13960-1-christian.brauner@ubuntu.com>

On Sat, 5 Oct 2019 at 13:28, Christian Brauner
<christian.brauner@ubuntu.com> wrote:
>
> When assiging and testing taskstats in taskstats
> taskstats_exit() there's a race around writing and reading sig->stats.
>
> cpu0:
> task calls exit()
> do_exit()
>         -> taskstats_exit()
>                 -> taskstats_tgid_alloc()
> The task takes sighand lock and assigns new stats to sig->stats.
>
> cpu1:
> task catches signal
> do_exit()
>         -> taskstats_tgid_alloc()
>                 -> taskstats_exit()
> The tasks reads sig->stats __without__ holding sighand lock seeing
> garbage.

Is the task seeing garbage reading the data pointed to by stats, or is
this just the pointer that would be garbage?

My only observation here is that the previous version was trying to do
double-checked locking, to avoid taking the lock if sig->stats was
already set. The obvious problem with the previous version is plain
read/write and missing memory ordering: the write inside the critical
section should be smp_store_release and there should only be one
smp_load_acquire at the start.

Maybe I missed something somewhere, but maybe my suggestion below
would be an equivalent fix without always having to take the lock to
assign the pointer? If performance is not critical here, then it's
probably not worth it.

Thanks,
-- Marco

diff --git a/kernel/taskstats.c b/kernel/taskstats.c
index 13a0f2e6ebc2..f58dd285a44b 100644
--- a/kernel/taskstats.c
+++ b/kernel/taskstats.c
@@ -554,25 +554,31 @@ static int taskstats_user_cmd(struct sk_buff
*skb, struct genl_info *info)
 static struct taskstats *taskstats_tgid_alloc(struct task_struct *tsk)
 {
  struct signal_struct *sig = tsk->signal;
- struct taskstats *stats;
+ struct taskstats *stats_new, *stats;

- if (sig->stats || thread_group_empty(tsk))
+ /* acquire load to make pointed-to data visible */
+ stats = smp_load_acquire(&sig->stats);
+ if (stats || thread_group_empty(tsk))
  goto ret;

  /* No problem if kmem_cache_zalloc() fails */
- stats = kmem_cache_zalloc(taskstats_cache, GFP_KERNEL);
+ stats_new = kmem_cache_zalloc(taskstats_cache, GFP_KERNEL);

  spin_lock_irq(&tsk->sighand->siglock);
- if (!sig->stats) {
- sig->stats = stats;
- stats = NULL;
+ stats = sig->stats;
+ if (!stats) {
+ stats = stats_new;
+ /* release store to order zalloc before */
+ smp_store_release(&sig->stats, stats_new);
+ stats_new = NULL;
  }
  spin_unlock_irq(&tsk->sighand->siglock);

- if (stats)
- kmem_cache_free(taskstats_cache, stats);
+ if (stats_new)
+ kmem_cache_free(taskstats_cache, stats_new);
+
 ret:
- return sig->stats;
+ return stats;
 }

 /* Send pid data out on exit */

  reply	other threads:[~2019-10-05 13:33 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-05  4:26 KCSAN: data-race in taskstats_exit / taskstats_exit syzbot
2019-10-05  4:29 ` Dmitry Vyukov
2019-10-05 11:29   ` Christian Brauner
2019-10-05 11:28 ` [PATCH] taskstats: fix data-race Christian Brauner
2019-10-05 13:33   ` Marco Elver [this message]
2019-10-05 14:15     ` Christian Brauner
2019-10-05 14:34       ` Marco Elver
2019-10-06 10:00   ` Dmitry Vyukov
2019-10-06 10:59     ` Christian Brauner
2019-10-06 23:52   ` Christian Brauner
2019-10-07  7:31     ` Dmitry Vyukov
2019-10-07  9:29       ` Christian Brauner
2019-10-07 10:40     ` Andrea Parri
2019-10-07 10:50       ` Christian Brauner
2019-10-07 11:01       ` [PATCH v2] " Christian Brauner
2019-10-07 13:18         ` Andrea Parri
2019-10-07 13:28           ` Christian Brauner
2019-10-07 13:50           ` Dmitry Vyukov
2019-10-07 13:55             ` Christian Brauner
2019-10-07 14:08               ` Dmitry Vyukov
2019-10-07 14:10                 ` Christian Brauner
2019-10-07 14:14             ` Andrea Parri
2019-10-07 14:18               ` Dmitry Vyukov
2019-10-08 14:20                 ` Andrea Parri
2019-10-08 14:24                   ` Christian Brauner
2019-10-08 15:26                     ` Andrea Parri
2019-10-08 15:35                       ` Christian Brauner
2019-10-08 15:44                         ` Andrea Parri
2019-10-09 11:31                           ` [PATCH] " Christian Brauner
2019-10-09 11:40                             ` Christian Brauner
2019-10-09 11:48                             ` [PATCH v5] " Christian Brauner
2019-10-09 12:08                               ` Andrea Parri
2019-10-09 13:26                               ` Christian Brauner
2019-10-21 11:33                               ` [PATCH v6] " Christian Brauner
2019-10-21 12:19                                 ` Rasmus Villemoes
2019-10-21 13:04                                   ` Christian Brauner
2019-11-29 17:56                                     ` Will Deacon
2019-11-30 15:08                                       ` Christian Brauner
2019-10-23 12:16                                 ` Andrea Parri
2019-10-23 12:39                                   ` Dmitry Vyukov
2019-10-23 13:11                                     ` Christian Brauner
2019-10-23 13:20                                       ` Dmitry Vyukov
2019-10-24 11:31                                     ` Andrea Parri
2019-10-24 11:51                                       ` Dmitry Vyukov
2019-10-24 13:05                                         ` Andrea Parri
2019-10-24 13:13                                           ` Dmitry Vyukov
2019-10-24 13:21                                             ` Christian Brauner
2019-10-24 13:34                                               ` Dmitry Vyukov
2019-10-24 13:43                                             ` Andrea Parri
2019-10-24 13:58                                               ` Dmitry Vyukov
2019-10-24 14:40                                                 ` Andrea Parri
2019-10-24 14:49                                                   ` Dmitry Vyukov
2019-11-29 17:57                                 ` Will Deacon
2019-10-09 11:48                             ` [PATCH] " Marco Elver
2019-10-09 11:53                               ` Christian Brauner
2019-11-06  0:27   ` Balbir Singh
2019-11-06  0:09 ` KCSAN: data-race in taskstats_exit / taskstats_exit Balbir Singh
2019-11-06 10:23   ` Marco Elver
2019-11-07 10:39     ` Balbir Singh
2019-11-08  0:54     ` Balbir Singh
2019-11-08  8:55       ` Dmitry Vyukov
2019-11-09  3:42         ` Balbir Singh

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CANpmjNMqTupyPc6-PCviB1HPTHawjzNL1r1gmdQqnwCvE=BNNA@mail.gmail.com' \
    --to=elver@google.com \
    --cc=bsingharora@gmail.com \
    --cc=christian.brauner@ubuntu.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=syzbot+c5d03165a1bd1dead0c1@syzkaller.appspotmail.com \
    --cc=syzkaller-bugs@googlegroups.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.