OSDN Git Service

Merge branch 'sctp-clean-up-sctp_sendmsg'
authorDavid S. Miller <davem@davemloft.net>
Sun, 4 Mar 2018 18:00:58 +0000 (13:00 -0500)
committerDavid S. Miller <davem@davemloft.net>
Sun, 4 Mar 2018 18:00:58 +0000 (13:00 -0500)
commite871cae7927ba5d86508066a5f4bec0ea1d7eb95
tree7d239d32bbbc7dc99f06dd50f72ee67124536a08
parente4e31cf07d0ca0722530681a491023ade5571a28
parent0a3920d28b5490e6c90110156135dbc12c7fc413
Merge branch 'sctp-clean-up-sctp_sendmsg'

Xin Long says:

====================
sctp: clean up sctp_sendmsg

This cleanup mostly does three things:

 - extract some codes into functions to make sendmsg more readable.

 - tidy up some codes to avoid the unnecessary checks.

 - adjust some logic so that it will be easier to add the send flags
   and cmsgs features that I will post after this.

To make it easy to review and to check if the code is compatible with
before, this patchset is to do it step by step in 9 patches.

NOTE:
There will be a conflict when merging
Commit 2277c7cd75e3 ("sctp: Add LSM hooks") from selinux tree,
the solution is to:

1. remove all the lines in [B]:

    <<<<<<< HEAD
    [A]
    =======
    [B]
    >>>>>>> 2277c7c... sctp: Add LSM hooks

2. and apply the following diff-output:

diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index 980621e..d6803c8 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -1686,6 +1686,7 @@ static int sctp_sendmsg_new_asoc(struct sock *sk, __u16 sflags,
  struct net *net = sock_net(sk);
  struct sctp_association *asoc;
  enum sctp_scope scope;
+ struct sctp_af *af;
  int err = -EINVAL;

  *tp = NULL;
@@ -1711,6 +1712,22 @@ static int sctp_sendmsg_new_asoc(struct sock *sk, __u16 sflags,

  scope = sctp_scope(daddr);

+ /* Label connection socket for first association 1-to-many
+  * style for client sequence socket()->sendmsg(). This
+  * needs to be done before sctp_assoc_add_peer() as that will
+  * set up the initial packet that needs to account for any
+  * security ip options (CIPSO/CALIPSO) added to the packet.
+  */
+ af = sctp_get_af_specific(daddr->sa.sa_family);
+ if (!af)
+ return -EINVAL;
+
+ err = security_sctp_bind_connect(sk, SCTP_SENDMSG_CONNECT,
+  (struct sockaddr *)daddr,
+  af->sockaddr_len);
+ if (err < 0)
+ return err;
+
  asoc = sctp_association_new(ep, sk, scope, GFP_KERNEL);
  if (!asoc)
  return -ENOMEM;
====================

Acked-by: Neil Horman <nhorman@tuxdriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>