Data race on dev->mtu betwen __dev_set_mtu() and rawv6_send_hdrinc()
From: Gong, Sishuai <hidden>
Date: 2021-02-22 23:29:23
Hello,
We found a data race on dev->mtu between function __dev_set_mtu() and rawv6_send_hdrinc(). It happens with the following interleaving.
writer: __dev_set_mtu() reader: rawv6_send_hdrinc()
if (length > rt->dst.dev->mtu) {
WRITE_ONCE(dev->mtu, new_mtu);
ipv6_local_error(sk, EMSGSIZE, fl6, rt->dst.dev->mtu);
If the writer happens to change dev->mtu to a value that is bigger than the variable ‘length’, then ipv6_local_error will read a value that doesn’t satisfy this conditional statement. While there is no need to use lock to protect the read, it is probably better to only read dev->mtu once in rawv6_send_hdrinc().
Thanks,
Sishuai