Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755269AbbLPW7T (ORCPT ); Wed, 16 Dec 2015 17:59:19 -0500 Received: from mail-lb0-f174.google.com ([209.85.217.174]:33551 "EHLO mail-lb0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754678AbbLPW7R (ORCPT ); Wed, 16 Dec 2015 17:59:17 -0500 MIME-Version: 1.0 In-Reply-To: References: From: Willem de Bruijn Date: Wed, 16 Dec 2015 17:58:35 -0500 Message-ID: Subject: Re: net: heap-out-of-bounds in sock_setsockopt To: Cong Wang Cc: Dmitry Vyukov , Willem de Bruijn , "David S. Miller" , Eric Dumazet , "Eric W. Biederman" , Mel Gorman , Craig Gallek , Ying Xue , Hannes Frederic Sowa , Edward Jee , Julia Lawall , netdev , LKML , syzkaller , Kostya Serebryany , Alexander Potapenko , Sasha Levin Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2005 Lines: 46 > > Hmm, we should exclude the raw socket case, something like the > following, but I am not sure if the check is too strict or not, also > not sure if we should return an error for this raw socket case. No, SOF_TIMESTAMPING_OPT_ID with SOCK_RAW/IPPROTO_TCP is legitimate. It should fall through to initializing sk->sk_tskey to zero. Only stream sockets should use the special case where numbering is bytestream and computed by subtracting the seqno from the seqno at the time that the option is enabled. > > diff --git a/net/core/sock.c b/net/core/sock.c > index 765be83..c26e80a 100644 > --- a/net/core/sock.c > +++ b/net/core/sock.c > @@ -872,7 +872,7 @@ int sock_setsockopt(struct socket *sock, int > level, int optname, > > if (val & SOF_TIMESTAMPING_OPT_ID && > !(sk->sk_tsflags & SOF_TIMESTAMPING_OPT_ID)) { > - if (sk->sk_protocol == IPPROTO_TCP) { > + if (sk->sk_protocol == IPPROTO_TCP && > sk->sk_type == SOCK_STREAM) { > if (sk->sk_state != TCP_ESTABLISHED) { > ret = -EINVAL; > break; I made the same error when later returning the tskey in __skb_tstamp_tx: if (sk->sk_tsflags & SOF_TIMESTAMPING_OPT_ID) { serr->ee.ee_data = skb_shinfo(skb)->tskey; if (sk->sk_protocol == IPPROTO_TCP) serr->ee.ee_data -= sk->sk_tskey; } This has no effect if sk->sk_tskey is initialized to 0 with your patch. Still, it should not treat SOCK_RAW as a TCP sock here, either. Please add this if you're about to send the patch. Or I can send it separately, if you prefer. Thanks for the quick fix. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/