stable.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	stable@vger.kernel.org, Joshua Kinard <kumba@gentoo.org>,
	Vlad Yasevich <vyasevic@redhat.com>,
	Daniel Borkmann <dborkman@redhat.com>,
	Neil Horman <nhorman@tuxdriver.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [PATCH 3.14 086/140] net: sctp: cache auth_enable per endpoint
Date: Wed, 28 May 2014 21:33:45 -0700	[thread overview]
Message-ID: <20140529043100.674671334@linuxfoundation.org> (raw)
In-Reply-To: <20140529043049.661315084@linuxfoundation.org>

3.14-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Vlad Yasevich <vyasevic@redhat.com>

[ Upstream commit b14878ccb7fac0242db82720b784ab62c467c0dc ]

Currently, it is possible to create an SCTP socket, then switch
auth_enable via sysctl setting to 1 and crash the system on connect:

Oops[#1]:
CPU: 0 PID: 0 Comm: swapper Not tainted 3.14.1-mipsgit-20140415 #1
task: ffffffff8056ce80 ti: ffffffff8055c000 task.ti: ffffffff8055c000
[...]
Call Trace:
[<ffffffff8043c4e8>] sctp_auth_asoc_set_default_hmac+0x68/0x80
[<ffffffff8042b300>] sctp_process_init+0x5e0/0x8a4
[<ffffffff8042188c>] sctp_sf_do_5_1B_init+0x234/0x34c
[<ffffffff804228c8>] sctp_do_sm+0xb4/0x1e8
[<ffffffff80425a08>] sctp_endpoint_bh_rcv+0x1c4/0x214
[<ffffffff8043af68>] sctp_rcv+0x588/0x630
[<ffffffff8043e8e8>] sctp6_rcv+0x10/0x24
[<ffffffff803acb50>] ip6_input+0x2c0/0x440
[<ffffffff8030fc00>] __netif_receive_skb_core+0x4a8/0x564
[<ffffffff80310650>] process_backlog+0xb4/0x18c
[<ffffffff80313cbc>] net_rx_action+0x12c/0x210
[<ffffffff80034254>] __do_softirq+0x17c/0x2ac
[<ffffffff800345e0>] irq_exit+0x54/0xb0
[<ffffffff800075a4>] ret_from_irq+0x0/0x4
[<ffffffff800090ec>] rm7k_wait_irqoff+0x24/0x48
[<ffffffff8005e388>] cpu_startup_entry+0xc0/0x148
[<ffffffff805a88b0>] start_kernel+0x37c/0x398
Code: dd0900b8  000330f8  0126302d <dcc60000> 50c0fff1  0047182a  a48306a0
03e00008  00000000
---[ end trace b530b0551467f2fd ]---
Kernel panic - not syncing: Fatal exception in interrupt

What happens while auth_enable=0 in that case is, that
ep->auth_hmacs is initialized to NULL in sctp_auth_init_hmacs()
when endpoint is being created.

After that point, if an admin switches over to auth_enable=1,
the machine can crash due to NULL pointer dereference during
reception of an INIT chunk. When we enter sctp_process_init()
via sctp_sf_do_5_1B_init() in order to respond to an INIT chunk,
the INIT verification succeeds and while we walk and process
all INIT params via sctp_process_param() we find that
net->sctp.auth_enable is set, therefore do not fall through,
but invoke sctp_auth_asoc_set_default_hmac() instead, and thus,
dereference what we have set to NULL during endpoint
initialization phase.

The fix is to make auth_enable immutable by caching its value
during endpoint initialization, so that its original value is
being carried along until destruction. The bug seems to originate
from the very first days.

Fix in joint work with Daniel Borkmann.

Reported-by: Joshua Kinard <kumba@gentoo.org>
Signed-off-by: Vlad Yasevich <vyasevic@redhat.com>
Signed-off-by: Daniel Borkmann <dborkman@redhat.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Tested-by: Joshua Kinard <kumba@gentoo.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 include/net/sctp/structs.h |    4 ++-
 net/sctp/auth.c            |   17 +++++---------
 net/sctp/endpointola.c     |    3 +-
 net/sctp/sm_make_chunk.c   |   32 ++++++++++++++------------
 net/sctp/sm_statefuns.c    |    6 ++---
 net/sctp/socket.c          |   54 +++++++++++++++++++++------------------------
 net/sctp/sysctl.c          |   36 +++++++++++++++++++++++++++++-
 7 files changed, 92 insertions(+), 60 deletions(-)

--- a/include/net/sctp/structs.h
+++ b/include/net/sctp/structs.h
@@ -1241,6 +1241,7 @@ struct sctp_endpoint {
 	/* SCTP-AUTH: endpoint shared keys */
 	struct list_head endpoint_shared_keys;
 	__u16 active_key_id;
+	__u8  auth_enable;
 };
 
 /* Recover the outter endpoint structure. */
@@ -1269,7 +1270,8 @@ struct sctp_endpoint *sctp_endpoint_is_m
 int sctp_has_association(struct net *net, const union sctp_addr *laddr,
 			 const union sctp_addr *paddr);
 
-int sctp_verify_init(struct net *net, const struct sctp_association *asoc,
+int sctp_verify_init(struct net *net, const struct sctp_endpoint *ep,
+		     const struct sctp_association *asoc,
 		     sctp_cid_t, sctp_init_chunk_t *peer_init,
 		     struct sctp_chunk *chunk, struct sctp_chunk **err_chunk);
 int sctp_process_init(struct sctp_association *, struct sctp_chunk *chunk,
--- a/net/sctp/auth.c
+++ b/net/sctp/auth.c
@@ -386,14 +386,13 @@ nomem:
  */
 int sctp_auth_asoc_init_active_key(struct sctp_association *asoc, gfp_t gfp)
 {
-	struct net *net = sock_net(asoc->base.sk);
 	struct sctp_auth_bytes	*secret;
 	struct sctp_shared_key *ep_key;
 
 	/* If we don't support AUTH, or peer is not capable
 	 * we don't need to do anything.
 	 */
-	if (!net->sctp.auth_enable || !asoc->peer.auth_capable)
+	if (!asoc->ep->auth_enable || !asoc->peer.auth_capable)
 		return 0;
 
 	/* If the key_id is non-zero and we couldn't find an
@@ -440,16 +439,16 @@ struct sctp_shared_key *sctp_auth_get_sh
  */
 int sctp_auth_init_hmacs(struct sctp_endpoint *ep, gfp_t gfp)
 {
-	struct net *net = sock_net(ep->base.sk);
 	struct crypto_hash *tfm = NULL;
 	__u16   id;
 
-	/* if the transforms are already allocted, we are done */
-	if (!net->sctp.auth_enable) {
+	/* If AUTH extension is disabled, we are done */
+	if (!ep->auth_enable) {
 		ep->auth_hmacs = NULL;
 		return 0;
 	}
 
+	/* If the transforms are already allocated, we are done */
 	if (ep->auth_hmacs)
 		return 0;
 
@@ -665,12 +664,10 @@ static int __sctp_auth_cid(sctp_cid_t ch
 /* Check if peer requested that this chunk is authenticated */
 int sctp_auth_send_cid(sctp_cid_t chunk, const struct sctp_association *asoc)
 {
-	struct net  *net;
 	if (!asoc)
 		return 0;
 
-	net = sock_net(asoc->base.sk);
-	if (!net->sctp.auth_enable || !asoc->peer.auth_capable)
+	if (!asoc->ep->auth_enable || !asoc->peer.auth_capable)
 		return 0;
 
 	return __sctp_auth_cid(chunk, asoc->peer.peer_chunks);
@@ -679,12 +676,10 @@ int sctp_auth_send_cid(sctp_cid_t chunk,
 /* Check if we requested that peer authenticate this chunk. */
 int sctp_auth_recv_cid(sctp_cid_t chunk, const struct sctp_association *asoc)
 {
-	struct net *net;
 	if (!asoc)
 		return 0;
 
-	net = sock_net(asoc->base.sk);
-	if (!net->sctp.auth_enable)
+	if (!asoc->ep->auth_enable)
 		return 0;
 
 	return __sctp_auth_cid(chunk,
--- a/net/sctp/endpointola.c
+++ b/net/sctp/endpointola.c
@@ -68,7 +68,8 @@ static struct sctp_endpoint *sctp_endpoi
 	if (!ep->digest)
 		return NULL;
 
-	if (net->sctp.auth_enable) {
+	ep->auth_enable = net->sctp.auth_enable;
+	if (ep->auth_enable) {
 		/* Allocate space for HMACS and CHUNKS authentication
 		 * variables.  There are arrays that we encode directly
 		 * into parameters to make the rest of the operations easier.
--- a/net/sctp/sm_make_chunk.c
+++ b/net/sctp/sm_make_chunk.c
@@ -219,6 +219,7 @@ struct sctp_chunk *sctp_make_init(const
 			     gfp_t gfp, int vparam_len)
 {
 	struct net *net = sock_net(asoc->base.sk);
+	struct sctp_endpoint *ep = asoc->ep;
 	sctp_inithdr_t init;
 	union sctp_params addrs;
 	size_t chunksize;
@@ -278,7 +279,7 @@ struct sctp_chunk *sctp_make_init(const
 	chunksize += vparam_len;
 
 	/* Account for AUTH related parameters */
-	if (net->sctp.auth_enable) {
+	if (ep->auth_enable) {
 		/* Add random parameter length*/
 		chunksize += sizeof(asoc->c.auth_random);
 
@@ -363,7 +364,7 @@ struct sctp_chunk *sctp_make_init(const
 	}
 
 	/* Add SCTP-AUTH chunks to the parameter list */
-	if (net->sctp.auth_enable) {
+	if (ep->auth_enable) {
 		sctp_addto_chunk(retval, sizeof(asoc->c.auth_random),
 				 asoc->c.auth_random);
 		if (auth_hmacs)
@@ -2010,7 +2011,7 @@ static void sctp_process_ext_param(struc
 			/* if the peer reports AUTH, assume that he
 			 * supports AUTH.
 			 */
-			if (net->sctp.auth_enable)
+			if (asoc->ep->auth_enable)
 				asoc->peer.auth_capable = 1;
 			break;
 		case SCTP_CID_ASCONF:
@@ -2102,6 +2103,7 @@ static sctp_ierror_t sctp_process_unk_pa
  * 	SCTP_IERROR_NO_ERROR - continue with the chunk
  */
 static sctp_ierror_t sctp_verify_param(struct net *net,
+					const struct sctp_endpoint *ep,
 					const struct sctp_association *asoc,
 					union sctp_params param,
 					sctp_cid_t cid,
@@ -2152,7 +2154,7 @@ static sctp_ierror_t sctp_verify_param(s
 		goto fallthrough;
 
 	case SCTP_PARAM_RANDOM:
-		if (!net->sctp.auth_enable)
+		if (!ep->auth_enable)
 			goto fallthrough;
 
 		/* SCTP-AUTH: Secion 6.1
@@ -2169,7 +2171,7 @@ static sctp_ierror_t sctp_verify_param(s
 		break;
 
 	case SCTP_PARAM_CHUNKS:
-		if (!net->sctp.auth_enable)
+		if (!ep->auth_enable)
 			goto fallthrough;
 
 		/* SCTP-AUTH: Section 3.2
@@ -2185,7 +2187,7 @@ static sctp_ierror_t sctp_verify_param(s
 		break;
 
 	case SCTP_PARAM_HMAC_ALGO:
-		if (!net->sctp.auth_enable)
+		if (!ep->auth_enable)
 			goto fallthrough;
 
 		hmacs = (struct sctp_hmac_algo_param *)param.p;
@@ -2220,10 +2222,9 @@ fallthrough:
 }
 
 /* Verify the INIT packet before we process it.  */
-int sctp_verify_init(struct net *net, const struct sctp_association *asoc,
-		     sctp_cid_t cid,
-		     sctp_init_chunk_t *peer_init,
-		     struct sctp_chunk *chunk,
+int sctp_verify_init(struct net *net, const struct sctp_endpoint *ep,
+		     const struct sctp_association *asoc, sctp_cid_t cid,
+		     sctp_init_chunk_t *peer_init, struct sctp_chunk *chunk,
 		     struct sctp_chunk **errp)
 {
 	union sctp_params param;
@@ -2264,8 +2265,8 @@ int sctp_verify_init(struct net *net, co
 
 	/* Verify all the variable length parameters */
 	sctp_walk_params(param, peer_init, init_hdr.params) {
-
-		result = sctp_verify_param(net, asoc, param, cid, chunk, errp);
+		result = sctp_verify_param(net, ep, asoc, param, cid,
+					   chunk, errp);
 		switch (result) {
 		case SCTP_IERROR_ABORT:
 		case SCTP_IERROR_NOMEM:
@@ -2497,6 +2498,7 @@ static int sctp_process_param(struct sct
 	struct sctp_af *af;
 	union sctp_addr_param *addr_param;
 	struct sctp_transport *t;
+	struct sctp_endpoint *ep = asoc->ep;
 
 	/* We maintain all INIT parameters in network byte order all the
 	 * time.  This allows us to not worry about whether the parameters
@@ -2636,7 +2638,7 @@ do_addr_param:
 		goto fall_through;
 
 	case SCTP_PARAM_RANDOM:
-		if (!net->sctp.auth_enable)
+		if (!ep->auth_enable)
 			goto fall_through;
 
 		/* Save peer's random parameter */
@@ -2649,7 +2651,7 @@ do_addr_param:
 		break;
 
 	case SCTP_PARAM_HMAC_ALGO:
-		if (!net->sctp.auth_enable)
+		if (!ep->auth_enable)
 			goto fall_through;
 
 		/* Save peer's HMAC list */
@@ -2665,7 +2667,7 @@ do_addr_param:
 		break;
 
 	case SCTP_PARAM_CHUNKS:
-		if (!net->sctp.auth_enable)
+		if (!ep->auth_enable)
 			goto fall_through;
 
 		asoc->peer.peer_chunks = kmemdup(param.p,
--- a/net/sctp/sm_statefuns.c
+++ b/net/sctp/sm_statefuns.c
@@ -357,7 +357,7 @@ sctp_disposition_t sctp_sf_do_5_1B_init(
 
 	/* Verify the INIT chunk before processing it. */
 	err_chunk = NULL;
-	if (!sctp_verify_init(net, asoc, chunk->chunk_hdr->type,
+	if (!sctp_verify_init(net, ep, asoc, chunk->chunk_hdr->type,
 			      (sctp_init_chunk_t *)chunk->chunk_hdr, chunk,
 			      &err_chunk)) {
 		/* This chunk contains fatal error. It is to be discarded.
@@ -524,7 +524,7 @@ sctp_disposition_t sctp_sf_do_5_1C_ack(s
 
 	/* Verify the INIT chunk before processing it. */
 	err_chunk = NULL;
-	if (!sctp_verify_init(net, asoc, chunk->chunk_hdr->type,
+	if (!sctp_verify_init(net, ep, asoc, chunk->chunk_hdr->type,
 			      (sctp_init_chunk_t *)chunk->chunk_hdr, chunk,
 			      &err_chunk)) {
 
@@ -1430,7 +1430,7 @@ static sctp_disposition_t sctp_sf_do_une
 
 	/* Verify the INIT chunk before processing it. */
 	err_chunk = NULL;
-	if (!sctp_verify_init(net, asoc, chunk->chunk_hdr->type,
+	if (!sctp_verify_init(net, ep, asoc, chunk->chunk_hdr->type,
 			      (sctp_init_chunk_t *)chunk->chunk_hdr, chunk,
 			      &err_chunk)) {
 		/* This chunk contains fatal error. It is to be discarded.
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -3321,10 +3321,10 @@ static int sctp_setsockopt_auth_chunk(st
 				      char __user *optval,
 				      unsigned int optlen)
 {
-	struct net *net = sock_net(sk);
+	struct sctp_endpoint *ep = sctp_sk(sk)->ep;
 	struct sctp_authchunk val;
 
-	if (!net->sctp.auth_enable)
+	if (!ep->auth_enable)
 		return -EACCES;
 
 	if (optlen != sizeof(struct sctp_authchunk))
@@ -3341,7 +3341,7 @@ static int sctp_setsockopt_auth_chunk(st
 	}
 
 	/* add this chunk id to the endpoint */
-	return sctp_auth_ep_add_chunkid(sctp_sk(sk)->ep, val.sauth_chunk);
+	return sctp_auth_ep_add_chunkid(ep, val.sauth_chunk);
 }
 
 /*
@@ -3354,12 +3354,12 @@ static int sctp_setsockopt_hmac_ident(st
 				      char __user *optval,
 				      unsigned int optlen)
 {
-	struct net *net = sock_net(sk);
+	struct sctp_endpoint *ep = sctp_sk(sk)->ep;
 	struct sctp_hmacalgo *hmacs;
 	u32 idents;
 	int err;
 
-	if (!net->sctp.auth_enable)
+	if (!ep->auth_enable)
 		return -EACCES;
 
 	if (optlen < sizeof(struct sctp_hmacalgo))
@@ -3376,7 +3376,7 @@ static int sctp_setsockopt_hmac_ident(st
 		goto out;
 	}
 
-	err = sctp_auth_ep_set_hmacs(sctp_sk(sk)->ep, hmacs);
+	err = sctp_auth_ep_set_hmacs(ep, hmacs);
 out:
 	kfree(hmacs);
 	return err;
@@ -3392,12 +3392,12 @@ static int sctp_setsockopt_auth_key(stru
 				    char __user *optval,
 				    unsigned int optlen)
 {
-	struct net *net = sock_net(sk);
+	struct sctp_endpoint *ep = sctp_sk(sk)->ep;
 	struct sctp_authkey *authkey;
 	struct sctp_association *asoc;
 	int ret;
 
-	if (!net->sctp.auth_enable)
+	if (!ep->auth_enable)
 		return -EACCES;
 
 	if (optlen <= sizeof(struct sctp_authkey))
@@ -3418,7 +3418,7 @@ static int sctp_setsockopt_auth_key(stru
 		goto out;
 	}
 
-	ret = sctp_auth_set_key(sctp_sk(sk)->ep, asoc, authkey);
+	ret = sctp_auth_set_key(ep, asoc, authkey);
 out:
 	kzfree(authkey);
 	return ret;
@@ -3434,11 +3434,11 @@ static int sctp_setsockopt_active_key(st
 				      char __user *optval,
 				      unsigned int optlen)
 {
-	struct net *net = sock_net(sk);
+	struct sctp_endpoint *ep = sctp_sk(sk)->ep;
 	struct sctp_authkeyid val;
 	struct sctp_association *asoc;
 
-	if (!net->sctp.auth_enable)
+	if (!ep->auth_enable)
 		return -EACCES;
 
 	if (optlen != sizeof(struct sctp_authkeyid))
@@ -3450,8 +3450,7 @@ static int sctp_setsockopt_active_key(st
 	if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP))
 		return -EINVAL;
 
-	return sctp_auth_set_active_key(sctp_sk(sk)->ep, asoc,
-					val.scact_keynumber);
+	return sctp_auth_set_active_key(ep, asoc, val.scact_keynumber);
 }
 
 /*
@@ -3463,11 +3462,11 @@ static int sctp_setsockopt_del_key(struc
 				   char __user *optval,
 				   unsigned int optlen)
 {
-	struct net *net = sock_net(sk);
+	struct sctp_endpoint *ep = sctp_sk(sk)->ep;
 	struct sctp_authkeyid val;
 	struct sctp_association *asoc;
 
-	if (!net->sctp.auth_enable)
+	if (!ep->auth_enable)
 		return -EACCES;
 
 	if (optlen != sizeof(struct sctp_authkeyid))
@@ -3479,8 +3478,7 @@ static int sctp_setsockopt_del_key(struc
 	if (!asoc && val.scact_assoc_id && sctp_style(sk, UDP))
 		return -EINVAL;
 
-	return sctp_auth_del_key_id(sctp_sk(sk)->ep, asoc,
-				    val.scact_keynumber);
+	return sctp_auth_del_key_id(ep, asoc, val.scact_keynumber);
 
 }
 
@@ -5387,16 +5385,16 @@ static int sctp_getsockopt_maxburst(stru
 static int sctp_getsockopt_hmac_ident(struct sock *sk, int len,
 				    char __user *optval, int __user *optlen)
 {
-	struct net *net = sock_net(sk);
+	struct sctp_endpoint *ep = sctp_sk(sk)->ep;
 	struct sctp_hmacalgo  __user *p = (void __user *)optval;
 	struct sctp_hmac_algo_param *hmacs;
 	__u16 data_len = 0;
 	u32 num_idents;
 
-	if (!net->sctp.auth_enable)
+	if (!ep->auth_enable)
 		return -EACCES;
 
-	hmacs = sctp_sk(sk)->ep->auth_hmacs_list;
+	hmacs = ep->auth_hmacs_list;
 	data_len = ntohs(hmacs->param_hdr.length) - sizeof(sctp_paramhdr_t);
 
 	if (len < sizeof(struct sctp_hmacalgo) + data_len)
@@ -5417,11 +5415,11 @@ static int sctp_getsockopt_hmac_ident(st
 static int sctp_getsockopt_active_key(struct sock *sk, int len,
 				    char __user *optval, int __user *optlen)
 {
-	struct net *net = sock_net(sk);
+	struct sctp_endpoint *ep = sctp_sk(sk)->ep;
 	struct sctp_authkeyid val;
 	struct sctp_association *asoc;
 
-	if (!net->sctp.auth_enable)
+	if (!ep->auth_enable)
 		return -EACCES;
 
 	if (len < sizeof(struct sctp_authkeyid))
@@ -5436,7 +5434,7 @@ static int sctp_getsockopt_active_key(st
 	if (asoc)
 		val.scact_keynumber = asoc->active_key_id;
 	else
-		val.scact_keynumber = sctp_sk(sk)->ep->active_key_id;
+		val.scact_keynumber = ep->active_key_id;
 
 	len = sizeof(struct sctp_authkeyid);
 	if (put_user(len, optlen))
@@ -5450,7 +5448,7 @@ static int sctp_getsockopt_active_key(st
 static int sctp_getsockopt_peer_auth_chunks(struct sock *sk, int len,
 				    char __user *optval, int __user *optlen)
 {
-	struct net *net = sock_net(sk);
+	struct sctp_endpoint *ep = sctp_sk(sk)->ep;
 	struct sctp_authchunks __user *p = (void __user *)optval;
 	struct sctp_authchunks val;
 	struct sctp_association *asoc;
@@ -5458,7 +5456,7 @@ static int sctp_getsockopt_peer_auth_chu
 	u32    num_chunks = 0;
 	char __user *to;
 
-	if (!net->sctp.auth_enable)
+	if (!ep->auth_enable)
 		return -EACCES;
 
 	if (len < sizeof(struct sctp_authchunks))
@@ -5495,7 +5493,7 @@ num:
 static int sctp_getsockopt_local_auth_chunks(struct sock *sk, int len,
 				    char __user *optval, int __user *optlen)
 {
-	struct net *net = sock_net(sk);
+	struct sctp_endpoint *ep = sctp_sk(sk)->ep;
 	struct sctp_authchunks __user *p = (void __user *)optval;
 	struct sctp_authchunks val;
 	struct sctp_association *asoc;
@@ -5503,7 +5501,7 @@ static int sctp_getsockopt_local_auth_ch
 	u32    num_chunks = 0;
 	char __user *to;
 
-	if (!net->sctp.auth_enable)
+	if (!ep->auth_enable)
 		return -EACCES;
 
 	if (len < sizeof(struct sctp_authchunks))
@@ -5520,7 +5518,7 @@ static int sctp_getsockopt_local_auth_ch
 	if (asoc)
 		ch = (struct sctp_chunks_param *)asoc->c.auth_chunks;
 	else
-		ch = sctp_sk(sk)->ep->auth_chunk_list;
+		ch = ep->auth_chunk_list;
 
 	if (!ch)
 		goto num;
--- a/net/sctp/sysctl.c
+++ b/net/sctp/sysctl.c
@@ -64,6 +64,9 @@ static int proc_sctp_do_rto_min(struct c
 static int proc_sctp_do_rto_max(struct ctl_table *ctl, int write,
 				void __user *buffer, size_t *lenp,
 				loff_t *ppos);
+static int proc_sctp_do_auth(struct ctl_table *ctl, int write,
+			     void __user *buffer, size_t *lenp,
+			     loff_t *ppos);
 
 static struct ctl_table sctp_table[] = {
 	{
@@ -266,7 +269,7 @@ static struct ctl_table sctp_net_table[]
 		.data		= &init_net.sctp.auth_enable,
 		.maxlen		= sizeof(int),
 		.mode		= 0644,
-		.proc_handler	= proc_dointvec,
+		.proc_handler	= proc_sctp_do_auth,
 	},
 	{
 		.procname	= "addr_scope_policy",
@@ -400,6 +403,37 @@ static int proc_sctp_do_rto_max(struct c
 	return ret;
 }
 
+static int proc_sctp_do_auth(struct ctl_table *ctl, int write,
+			     void __user *buffer, size_t *lenp,
+			     loff_t *ppos)
+{
+	struct net *net = current->nsproxy->net_ns;
+	struct ctl_table tbl;
+	int new_value, ret;
+
+	memset(&tbl, 0, sizeof(struct ctl_table));
+	tbl.maxlen = sizeof(unsigned int);
+
+	if (write)
+		tbl.data = &new_value;
+	else
+		tbl.data = &net->sctp.auth_enable;
+
+	ret = proc_dointvec(&tbl, write, buffer, lenp, ppos);
+
+	if (write) {
+		struct sock *sk = net->sctp.ctl_sock;
+
+		net->sctp.auth_enable = new_value;
+		/* Update the value in the control socket */
+		lock_sock(sk);
+		sctp_sk(sk)->ep->auth_enable = new_value;
+		release_sock(sk);
+	}
+
+	return ret;
+}
+
 int sctp_sysctl_net_register(struct net *net)
 {
 	struct ctl_table *table = sctp_net_table;



  parent reply	other threads:[~2014-05-29  4:33 UTC|newest]

Thread overview: 151+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-05-29  4:32 [PATCH 3.14 000/140] 3.14.5-stable review Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 001/140] scsi: fix our current target reap infrastructure Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 002/140] SCSI: dual scan thread bug fix Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 003/140] SCSI: megaraid: missing bounds check in mimd_to_kioc() Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 004/140] KVM: x86: remove WARN_ON from get_kernel_ns() Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 005/140] tools lib traceevent: Fix memory leak in pretty_print() Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 006/140] pid: get pid_t ppid of task in init_pid_ns Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 007/140] audit: convert PPIDs to the inital PID namespace Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 008/140] netfilter: nf_tables: fix nft_cmp_fast failure on big endian for size < 4 Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 009/140] netfilter: nf_conntrack: reserve two bytes for nf_ct_ext->len Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 010/140] blktrace: fix accounting of partially completed requests Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 011/140] netfilter: Cant fail and free after table replacement Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 012/140] netfilter: nf_tables: set names cannot be larger than 15 bytes Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 013/140] x86,preempt: Fix preemption for i386 Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 014/140] tracepoint: Do not waste memory on mods with no tracepoints Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 015/140] rbd: fix error paths in rbd_img_request_fill() Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 016/140] [PATCH for stable 3.14 only 1/1] drm/i915: restore QUIRK_NO_PCH_PWM_ENABLE Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 017/140] tick-common: Fix wrong check in tick_check_replacement() Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 018/140] tick-sched: Dont call update_wall_time() when delta is lesser than tick_period Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 019/140] tick-sched: Check tick_nohz_enabled in tick_nohz_switch_to_nohz() Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 020/140] parisc: change value of SHMLBA from 0x00400000 to PAGE_SIZE Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 021/140] parisc: fix epoll_pwait syscall on compat kernel Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 022/140] parisc: remove _STK_LIM_MAX override Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 023/140] dont bother with {get,put}_write_access() on non-regular files Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 024/140] cifs: Wait for writebacks to complete before attempting write Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 025/140] xen/spinlock: Dont enable them unconditionally Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 026/140] xen/events/fifo: correctly align bitops Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 027/140] Revert "HID: microsoft: Add IDs for Surface Type/Touch Cover 2" Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 028/140] HID: core: do not scan constant input report Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 029/140] HID: add NO_INIT_REPORTS quirk for Synaptics Touch Pad V 103S Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 030/140] md/raid1: r1buf_pool_alloc: free allocate pages when subsequent allocation fails Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 031/140] tracing/uprobes: Fix uprobe_cpu_buffer memory leak Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 032/140] tracing: Use rcu_dereference_sched() for trace event triggers Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 033/140] init/Kconfig: move the trusted keyring config option to general setup Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 034/140] thp: close race between split and zap huge pages Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 035/140] mm/hugetlb.c: add cond_resched_lock() in return_unused_surplus_pages() Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 036/140] mm: use paravirt friendly ops for NUMA hinting ptes Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 037/140] USB: cdc-acm: Remove Motorola/Telit H24 serial interfaces from ACM driver Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 038/140] USB: cp210x: Add 8281 (Nanotec Plug & Drive) Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 039/140] USB: usb_wwan: fix handling of missing bulk endpoints Greg Kroah-Hartman
2014-05-29  4:32 ` [PATCH 3.14 040/140] USB: serial: ftdi_sio: add id for Brainboxes serial cards Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 041/140] usb: option driver, add support for Telit UE910v2 Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 042/140] Revert "USB: serial: add usbid for dell wwan card to sierra.c" Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 043/140] USB: serial: fix sysfs-attribute removal deadlock Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 044/140] USB: io_ti: fix firmware download on big-endian machines Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 045/140] usb: qcserial: add Sierra Wireless EM7355 Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 046/140] usb: qcserial: add Sierra Wireless MC73xx Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 047/140] usb: qcserial: add Sierra Wireless MC7305/MC7355 Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 048/140] usb: option: add Olivetti Olicard 500 Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 049/140] usb: option: add Alcatel L800MA Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 050/140] usb: option: add and update a number of CMOTech devices Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 051/140] serial: omap: Fix missing pm_runtime_resume handling by simplifying code Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 052/140] mlx4_en: dont use napi_synchronize inside mlx4_en_netpoll Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 053/140] fs: Dont return 0 from get_anon_bdev Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 054/140] wl18xx: align event mailbox with current fw Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 055/140] drm/vmwgfx: correct fb_fix_screeninfo.line_length Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 056/140] drm/vmwgfx: Fix query buffer locking order violation Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 057/140] drm/vmwgfx: Make sure user-space cant DMA across buffer object boundaries v2 Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 058/140] drm/qxl: unset a pointer in sync_obj_unref Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 059/140] drm/radeon: clear needs_reset flag if IB test fails Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 060/140] drm/radeon: call drm_edid_to_eld when we update the edid Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 061/140] drm/radeon: fix endian swap on hawaii clear state buffer setup Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 062/140] drm/radeon: fix typo in spectre_golden_registers Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 063/140] drm/i915/tv: fix gen4 composite s-video tv-out Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 064/140] drm/i915: Do not dereference pointers from ring buffer in evict event Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 065/140] net: sctp: wake up all assocs if sndbuf policy is per socket Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 066/140] net: sctp: test if association is dead in sctp_wake_up_waiters Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 067/140] l2tp: take PMTU from tunnel UDP socket Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 068/140] net: core: dont account for udp header size when computing seglen Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 069/140] bonding: Remove debug_fs files when module init fails Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 070/140] bridge: Fix double free and memory leak around br_allowed_ingress Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 071/140] ipv6: Limit mtu to 65575 bytes Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 072/140] gre: dont allow to add the same tunnel twice Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 073/140] vti: " Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 074/140] net: ipv4: current group_info should be put after using Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 075/140] ipv4: return valid RTA_IIF on ip route get Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 076/140] filter: prevent nla extensions to peek beyond the end of the message Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 077/140] Revert "net: sctp: Fix a_rwnd/rwnd management to reflect real state of the receivers buffer" Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 078/140] net: Start with correct mac_len in skb_network_protocol Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 079/140] ip6_gre: dont allow to remove the fb_tunnel_dev Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 080/140] vlan: Fix lockdep warning when vlan dev handle notification Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 081/140] net: Find the nesting level of a given device by type Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 082/140] net: Allow for more then a single subclass for netif_addr_lock Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 083/140] vlan: Fix lockdep warning with stacked vlan devices Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 084/140] macvlan: Fix lockdep warnings with stacked macvlan devices Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 085/140] tg3: update rx_jumbo_pending ring param only when jumbo frames are enabled Greg Kroah-Hartman
2014-05-29  4:33 ` Greg Kroah-Hartman [this message]
2014-05-29  4:33 ` [PATCH 3.14 087/140] net: Fix ns_capable check in sock_diag_put_filterinfo Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 088/140] rtnetlink: Warn when interfaces information wont fit in our packet Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 089/140] rtnetlink: Only supply IFLA_VF_PORTS information when RTEXT_FILTER_VF is set Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 090/140] ipv6: fib: fix fib dump restart Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 091/140] bridge: Handle IFLA_ADDRESS correctly when creating bridge device Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 092/140] sctp: reset flowi4_oif parameter on route lookup Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 093/140] net: qmi_wwan: add Sierra Wireless EM7355 Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 094/140] net: qmi_wwan: add Sierra Wireless MC73xx Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 095/140] net: qmi_wwan: add Sierra Wireless MC7305/MC7355 Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 096/140] net: qmi_wwan: add Olivetti Olicard 500 Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 097/140] net: qmi_wwan: add Alcatel L800MA Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 098/140] net: qmi_wwan: add a number of CMOTech devices Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 099/140] net: qmi_wwan: add a number of Dell devices Greg Kroah-Hartman
2014-05-29  4:33 ` [PATCH 3.14 100/140] slip: fix spinlock variant Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 101/140] net: sctp: Dont transition to PF state when transport has exhausted Path.Max.Retrans Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 102/140] mactap: Fix checksum errors for non-gso packets in bridge mode Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 103/140] Revert "macvlan : fix checksums error when we are in bridge mode" Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 104/140] tcp_cubic: fix the range of delayed_ack Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 105/140] net: sched: lock imbalance in hhf qdisc Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 106/140] vsock: Make transport the proto owner Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 107/140] net: cdc_ncm: fix buffer overflow Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 108/140] net/mlx4_core: Dont issue PCIe speed/width checks for VFs Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 109/140] ip_tunnel: Set network header properly for IP_ECN_decapsulate() Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 110/140] ipv4: ip_tunnels: disable cache for nbma gre tunnels Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 111/140] net: cdc_mbim: __vlan_find_dev_deep need rcu_read_lock Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 112/140] net: ipv4: ip_forward: fix inverted local_df test Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 113/140] net: ipv6: send pkttoobig immediately if orig frag size > mtu Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 114/140] ipv4: fib_semantics: increment fib_info_cnt after fib_info allocation Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 115/140] net: cdc_mbim: handle unaccelerated VLAN tagged frames Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 116/140] macvlan: Dont propagate IFF_ALLMULTI changes on down interfaces Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 117/140] sfc: fix calling of free_irq with already free vector Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 118/140] ip6_tunnel: fix potential NULL pointer dereference Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 119/140] neigh: set nud_state to NUD_INCOMPLETE when probing router reachability Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 120/140] batman-adv: fix neigh_ifinfo imbalance Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 121/140] batman-adv: fix neigh reference imbalance Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 122/140] batman-adv: always run purge_orig_neighbors Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 123/140] batman-adv: fix removing neigh_ifinfo Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 124/140] net: filter: x86: fix JIT address randomization Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 125/140] net: filter: s390: " Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 126/140] net: avoid dependency of net_get_random_once on nop patching Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 127/140] ipv6: fix calculation of option len in ip6_append_data Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 128/140] rtnetlink: wait for unregistering devices in rtnl_link_unregister() Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 129/140] net: phy: Dont call phy_resume if phy_init_hw failed Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 130/140] bonding: fix out of range parameters for bond_intmax_tbl Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 131/140] net: gro: make sure skb->cb[] initial content has not to be zero Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 132/140] batman-adv: fix indirect hard_iface NULL dereference Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 133/140] batman-adv: fix reference counting imbalance while sending fragment Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 134/140] batman-adv: increase orig refcount when storing ref in gw_node Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 135/140] batman-adv: fix local TT check for outgoing arp requests in DAT Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 136/140] ip_tunnel: Initialize the fallback device properly Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 137/140] net_sched: fix an oops in tcindex filter Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 138/140] ipv6: gro: fix CHECKSUM_COMPLETE support Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 139/140] ipv4: initialise the itag variable in __mkroute_input Greg Kroah-Hartman
2014-05-29  4:34 ` [PATCH 3.14 140/140] net-gro: reset skb->truesize in napi_reuse_skb() Greg Kroah-Hartman
2014-05-29  5:59 ` [PATCH 3.14 000/140] 3.14.5-stable review NeilBrown
2014-05-29 14:18   ` Greg Kroah-Hartman
2014-05-30 19:43     ` Shuah Khan
2014-05-30 23:14       ` Greg Kroah-Hartman
2014-05-29 15:06 ` Guenter Roeck
2014-05-29 18:21   ` Greg Kroah-Hartman
2014-05-29 21:07     ` Guenter Roeck
2014-05-29 21:27       ` Linus Torvalds
2014-05-30 17:14         ` Guenter Roeck
     [not found] ` <pan.2014.05.29.08.07.55@googlemail.com>
2014-05-29 18:21   ` Greg KH

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=20140529043100.674671334@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=davem@davemloft.net \
    --cc=dborkman@redhat.com \
    --cc=kumba@gentoo.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nhorman@tuxdriver.com \
    --cc=stable@vger.kernel.org \
    --cc=vyasevic@redhat.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).