linux-sctp.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v3 net-next 1/8] sctp: setsockopt, rename some locals.
@ 2020-05-26 16:39 David Laight
  2020-05-26 16:40 ` [PATCH v3 net-next 1/8] sctp: setsockopt, expand some #defines David Laight
  0 siblings, 1 reply; 5+ messages in thread
From: David Laight @ 2020-05-26 16:39 UTC (permalink / raw)
  To: 'Vlad Yasevich', 'Neil Horman',
	'David S. Miller', 'Jakub Kicinski',
	'linux-sctp@vger.kernel.org',
	'netdev@vger.kernel.org', 'Christoph Hellwig',
	'Marcelo Ricardo Leitner'

Rename locals to avoid clash with structure fields in next patch.

Signed-off-by: David Laight <david.laight@aculab.com>

---
 net/sctp/socket.c | 46 +++++++++++++++++++++++-----------------------
 1 file changed, 23 insertions(+), 23 deletions(-)

diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index 1b56fc4..c1c8215 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -3088,7 +3088,7 @@ static int sctp_setsockopt_nodelay(struct sock *sk, char __user *optval,
  */
 static int sctp_setsockopt_rtoinfo(struct sock *sk, char __user *optval, unsigned int optlen)
 {
-	struct sctp_rtoinfo rtoinfo;
+	struct sctp_rtoinfo params;
 	struct sctp_association *asoc;
 	unsigned long rto_min, rto_max;
 	struct sctp_sock *sp = sctp_sk(sk);
@@ -3096,18 +3096,18 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk, char __user *optval, unsigne
 	if (optlen != sizeof (struct sctp_rtoinfo))
 		return -EINVAL;
 
-	if (copy_from_user(&rtoinfo, optval, optlen))
+	if (copy_from_user(&params, optval, optlen))
 		return -EFAULT;
 
-	asoc = sctp_id2assoc(sk, rtoinfo.srto_assoc_id);
+	asoc = sctp_id2assoc(sk, params.srto_assoc_id);
 
 	/* Set the values to the specific association */
-	if (!asoc && rtoinfo.srto_assoc_id != SCTP_FUTURE_ASSOC &&
+	if (!asoc && params.srto_assoc_id != SCTP_FUTURE_ASSOC &&
 	    sctp_style(sk, UDP))
 		return -EINVAL;
 
-	rto_max = rtoinfo.srto_max;
-	rto_min = rtoinfo.srto_min;
+	rto_max = params.srto_max;
+	rto_min = params.srto_min;
 
 	if (rto_max)
 		rto_max = asoc ? msecs_to_jiffies(rto_max) : rto_max;
@@ -3123,17 +3123,17 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk, char __user *optval, unsigne
 		return -EINVAL;
 
 	if (asoc) {
-		if (rtoinfo.srto_initial != 0)
+		if (params.srto_initial != 0)
 			asoc->rto_initial -				msecs_to_jiffies(rtoinfo.srto_initial);
+				msecs_to_jiffies(params.srto_initial);
 		asoc->rto_max = rto_max;
 		asoc->rto_min = rto_min;
 	} else {
 		/* If there is no association or the association-id = 0
 		 * set the values to the endpoint.
 		 */
-		if (rtoinfo.srto_initial != 0)
-			sp->rtoinfo.srto_initial = rtoinfo.srto_initial;
+		if (params.srto_initial != 0)
+			sp->rtoinfo.srto_initial = params.srto_initial;
 		sp->rtoinfo.srto_max = rto_max;
 		sp->rtoinfo.srto_min = rto_min;
 	}
@@ -3155,23 +3155,23 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk, char __user *optval, unsigne
 static int sctp_setsockopt_associnfo(struct sock *sk, char __user *optval, unsigned int optlen)
 {
 
-	struct sctp_assocparams assocparams;
+	struct sctp_assocparams params;
 	struct sctp_association *asoc;
 
 	if (optlen != sizeof(struct sctp_assocparams))
 		return -EINVAL;
-	if (copy_from_user(&assocparams, optval, optlen))
+	if (copy_from_user(&params, optval, optlen))
 		return -EFAULT;
 
-	asoc = sctp_id2assoc(sk, assocparams.sasoc_assoc_id);
+	asoc = sctp_id2assoc(sk, params.sasoc_assoc_id);
 
-	if (!asoc && assocparams.sasoc_assoc_id != SCTP_FUTURE_ASSOC &&
+	if (!asoc && params.sasoc_assoc_id != SCTP_FUTURE_ASSOC &&
 	    sctp_style(sk, UDP))
 		return -EINVAL;
 
 	/* Set the values to the specific association */
 	if (asoc) {
-		if (assocparams.sasoc_asocmaxrxt != 0) {
+		if (params.sasoc_asocmaxrxt != 0) {
 			__u32 path_sum = 0;
 			int   paths = 0;
 			struct sctp_transport *peer_addr;
@@ -3188,24 +3188,24 @@ static int sctp_setsockopt_associnfo(struct sock *sk, char __user *optval, unsig
 			 * then one path.
 			 */
 			if (paths > 1 &&
-			    assocparams.sasoc_asocmaxrxt > path_sum)
+			    params.sasoc_asocmaxrxt > path_sum)
 				return -EINVAL;
 
-			asoc->max_retrans = assocparams.sasoc_asocmaxrxt;
+			asoc->max_retrans = params.sasoc_asocmaxrxt;
 		}
 
-		if (assocparams.sasoc_cookie_life != 0)
-			asoc->cookie_life = ms_to_ktime(assocparams.sasoc_cookie_life);
+		if (params.sasoc_cookie_life != 0)
+			asoc->cookie_life = ms_to_ktime(params.sasoc_cookie_life);
 	} else {
 		/* Set the values to the endpoint */
 		struct sctp_sock *sp = sctp_sk(sk);
 
-		if (assocparams.sasoc_asocmaxrxt != 0)
+		if (params.sasoc_asocmaxrxt != 0)
 			sp->assocparams.sasoc_asocmaxrxt -						assocparams.sasoc_asocmaxrxt;
-		if (assocparams.sasoc_cookie_life != 0)
+						params.sasoc_asocmaxrxt;
+		if (params.sasoc_cookie_life != 0)
 			sp->assocparams.sasoc_cookie_life -						assocparams.sasoc_cookie_life;
+						params.sasoc_cookie_life;
 	}
 	return 0;
 }
-- 
1.8.1.2

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v3 net-next 1/8] sctp: setsockopt, expand some #defines
  2020-05-26 16:39 [PATCH v3 net-next 1/8] sctp: setsockopt, rename some locals David Laight
@ 2020-05-26 16:40 ` David Laight
  2020-05-26 16:44   ` David Laight
  0 siblings, 1 reply; 5+ messages in thread
From: David Laight @ 2020-05-26 16:40 UTC (permalink / raw)
  To: 'Vlad Yasevich', 'Neil Horman',
	'David S. Miller', 'Jakub Kicinski',
	'linux-sctp@vger.kernel.org',
	'netdev@vger.kernel.org', 'Christoph Hellwig',
	'Marcelo Ricardo Leitner'

Expand the #define foo (*foo) used to simplify the previous patch.
Doesn't change the generated code.

Signed-off-by: David Laight <david.laight@aculab.com>

---
 net/sctp/socket.c | 687 ++++++++++++++++++++++++++----------------------------
 1 file changed, 331 insertions(+), 356 deletions(-)

diff --git a/net/sctp/socket.c b/net/sctp/socket.c
index 639d7da..b8068da 100644
--- a/net/sctp/socket.c
+++ b/net/sctp/socket.c
@@ -2585,9 +2585,8 @@ static int sctp_apply_peer_addr_params(struct sctp_paddrparams *params,
 	return 0;
 }
 
-#define params (*params)
 static int sctp_setsockopt_peer_addr_params(struct sock *sk,
-					    struct sctp_paddrparams params,
+					    struct sctp_paddrparams *params,
 					    unsigned int optlen)
 {
 	struct sctp_transport   *trans = NULL;
@@ -2596,33 +2595,33 @@ static int sctp_setsockopt_peer_addr_params(struct sock *sk,
 	int error;
 	int hb_change, pmtud_change, sackdelay_change;
 
-	if (optlen != sizeof(params)) {
+	if (optlen != sizeof(*params)) {
 		if (optlen != ALIGN(offsetof(struct sctp_paddrparams,
 						    spp_ipv6_flowlabel), 4))
 			return -EINVAL;
-		if (params.spp_flags & (SPP_DSCP | SPP_IPV6_FLOWLABEL))
+		if (params->spp_flags & (SPP_DSCP | SPP_IPV6_FLOWLABEL))
 			return -EINVAL;
 	}
 
 	/* Validate flags and value parameters. */
-	hb_change        = params.spp_flags & SPP_HB;
-	pmtud_change     = params.spp_flags & SPP_PMTUD;
-	sackdelay_change = params.spp_flags & SPP_SACKDELAY;
+	hb_change        = params->spp_flags & SPP_HB;
+	pmtud_change     = params->spp_flags & SPP_PMTUD;
+	sackdelay_change = params->spp_flags & SPP_SACKDELAY;
 
 	if (hb_change        = SPP_HB ||
 	    pmtud_change     = SPP_PMTUD ||
 	    sackdelay_change = SPP_SACKDELAY ||
-	    params.spp_sackdelay > 500 ||
-	    (params.spp_pathmtu &&
-	     params.spp_pathmtu < SCTP_DEFAULT_MINSEGMENT))
+	    params->spp_sackdelay > 500 ||
+	    (params->spp_pathmtu &&
+	     params->spp_pathmtu < SCTP_DEFAULT_MINSEGMENT))
 		return -EINVAL;
 
 	/* If an address other than INADDR_ANY is specified, and
 	 * no transport is found, then the request is invalid.
 	 */
-	if (!sctp_is_any(sk, (union sctp_addr *)&params.spp_address)) {
-		trans = sctp_addr_id2transport(sk, &params.spp_address,
-					       params.spp_assoc_id);
+	if (!sctp_is_any(sk, (union sctp_addr *)&params->spp_address)) {
+		trans = sctp_addr_id2transport(sk, &params->spp_address,
+					       params->spp_assoc_id);
 		if (!trans)
 			return -EINVAL;
 	}
@@ -2631,19 +2630,19 @@ static int sctp_setsockopt_peer_addr_params(struct sock *sk,
 	 * socket is a one to many style socket, and an association
 	 * was not found, then the id was invalid.
 	 */
-	asoc = sctp_id2assoc(sk, params.spp_assoc_id);
-	if (!asoc && params.spp_assoc_id != SCTP_FUTURE_ASSOC &&
+	asoc = sctp_id2assoc(sk, params->spp_assoc_id);
+	if (!asoc && params->spp_assoc_id != SCTP_FUTURE_ASSOC &&
 	    sctp_style(sk, UDP))
 		return -EINVAL;
 
 	/* Heartbeat demand can only be sent on a transport or
 	 * association, but not a socket.
 	 */
-	if (params.spp_flags & SPP_HB_DEMAND && !trans && !asoc)
+	if (params->spp_flags & SPP_HB_DEMAND && !trans && !asoc)
 		return -EINVAL;
 
 	/* Process parameters. */
-	error = sctp_apply_peer_addr_params(&params, trans, asoc, sp,
+	error = sctp_apply_peer_addr_params(params, trans, asoc, sp,
 					    hb_change, pmtud_change,
 					    sackdelay_change);
 
@@ -2656,7 +2655,7 @@ static int sctp_setsockopt_peer_addr_params(struct sock *sk,
 	if (!trans && asoc) {
 		list_for_each_entry(trans, &asoc->peer.transport_addr_list,
 				transports) {
-			sctp_apply_peer_addr_params(&params, trans, asoc, sp,
+			sctp_apply_peer_addr_params(params, trans, asoc, sp,
 						    hb_change, pmtud_change,
 						    sackdelay_change);
 		}
@@ -2664,7 +2663,6 @@ static int sctp_setsockopt_peer_addr_params(struct sock *sk,
 
 	return 0;
 }
-#undef params
 
 static inline __u32 sctp_spp_sackdelay_enable(__u32 param_flags)
 {
@@ -2749,16 +2747,15 @@ static void sctp_apply_asoc_delayed_ack(struct sctp_sack_info *params,
  *    value to 1 will disable the delayed sack algorithm.
  */
 
-#define params (*params)
 static int sctp_setsockopt_delayed_ack(struct sock *sk,
-				       struct sctp_sack_info params,
+				       struct sctp_sack_info *params,
 				       unsigned int optlen)
 {
 	struct sctp_sock *sp = sctp_sk(sk);
 	struct sctp_association *asoc;
 
 	if (optlen = sizeof(struct sctp_sack_info)) {
-		if (params.sack_delay = 0 && params.sack_freq = 0)
+		if (params->sack_delay = 0 && params->sack_freq = 0)
 			return 0;
 	} else if (optlen = sizeof(struct sctp_assoc_value)) {
 		pr_warn_ratelimited(DEPRECATED
@@ -2766,56 +2763,56 @@ static int sctp_setsockopt_delayed_ack(struct sock *sk,
 				    "Use of struct sctp_assoc_value in delayed_ack socket option.\n"
 				    "Use struct sctp_sack_info instead\n",
 				    current->comm, task_pid_nr(current));
-		if (params.sack_delay = 0)
-			params.sack_freq = 1;
+		if (params->sack_delay = 0)
+			params->sack_freq = 1;
 		else
-			params.sack_freq = 0;
+			params->sack_freq = 0;
 	} else
 		return -EINVAL;
 
 	/* Validate value parameter. */
-	if (params.sack_delay > 500)
+	if (params->sack_delay > 500)
 		return -EINVAL;
 
 	/* Get association, if sack_assoc_id != SCTP_FUTURE_ASSOC and the
 	 * socket is a one to many style socket, and an association
 	 * was not found, then the id was invalid.
 	 */
-	asoc = sctp_id2assoc(sk, params.sack_assoc_id);
-	if (!asoc && params.sack_assoc_id > SCTP_ALL_ASSOC &&
+	asoc = sctp_id2assoc(sk, params->sack_assoc_id);
+	if (!asoc && params->sack_assoc_id > SCTP_ALL_ASSOC &&
 	    sctp_style(sk, UDP))
 		return -EINVAL;
 
 	if (asoc) {
-		sctp_apply_asoc_delayed_ack(&params, asoc);
+		sctp_apply_asoc_delayed_ack(params, asoc);
 
 		return 0;
 	}
 
 	if (sctp_style(sk, TCP))
-		params.sack_assoc_id = SCTP_FUTURE_ASSOC;
+		params->sack_assoc_id = SCTP_FUTURE_ASSOC;
 
-	if (params.sack_assoc_id = SCTP_FUTURE_ASSOC ||
-	    params.sack_assoc_id = SCTP_ALL_ASSOC) {
-		if (params.sack_delay) {
-			sp->sackdelay = params.sack_delay;
+	if (params->sack_assoc_id = SCTP_FUTURE_ASSOC ||
+	    params->sack_assoc_id = SCTP_ALL_ASSOC) {
+		if (params->sack_delay) {
+			sp->sackdelay = params->sack_delay;
 			sp->param_flags  				sctp_spp_sackdelay_enable(sp->param_flags);
 		}
-		if (params.sack_freq = 1) {
+		if (params->sack_freq = 1) {
 			sp->param_flags  				sctp_spp_sackdelay_disable(sp->param_flags);
-		} else if (params.sack_freq > 1) {
-			sp->sackfreq = params.sack_freq;
+		} else if (params->sack_freq > 1) {
+			sp->sackfreq = params->sack_freq;
 			sp->param_flags  				sctp_spp_sackdelay_enable(sp->param_flags);
 		}
 	}
 
-	if (params.sack_assoc_id = SCTP_CURRENT_ASSOC ||
-	    params.sack_assoc_id = SCTP_ALL_ASSOC)
+	if (params->sack_assoc_id = SCTP_CURRENT_ASSOC ||
+	    params->sack_assoc_id = SCTP_ALL_ASSOC)
 		list_for_each_entry(asoc, &sp->ep->asocs, asocs)
-			sctp_apply_asoc_delayed_ack(&params, asoc);
+			sctp_apply_asoc_delayed_ack(params, asoc);
 
 	return 0;
 }
@@ -2831,8 +2828,7 @@ static int sctp_setsockopt_delayed_ack(struct sock *sk,
  * by the change).  With TCP-style sockets, this option is inherited by
  * sockets derived from a listener socket.
  */
-#define sinit (*sinit)
-static int sctp_setsockopt_initmsg(struct sock *sk, struct sctp_initmsg sinit,
+static int sctp_setsockopt_initmsg(struct sock *sk, struct sctp_initmsg *sinit,
 				   unsigned int optlen)
 {
 	struct sctp_sock *sp = sctp_sk(sk);
@@ -2840,18 +2836,17 @@ static int sctp_setsockopt_initmsg(struct sock *sk, struct sctp_initmsg sinit,
 	if (optlen != sizeof(struct sctp_initmsg))
 		return -EINVAL;
 
-	if (sinit.sinit_num_ostreams)
-		sp->initmsg.sinit_num_ostreams = sinit.sinit_num_ostreams;
-	if (sinit.sinit_max_instreams)
-		sp->initmsg.sinit_max_instreams = sinit.sinit_max_instreams;
-	if (sinit.sinit_max_attempts)
-		sp->initmsg.sinit_max_attempts = sinit.sinit_max_attempts;
-	if (sinit.sinit_max_init_timeo)
-		sp->initmsg.sinit_max_init_timeo = sinit.sinit_max_init_timeo;
+	if (sinit->sinit_num_ostreams)
+		sp->initmsg.sinit_num_ostreams = sinit->sinit_num_ostreams;
+	if (sinit->sinit_max_instreams)
+		sp->initmsg.sinit_max_instreams = sinit->sinit_max_instreams;
+	if (sinit->sinit_max_attempts)
+		sp->initmsg.sinit_max_attempts = sinit->sinit_max_attempts;
+	if (sinit->sinit_max_init_timeo)
+		sp->initmsg.sinit_max_init_timeo = sinit->sinit_max_init_timeo;
 
 	return 0;
 }
-#undef sinit
 
 /*
  * 7.1.14 Set default send parameters (SCTP_DEFAULT_SEND_PARAM)
@@ -2867,56 +2862,55 @@ static int sctp_setsockopt_initmsg(struct sock *sk, struct sctp_initmsg sinit,
  *   sinfo_timetolive.  The user must provide the sinfo_assoc_id field in
  *   to this call if the caller is using the UDP model.
  */
-#define info (*info)
 static int sctp_setsockopt_default_send_param(struct sock *sk,
-					      struct sctp_sndrcvinfo info,
+					      struct sctp_sndrcvinfo *info,
 					      unsigned int optlen)
 {
 	struct sctp_sock *sp = sctp_sk(sk);
 	struct sctp_association *asoc;
 
-	if (optlen != sizeof(info))
+	if (optlen != sizeof(*info))
 		return -EINVAL;
-	if (info.sinfo_flags &
+	if (info->sinfo_flags &
 	    ~(SCTP_UNORDERED | SCTP_ADDR_OVER |
 	      SCTP_ABORT | SCTP_EOF))
 		return -EINVAL;
 
-	asoc = sctp_id2assoc(sk, info.sinfo_assoc_id);
-	if (!asoc && info.sinfo_assoc_id > SCTP_ALL_ASSOC &&
+	asoc = sctp_id2assoc(sk, info->sinfo_assoc_id);
+	if (!asoc && info->sinfo_assoc_id > SCTP_ALL_ASSOC &&
 	    sctp_style(sk, UDP))
 		return -EINVAL;
 
 	if (asoc) {
-		asoc->default_stream = info.sinfo_stream;
-		asoc->default_flags = info.sinfo_flags;
-		asoc->default_ppid = info.sinfo_ppid;
-		asoc->default_context = info.sinfo_context;
-		asoc->default_timetolive = info.sinfo_timetolive;
+		asoc->default_stream = info->sinfo_stream;
+		asoc->default_flags = info->sinfo_flags;
+		asoc->default_ppid = info->sinfo_ppid;
+		asoc->default_context = info->sinfo_context;
+		asoc->default_timetolive = info->sinfo_timetolive;
 
 		return 0;
 	}
 
 	if (sctp_style(sk, TCP))
-		info.sinfo_assoc_id = SCTP_FUTURE_ASSOC;
+		info->sinfo_assoc_id = SCTP_FUTURE_ASSOC;
 
-	if (info.sinfo_assoc_id = SCTP_FUTURE_ASSOC ||
-	    info.sinfo_assoc_id = SCTP_ALL_ASSOC) {
-		sp->default_stream = info.sinfo_stream;
-		sp->default_flags = info.sinfo_flags;
-		sp->default_ppid = info.sinfo_ppid;
-		sp->default_context = info.sinfo_context;
-		sp->default_timetolive = info.sinfo_timetolive;
+	if (info->sinfo_assoc_id = SCTP_FUTURE_ASSOC ||
+	    info->sinfo_assoc_id = SCTP_ALL_ASSOC) {
+		sp->default_stream = info->sinfo_stream;
+		sp->default_flags = info->sinfo_flags;
+		sp->default_ppid = info->sinfo_ppid;
+		sp->default_context = info->sinfo_context;
+		sp->default_timetolive = info->sinfo_timetolive;
 	}
 
-	if (info.sinfo_assoc_id = SCTP_CURRENT_ASSOC ||
-	    info.sinfo_assoc_id = SCTP_ALL_ASSOC) {
+	if (info->sinfo_assoc_id = SCTP_CURRENT_ASSOC ||
+	    info->sinfo_assoc_id = SCTP_ALL_ASSOC) {
 		list_for_each_entry(asoc, &sp->ep->asocs, asocs) {
-			asoc->default_stream = info.sinfo_stream;
-			asoc->default_flags = info.sinfo_flags;
-			asoc->default_ppid = info.sinfo_ppid;
-			asoc->default_context = info.sinfo_context;
-			asoc->default_timetolive = info.sinfo_timetolive;
+			asoc->default_stream = info->sinfo_stream;
+			asoc->default_flags = info->sinfo_flags;
+			asoc->default_ppid = info->sinfo_ppid;
+			asoc->default_context = info->sinfo_context;
+			asoc->default_timetolive = info->sinfo_timetolive;
 		}
 	}
 
@@ -2927,51 +2921,51 @@ static int sctp_setsockopt_default_send_param(struct sock *sk,
  * (SCTP_DEFAULT_SNDINFO)
  */
 static int sctp_setsockopt_default_sndinfo(struct sock *sk,
-					   struct sctp_sndinfo info,
+					   struct sctp_sndinfo *info,
 					   unsigned int optlen)
 {
 	struct sctp_sock *sp = sctp_sk(sk);
 	struct sctp_association *asoc;
 
-	if (optlen != sizeof(info))
+	if (optlen != sizeof(*info))
 		return -EINVAL;
-	if (info.snd_flags &
+	if (info->snd_flags &
 	    ~(SCTP_UNORDERED | SCTP_ADDR_OVER |
 	      SCTP_ABORT | SCTP_EOF))
 		return -EINVAL;
 
-	asoc = sctp_id2assoc(sk, info.snd_assoc_id);
-	if (!asoc && info.snd_assoc_id > SCTP_ALL_ASSOC &&
+	asoc = sctp_id2assoc(sk, info->snd_assoc_id);
+	if (!asoc && info->snd_assoc_id > SCTP_ALL_ASSOC &&
 	    sctp_style(sk, UDP))
 		return -EINVAL;
 
 	if (asoc) {
-		asoc->default_stream = info.snd_sid;
-		asoc->default_flags = info.snd_flags;
-		asoc->default_ppid = info.snd_ppid;
-		asoc->default_context = info.snd_context;
+		asoc->default_stream = info->snd_sid;
+		asoc->default_flags = info->snd_flags;
+		asoc->default_ppid = info->snd_ppid;
+		asoc->default_context = info->snd_context;
 
 		return 0;
 	}
 
 	if (sctp_style(sk, TCP))
-		info.snd_assoc_id = SCTP_FUTURE_ASSOC;
+		info->snd_assoc_id = SCTP_FUTURE_ASSOC;
 
-	if (info.snd_assoc_id = SCTP_FUTURE_ASSOC ||
-	    info.snd_assoc_id = SCTP_ALL_ASSOC) {
-		sp->default_stream = info.snd_sid;
-		sp->default_flags = info.snd_flags;
-		sp->default_ppid = info.snd_ppid;
-		sp->default_context = info.snd_context;
+	if (info->snd_assoc_id = SCTP_FUTURE_ASSOC ||
+	    info->snd_assoc_id = SCTP_ALL_ASSOC) {
+		sp->default_stream = info->snd_sid;
+		sp->default_flags = info->snd_flags;
+		sp->default_ppid = info->snd_ppid;
+		sp->default_context = info->snd_context;
 	}
 
-	if (info.snd_assoc_id = SCTP_CURRENT_ASSOC ||
-	    info.snd_assoc_id = SCTP_ALL_ASSOC) {
+	if (info->snd_assoc_id = SCTP_CURRENT_ASSOC ||
+	    info->snd_assoc_id = SCTP_ALL_ASSOC) {
 		list_for_each_entry(asoc, &sp->ep->asocs, asocs) {
-			asoc->default_stream = info.snd_sid;
-			asoc->default_flags = info.snd_flags;
-			asoc->default_ppid = info.snd_ppid;
-			asoc->default_context = info.snd_context;
+			asoc->default_stream = info->snd_sid;
+			asoc->default_flags = info->snd_flags;
+			asoc->default_ppid = info->snd_ppid;
+			asoc->default_context = info->snd_context;
 		}
 	}
 
@@ -2984,8 +2978,7 @@ static int sctp_setsockopt_default_sndinfo(struct sock *sk,
  * the association primary.  The enclosed address must be one of the
  * association peer's addresses.
  */
-#define prim (*prim)
-static int sctp_setsockopt_primary_addr(struct sock *sk, struct sctp_prim prim,
+static int sctp_setsockopt_primary_addr(struct sock *sk, struct sctp_prim *prim,
 					unsigned int optlen)
 {
 	struct sctp_transport *trans;
@@ -2996,17 +2989,17 @@ static int sctp_setsockopt_primary_addr(struct sock *sk, struct sctp_prim prim,
 		return -EINVAL;
 
 	/* Allow security module to validate address but need address len. */
-	af = sctp_get_af_specific(prim.ssp_addr.ss_family);
+	af = sctp_get_af_specific(prim->ssp_addr.ss_family);
 	if (!af)
 		return -EINVAL;
 
 	err = security_sctp_bind_connect(sk, SCTP_PRIMARY_ADDR,
-					 (struct sockaddr *)&prim.ssp_addr,
+					 (struct sockaddr *)&prim->ssp_addr,
 					 af->sockaddr_len);
 	if (err)
 		return err;
 
-	trans = sctp_addr_id2transport(sk, &prim.ssp_addr, prim.ssp_assoc_id);
+	trans = sctp_addr_id2transport(sk, &prim->ssp_addr, prim->ssp_assoc_id);
 	if (!trans)
 		return -EINVAL;
 
@@ -3014,7 +3007,6 @@ static int sctp_setsockopt_primary_addr(struct sock *sk, struct sctp_prim prim,
 
 	return 0;
 }
-#undef prim
 
 /*
  * 7.1.5 SCTP_NODELAY
@@ -3047,7 +3039,7 @@ static int sctp_setsockopt_nodelay(struct sock *sk, int *optval,
  *
  */
 static int sctp_setsockopt_rtoinfo(struct sock *sk,
-				   struct sctp_rtoinfo params,
+				   struct sctp_rtoinfo *params,
 				   unsigned int optlen)
 {
 	struct sctp_association *asoc;
@@ -3057,15 +3049,15 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk,
 	if (optlen != sizeof (struct sctp_rtoinfo))
 		return -EINVAL;
 
-	asoc = sctp_id2assoc(sk, params.srto_assoc_id);
+	asoc = sctp_id2assoc(sk, params->srto_assoc_id);
 
 	/* Set the values to the specific association */
-	if (!asoc && params.srto_assoc_id != SCTP_FUTURE_ASSOC &&
+	if (!asoc && params->srto_assoc_id != SCTP_FUTURE_ASSOC &&
 	    sctp_style(sk, UDP))
 		return -EINVAL;
 
-	rto_max = params.srto_max;
-	rto_min = params.srto_min;
+	rto_max = params->srto_max;
+	rto_min = params->srto_min;
 
 	if (rto_max)
 		rto_max = asoc ? msecs_to_jiffies(rto_max) : rto_max;
@@ -3081,17 +3073,17 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk,
 		return -EINVAL;
 
 	if (asoc) {
-		if (params.srto_initial != 0)
+		if (params->srto_initial != 0)
 			asoc->rto_initial -				msecs_to_jiffies(params.srto_initial);
+				msecs_to_jiffies(params->srto_initial);
 		asoc->rto_max = rto_max;
 		asoc->rto_min = rto_min;
 	} else {
 		/* If there is no association or the association-id = 0
 		 * set the values to the endpoint.
 		 */
-		if (params.srto_initial != 0)
-			sp->rtoinfo.srto_initial = params.srto_initial;
+		if (params->srto_initial != 0)
+			sp->rtoinfo.srto_initial = params->srto_initial;
 		sp->rtoinfo.srto_max = rto_max;
 		sp->rtoinfo.srto_min = rto_min;
 	}
@@ -3111,7 +3103,7 @@ static int sctp_setsockopt_rtoinfo(struct sock *sk,
  *
  */
 static int sctp_setsockopt_associnfo(struct sock *sk,
-				     struct sctp_assocparams params,
+				     struct sctp_assocparams *params,
 				     unsigned int optlen)
 {
 
@@ -3120,15 +3112,15 @@ static int sctp_setsockopt_associnfo(struct sock *sk,
 	if (optlen != sizeof(struct sctp_assocparams))
 		return -EINVAL;
 
-	asoc = sctp_id2assoc(sk, params.sasoc_assoc_id);
+	asoc = sctp_id2assoc(sk, params->sasoc_assoc_id);
 
-	if (!asoc && params.sasoc_assoc_id != SCTP_FUTURE_ASSOC &&
+	if (!asoc && params->sasoc_assoc_id != SCTP_FUTURE_ASSOC &&
 	    sctp_style(sk, UDP))
 		return -EINVAL;
 
 	/* Set the values to the specific association */
 	if (asoc) {
-		if (params.sasoc_asocmaxrxt != 0) {
+		if (params->sasoc_asocmaxrxt != 0) {
 			__u32 path_sum = 0;
 			int   paths = 0;
 			struct sctp_transport *peer_addr;
@@ -3145,24 +3137,24 @@ static int sctp_setsockopt_associnfo(struct sock *sk,
 			 * then one path.
 			 */
 			if (paths > 1 &&
-			    params.sasoc_asocmaxrxt > path_sum)
+			    params->sasoc_asocmaxrxt > path_sum)
 				return -EINVAL;
 
-			asoc->max_retrans = params.sasoc_asocmaxrxt;
+			asoc->max_retrans = params->sasoc_asocmaxrxt;
 		}
 
-		if (params.sasoc_cookie_life != 0)
-			asoc->cookie_life = ms_to_ktime(params.sasoc_cookie_life);
+		if (params->sasoc_cookie_life != 0)
+			asoc->cookie_life = ms_to_ktime(params->sasoc_cookie_life);
 	} else {
 		/* Set the values to the endpoint */
 		struct sctp_sock *sp = sctp_sk(sk);
 
-		if (params.sasoc_asocmaxrxt != 0)
+		if (params->sasoc_asocmaxrxt != 0)
 			sp->assocparams.sasoc_asocmaxrxt -						params.sasoc_asocmaxrxt;
-		if (params.sasoc_cookie_life != 0)
+						params->sasoc_asocmaxrxt;
+		if (params->sasoc_cookie_life != 0)
 			sp->assocparams.sasoc_cookie_life -						params.sasoc_cookie_life;
+						params->sasoc_cookie_life;
 	}
 	return 0;
 }
@@ -3220,7 +3212,7 @@ static int sctp_setsockopt_mappedv4(struct sock *sk, int *optval,
  * assoc_value:  This parameter specifies the maximum size in bytes.
  */
 static int sctp_setsockopt_maxseg(struct sock *sk,
-				  struct sctp_assoc_value params,
+				  struct sctp_assoc_value *params,
 				  unsigned int optlen)
 {
 	struct sctp_sock *sp = sctp_sk(sk);
@@ -3233,16 +3225,16 @@ static int sctp_setsockopt_maxseg(struct sock *sk,
 				    "Use of int in maxseg socket option.\n"
 				    "Use struct sctp_assoc_value instead\n",
 				    current->comm, task_pid_nr(current));
-		val = *(int *)&params;
-		params.assoc_id = SCTP_FUTURE_ASSOC;
+		val = *(int *)params;
+		params->assoc_id = SCTP_FUTURE_ASSOC;
 	} else if (optlen != sizeof(struct sctp_assoc_value)) {
-		val = params.assoc_value;
+		val = params->assoc_value;
 	} else {
 		return -EINVAL;
 	}
 
-	asoc = sctp_id2assoc(sk, params.assoc_id);
-	if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
+	asoc = sctp_id2assoc(sk, params->assoc_id);
+	if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC &&
 	    sctp_style(sk, UDP))
 		return -EINVAL;
 
@@ -3277,9 +3269,8 @@ static int sctp_setsockopt_maxseg(struct sock *sk,
  *   locally bound addresses. The following structure is used to make a
  *   set primary request:
  */
-#define prim (*prim)
 static int sctp_setsockopt_peer_primary_addr(struct sock *sk,
-					     struct sctp_setpeerprim prim,
+					     struct sctp_setpeerprim *prim,
 					     unsigned int optlen)
 {
 	struct sctp_sock	*sp;
@@ -3296,7 +3287,7 @@ static int sctp_setsockopt_peer_primary_addr(struct sock *sk,
 	if (optlen != sizeof(struct sctp_setpeerprim))
 		return -EINVAL;
 
-	asoc = sctp_id2assoc(sk, prim.sspp_assoc_id);
+	asoc = sctp_id2assoc(sk, prim->sspp_assoc_id);
 	if (!asoc)
 		return -EINVAL;
 
@@ -3309,26 +3300,26 @@ static int sctp_setsockopt_peer_primary_addr(struct sock *sk,
 	if (!sctp_state(asoc, ESTABLISHED))
 		return -ENOTCONN;
 
-	af = sctp_get_af_specific(prim.sspp_addr.ss_family);
+	af = sctp_get_af_specific(prim->sspp_addr.ss_family);
 	if (!af)
 		return -EINVAL;
 
-	if (!af->addr_valid((union sctp_addr *)&prim.sspp_addr, sp, NULL))
+	if (!af->addr_valid((union sctp_addr *)&prim->sspp_addr, sp, NULL))
 		return -EADDRNOTAVAIL;
 
-	if (!sctp_assoc_lookup_laddr(asoc, (union sctp_addr *)&prim.sspp_addr))
+	if (!sctp_assoc_lookup_laddr(asoc, (union sctp_addr *)&prim->sspp_addr))
 		return -EADDRNOTAVAIL;
 
 	/* Allow security module to validate address. */
 	err = security_sctp_bind_connect(sk, SCTP_SET_PEER_PRIMARY_ADDR,
-					 (struct sockaddr *)&prim.sspp_addr,
+					 (struct sockaddr *)&prim->sspp_addr,
 					 af->sockaddr_len);
 	if (err)
 		return err;
 
 	/* Create an ASCONF chunk with SET_PRIMARY parameter	*/
 	chunk = sctp_make_asconf_set_prim(asoc,
-					  (union sctp_addr *)&prim.sspp_addr);
+					  (union sctp_addr *)&prim->sspp_addr);
 	if (!chunk)
 		return -ENOMEM;
 
@@ -3338,7 +3329,6 @@ static int sctp_setsockopt_peer_primary_addr(struct sock *sk,
 
 	return err;
 }
-#undef prim
 
 static int sctp_setsockopt_adaptation_layer(struct sock *sk,
 					    struct sctp_setadaptation *adaptation,
@@ -3367,7 +3357,7 @@ static int sctp_setsockopt_adaptation_layer(struct sock *sk,
  * saved with outbound messages.
  */
 static int sctp_setsockopt_context(struct sock *sk,
-				   struct sctp_assoc_value params,
+				   struct sctp_assoc_value *params,
 				   unsigned int optlen)
 {
 	struct sctp_sock *sp = sctp_sk(sk);
@@ -3376,28 +3366,28 @@ static int sctp_setsockopt_context(struct sock *sk,
 	if (optlen != sizeof(struct sctp_assoc_value))
 		return -EINVAL;
 
-	asoc = sctp_id2assoc(sk, params.assoc_id);
-	if (!asoc && params.assoc_id > SCTP_ALL_ASSOC &&
+	asoc = sctp_id2assoc(sk, params->assoc_id);
+	if (!asoc && params->assoc_id > SCTP_ALL_ASSOC &&
 	    sctp_style(sk, UDP))
 		return -EINVAL;
 
 	if (asoc) {
-		asoc->default_rcv_context = params.assoc_value;
+		asoc->default_rcv_context = params->assoc_value;
 
 		return 0;
 	}
 
 	if (sctp_style(sk, TCP))
-		params.assoc_id = SCTP_FUTURE_ASSOC;
+		params->assoc_id = SCTP_FUTURE_ASSOC;
 
-	if (params.assoc_id = SCTP_FUTURE_ASSOC ||
-	    params.assoc_id = SCTP_ALL_ASSOC)
-		sp->default_rcv_context = params.assoc_value;
+	if (params->assoc_id = SCTP_FUTURE_ASSOC ||
+	    params->assoc_id = SCTP_ALL_ASSOC)
+		sp->default_rcv_context = params->assoc_value;
 
-	if (params.assoc_id = SCTP_CURRENT_ASSOC ||
-	    params.assoc_id = SCTP_ALL_ASSOC)
+	if (params->assoc_id = SCTP_CURRENT_ASSOC ||
+	    params->assoc_id = SCTP_ALL_ASSOC)
 		list_for_each_entry(asoc, &sp->ep->asocs, asocs)
-			asoc->default_rcv_context = params.assoc_value;
+			asoc->default_rcv_context = params->assoc_value;
 
 	return 0;
 }
@@ -3488,7 +3478,7 @@ static int sctp_setsockopt_partial_delivery_point(struct sock *sk,
  * future associations inheriting the socket value.
  */
 static int sctp_setsockopt_maxburst(struct sock *sk,
-				    struct sctp_assoc_value params,
+				    struct sctp_assoc_value *params,
 				    unsigned int optlen)
 {
 	struct sctp_sock *sp = sctp_sk(sk);
@@ -3500,34 +3490,34 @@ static int sctp_setsockopt_maxburst(struct sock *sk,
 				    "Use of int in max_burst socket option deprecated.\n"
 				    "Use struct sctp_assoc_value instead\n",
 				    current->comm, task_pid_nr(current));
-		params.assoc_value = *(int *)&params;
-		params.assoc_id = SCTP_FUTURE_ASSOC;
+		params->assoc_value = *(int *)params;
+		params->assoc_id = SCTP_FUTURE_ASSOC;
 	} else if (optlen != sizeof(struct sctp_assoc_value)) {
 		return -EINVAL;
 	}
 
-	asoc = sctp_id2assoc(sk, params.assoc_id);
-	if (!asoc && params.assoc_id > SCTP_ALL_ASSOC &&
+	asoc = sctp_id2assoc(sk, params->assoc_id);
+	if (!asoc && params->assoc_id > SCTP_ALL_ASSOC &&
 	    sctp_style(sk, UDP))
 		return -EINVAL;
 
 	if (asoc) {
-		asoc->max_burst = params.assoc_value;
+		asoc->max_burst = params->assoc_value;
 
 		return 0;
 	}
 
 	if (sctp_style(sk, TCP))
-		params.assoc_id = SCTP_FUTURE_ASSOC;
+		params->assoc_id = SCTP_FUTURE_ASSOC;
 
-	if (params.assoc_id = SCTP_FUTURE_ASSOC ||
-	    params.assoc_id = SCTP_ALL_ASSOC)
-		sp->max_burst = params.assoc_value;
+	if (params->assoc_id = SCTP_FUTURE_ASSOC ||
+	    params->assoc_id = SCTP_ALL_ASSOC)
+		sp->max_burst = params->assoc_value;
 
-	if (params.assoc_id = SCTP_CURRENT_ASSOC ||
-	    params.assoc_id = SCTP_ALL_ASSOC)
+	if (params->assoc_id = SCTP_CURRENT_ASSOC ||
+	    params->assoc_id = SCTP_ALL_ASSOC)
 		list_for_each_entry(asoc, &sp->ep->asocs, asocs)
-			asoc->max_burst = params.assoc_value;
+			asoc->max_burst = params->assoc_value;
 
 	return 0;
 }
@@ -3539,9 +3529,8 @@ static int sctp_setsockopt_maxburst(struct sock *sk,
  * received only in an authenticated way.  Changes to the list of chunks
  * will only effect future associations on the socket.
  */
-#define val (*val)
 static int sctp_setsockopt_auth_chunk(struct sock *sk,
-				      struct sctp_authchunk val,
+				      struct sctp_authchunk *val,
 				      unsigned int optlen)
 {
 	struct sctp_endpoint *ep = sctp_sk(sk)->ep;
@@ -3552,7 +3541,7 @@ static int sctp_setsockopt_auth_chunk(struct sock *sk,
 	if (optlen != sizeof(struct sctp_authchunk))
 		return -EINVAL;
 
-	switch (val.sauth_chunk) {
+	switch (val->sauth_chunk) {
 	case SCTP_CID_INIT:
 	case SCTP_CID_INIT_ACK:
 	case SCTP_CID_SHUTDOWN_COMPLETE:
@@ -3561,7 +3550,7 @@ static int sctp_setsockopt_auth_chunk(struct sock *sk,
 	}
 
 	/* add this chunk id to the endpoint */
-	return sctp_auth_ep_add_chunkid(ep, val.sauth_chunk);
+	return sctp_auth_ep_add_chunkid(ep, val->sauth_chunk);
 }
 
 /*
@@ -3666,7 +3655,7 @@ static int sctp_setsockopt_auth_key(struct sock *sk,
  * the association shared key.
  */
 static int sctp_setsockopt_active_key(struct sock *sk,
-				      struct sctp_authkeyid val,
+				      struct sctp_authkeyid *val,
 				      unsigned int optlen)
 {
 	struct sctp_endpoint *ep = sctp_sk(sk)->ep;
@@ -3676,29 +3665,29 @@ static int sctp_setsockopt_active_key(struct sock *sk,
 	if (optlen != sizeof(struct sctp_authkeyid))
 		return -EINVAL;
 
-	asoc = sctp_id2assoc(sk, val.scact_assoc_id);
-	if (!asoc && val.scact_assoc_id > SCTP_ALL_ASSOC &&
+	asoc = sctp_id2assoc(sk, val->scact_assoc_id);
+	if (!asoc && val->scact_assoc_id > SCTP_ALL_ASSOC &&
 	    sctp_style(sk, UDP))
 		return -EINVAL;
 
 	if (asoc)
-		return sctp_auth_set_active_key(ep, asoc, val.scact_keynumber);
+		return sctp_auth_set_active_key(ep, asoc, val->scact_keynumber);
 
 	if (sctp_style(sk, TCP))
-		val.scact_assoc_id = SCTP_FUTURE_ASSOC;
+		val->scact_assoc_id = SCTP_FUTURE_ASSOC;
 
-	if (val.scact_assoc_id = SCTP_FUTURE_ASSOC ||
-	    val.scact_assoc_id = SCTP_ALL_ASSOC) {
-		ret = sctp_auth_set_active_key(ep, asoc, val.scact_keynumber);
+	if (val->scact_assoc_id = SCTP_FUTURE_ASSOC ||
+	    val->scact_assoc_id = SCTP_ALL_ASSOC) {
+		ret = sctp_auth_set_active_key(ep, asoc, val->scact_keynumber);
 		if (ret)
 			return ret;
 	}
 
-	if (val.scact_assoc_id = SCTP_CURRENT_ASSOC ||
-	    val.scact_assoc_id = SCTP_ALL_ASSOC) {
+	if (val->scact_assoc_id = SCTP_CURRENT_ASSOC ||
+	    val->scact_assoc_id = SCTP_ALL_ASSOC) {
 		list_for_each_entry(asoc, &ep->asocs, asocs) {
 			int res = sctp_auth_set_active_key(ep, asoc,
-							   val.scact_keynumber);
+							   val->scact_keynumber);
 
 			if (res && !ret)
 				ret = res;
@@ -3714,7 +3703,7 @@ static int sctp_setsockopt_active_key(struct sock *sk,
  * This set option will delete a shared secret key from use.
  */
 static int sctp_setsockopt_del_key(struct sock *sk,
-				   struct sctp_authkeyid val,
+				   struct sctp_authkeyid *val,
 				   unsigned int optlen)
 {
 	struct sctp_endpoint *ep = sctp_sk(sk)->ep;
@@ -3724,29 +3713,29 @@ static int sctp_setsockopt_del_key(struct sock *sk,
 	if (optlen != sizeof(struct sctp_authkeyid))
 		return -EINVAL;
 
-	asoc = sctp_id2assoc(sk, val.scact_assoc_id);
-	if (!asoc && val.scact_assoc_id > SCTP_ALL_ASSOC &&
+	asoc = sctp_id2assoc(sk, val->scact_assoc_id);
+	if (!asoc && val->scact_assoc_id > SCTP_ALL_ASSOC &&
 	    sctp_style(sk, UDP))
 		return -EINVAL;
 
 	if (asoc)
-		return sctp_auth_del_key_id(ep, asoc, val.scact_keynumber);
+		return sctp_auth_del_key_id(ep, asoc, val->scact_keynumber);
 
 	if (sctp_style(sk, TCP))
-		val.scact_assoc_id = SCTP_FUTURE_ASSOC;
+		val->scact_assoc_id = SCTP_FUTURE_ASSOC;
 
-	if (val.scact_assoc_id = SCTP_FUTURE_ASSOC ||
-	    val.scact_assoc_id = SCTP_ALL_ASSOC) {
-		ret = sctp_auth_del_key_id(ep, asoc, val.scact_keynumber);
+	if (val->scact_assoc_id = SCTP_FUTURE_ASSOC ||
+	    val->scact_assoc_id = SCTP_ALL_ASSOC) {
+		ret = sctp_auth_del_key_id(ep, asoc, val->scact_keynumber);
 		if (ret)
 			return ret;
 	}
 
-	if (val.scact_assoc_id = SCTP_CURRENT_ASSOC ||
-	    val.scact_assoc_id = SCTP_ALL_ASSOC) {
+	if (val->scact_assoc_id = SCTP_CURRENT_ASSOC ||
+	    val->scact_assoc_id = SCTP_ALL_ASSOC) {
 		list_for_each_entry(asoc, &ep->asocs, asocs) {
 			int res = sctp_auth_del_key_id(ep, asoc,
-						       val.scact_keynumber);
+						       val->scact_keynumber);
 
 			if (res && !ret)
 				ret = res;
@@ -3762,7 +3751,7 @@ static int sctp_setsockopt_del_key(struct sock *sk,
  * This set option will deactivate a shared secret key.
  */
 static int sctp_setsockopt_deactivate_key(struct sock *sk,
-					  struct sctp_authkeyid val,
+					  struct sctp_authkeyid *val,
 					  unsigned int optlen)
 {
 	struct sctp_endpoint *ep = sctp_sk(sk)->ep;
@@ -3772,29 +3761,29 @@ static int sctp_setsockopt_deactivate_key(struct sock *sk,
 	if (optlen != sizeof(struct sctp_authkeyid))
 		return -EINVAL;
 
-	asoc = sctp_id2assoc(sk, val.scact_assoc_id);
-	if (!asoc && val.scact_assoc_id > SCTP_ALL_ASSOC &&
+	asoc = sctp_id2assoc(sk, val->scact_assoc_id);
+	if (!asoc && val->scact_assoc_id > SCTP_ALL_ASSOC &&
 	    sctp_style(sk, UDP))
 		return -EINVAL;
 
 	if (asoc)
-		return sctp_auth_deact_key_id(ep, asoc, val.scact_keynumber);
+		return sctp_auth_deact_key_id(ep, asoc, val->scact_keynumber);
 
 	if (sctp_style(sk, TCP))
-		val.scact_assoc_id = SCTP_FUTURE_ASSOC;
+		val->scact_assoc_id = SCTP_FUTURE_ASSOC;
 
-	if (val.scact_assoc_id = SCTP_FUTURE_ASSOC ||
-	    val.scact_assoc_id = SCTP_ALL_ASSOC) {
-		ret = sctp_auth_deact_key_id(ep, asoc, val.scact_keynumber);
+	if (val->scact_assoc_id = SCTP_FUTURE_ASSOC ||
+	    val->scact_assoc_id = SCTP_ALL_ASSOC) {
+		ret = sctp_auth_deact_key_id(ep, asoc, val->scact_keynumber);
 		if (ret)
 			return ret;
 	}
 
-	if (val.scact_assoc_id = SCTP_CURRENT_ASSOC ||
-	    val.scact_assoc_id = SCTP_ALL_ASSOC) {
+	if (val->scact_assoc_id = SCTP_CURRENT_ASSOC ||
+	    val->scact_assoc_id = SCTP_ALL_ASSOC) {
 		list_for_each_entry(asoc, &ep->asocs, asocs) {
 			int res = sctp_auth_deact_key_id(ep, asoc,
-							 val.scact_keynumber);
+							 val->scact_keynumber);
 
 			if (res && !ret)
 				ret = res;
@@ -3803,7 +3792,6 @@ static int sctp_setsockopt_deactivate_key(struct sock *sk,
 
 	return ret;
 }
-#undef val
 
 /*
  * 8.1.23 SCTP_AUTO_ASCONF
@@ -3819,24 +3807,23 @@ static int sctp_setsockopt_deactivate_key(struct sock *sk,
  * Note. In this implementation, socket operation overrides default parameter
  * being set by sysctl as well as FreeBSD implementation
  */
-#define val (*optval)
-static int sctp_setsockopt_auto_asconf(struct sock *sk, int val,
+static int sctp_setsockopt_auto_asconf(struct sock *sk, int *optval,
 				       unsigned int optlen)
 {
 	struct sctp_sock *sp = sctp_sk(sk);
 
 	if (optlen < sizeof(int))
 		return -EINVAL;
-	if (!sctp_is_ep_boundall(sk) && val)
+	if (!sctp_is_ep_boundall(sk) && (*optval))
 		return -EINVAL;
-	if ((val && sp->do_auto_asconf) || (!val && !sp->do_auto_asconf))
+	if (((*optval) && sp->do_auto_asconf) || (!(*optval) && !sp->do_auto_asconf))
 		return 0;
 
 	spin_lock_bh(&sock_net(sk)->sctp.addr_wq_lock);
-	if (val = 0 && sp->do_auto_asconf) {
+	if ((*optval) = 0 && sp->do_auto_asconf) {
 		list_del(&sp->auto_asconf_list);
 		sp->do_auto_asconf = 0;
-	} else if (val && !sp->do_auto_asconf) {
+	} else if ((*optval) && !sp->do_auto_asconf) {
 		list_add_tail(&sp->auto_asconf_list,
 		    &sock_net(sk)->sctp.auto_asconf_splist);
 		sp->do_auto_asconf = 1;
@@ -3844,7 +3831,6 @@ static int sctp_setsockopt_auto_asconf(struct sock *sk, int val,
 	spin_unlock_bh(&sock_net(sk)->sctp.addr_wq_lock);
 	return 0;
 }
-#undef val
 
 /*
  * SCTP_PEER_ADDR_THLDS
@@ -3853,70 +3839,68 @@ static int sctp_setsockopt_auto_asconf(struct sock *sk, int val,
  * transports in an association.  See Section 6.1 of:
  * http://www.ietf.org/id/draft-nishida-tsvwg-sctp-failover-05.txt
  */
-#define val (*val)
 static int sctp_setsockopt_paddr_thresholds(struct sock *sk,
-					    struct sctp_paddrthlds_v2 val,
+					    struct sctp_paddrthlds_v2 *val,
 					    unsigned int optlen, bool v2)
 {
 	struct sctp_transport *trans;
 	struct sctp_association *asoc;
 	int len;
 
-	len = v2 ? sizeof(val) : sizeof(struct sctp_paddrthlds);
+	len = v2 ? sizeof(*val) : sizeof(struct sctp_paddrthlds);
 	if (optlen < len)
 		return -EINVAL;
 
-	if (v2 && val.spt_pathpfthld > val.spt_pathcpthld)
+	if (v2 && val->spt_pathpfthld > val->spt_pathcpthld)
 		return -EINVAL;
 
-	if (!sctp_is_any(sk, (const union sctp_addr *)&val.spt_address)) {
-		trans = sctp_addr_id2transport(sk, &val.spt_address,
-					       val.spt_assoc_id);
+	if (!sctp_is_any(sk, (const union sctp_addr *)&val->spt_address)) {
+		trans = sctp_addr_id2transport(sk, &val->spt_address,
+					       val->spt_assoc_id);
 		if (!trans)
 			return -ENOENT;
 
-		if (val.spt_pathmaxrxt)
-			trans->pathmaxrxt = val.spt_pathmaxrxt;
+		if (val->spt_pathmaxrxt)
+			trans->pathmaxrxt = val->spt_pathmaxrxt;
 		if (v2)
-			trans->ps_retrans = val.spt_pathcpthld;
-		trans->pf_retrans = val.spt_pathpfthld;
+			trans->ps_retrans = val->spt_pathcpthld;
+		trans->pf_retrans = val->spt_pathpfthld;
 
 		return 0;
 	}
 
-	asoc = sctp_id2assoc(sk, val.spt_assoc_id);
-	if (!asoc && val.spt_assoc_id != SCTP_FUTURE_ASSOC &&
+	asoc = sctp_id2assoc(sk, val->spt_assoc_id);
+	if (!asoc && val->spt_assoc_id != SCTP_FUTURE_ASSOC &&
 	    sctp_style(sk, UDP))
 		return -EINVAL;
 
 	if (asoc) {
 		list_for_each_entry(trans, &asoc->peer.transport_addr_list,
 				    transports) {
-			if (val.spt_pathmaxrxt)
-				trans->pathmaxrxt = val.spt_pathmaxrxt;
+			if (val->spt_pathmaxrxt)
+				trans->pathmaxrxt = val->spt_pathmaxrxt;
 			if (v2)
-				trans->ps_retrans = val.spt_pathcpthld;
-			trans->pf_retrans = val.spt_pathpfthld;
+				trans->ps_retrans = val->spt_pathcpthld;
+			trans->pf_retrans = val->spt_pathpfthld;
 		}
 
-		if (val.spt_pathmaxrxt)
-			asoc->pathmaxrxt = val.spt_pathmaxrxt;
+		if (val->spt_pathmaxrxt)
+			asoc->pathmaxrxt = val->spt_pathmaxrxt;
 		if (v2)
-			asoc->ps_retrans = val.spt_pathcpthld;
-		asoc->pf_retrans = val.spt_pathpfthld;
+			asoc->ps_retrans = val->spt_pathcpthld;
+		asoc->pf_retrans = val->spt_pathpfthld;
 	} else {
 		struct sctp_sock *sp = sctp_sk(sk);
 
-		if (val.spt_pathmaxrxt)
-			sp->pathmaxrxt = val.spt_pathmaxrxt;
+		if (val->spt_pathmaxrxt)
+			sp->pathmaxrxt = val->spt_pathmaxrxt;
 		if (v2)
-			sp->ps_retrans = val.spt_pathcpthld;
-		sp->pf_retrans = val.spt_pathpfthld;
+			sp->ps_retrans = val->spt_pathcpthld;
+		sp->pf_retrans = val->spt_pathpfthld;
 	}
 
 	return 0;
 }
-#undef val
 
 static int sctp_setsockopt_recvrcvinfo(struct sock *sk, int *optval,
 				       unsigned int optlen)
@@ -3941,92 +3925,91 @@ static int sctp_setsockopt_recvnxtinfo(struct sock *sk, int *optval,
 }
 
 static int sctp_setsockopt_pr_supported(struct sock *sk,
-					struct sctp_assoc_value params,
+					struct sctp_assoc_value *params,
 					unsigned int optlen)
 {
 	struct sctp_association *asoc;
 
-	if (optlen != sizeof(params))
+	if (optlen != sizeof(*params))
 		return -EINVAL;
 
-	asoc = sctp_id2assoc(sk, params.assoc_id);
-	if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
+	asoc = sctp_id2assoc(sk, params->assoc_id);
+	if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC &&
 	    sctp_style(sk, UDP))
 		return -EINVAL;
 
-	sctp_sk(sk)->ep->prsctp_enable = !!params.assoc_value;
+	sctp_sk(sk)->ep->prsctp_enable = !!params->assoc_value;
 
 	return 0;
 }
 
 static int sctp_setsockopt_default_prinfo(struct sock *sk,
-					  struct sctp_default_prinfo info,
+					  struct sctp_default_prinfo *info,
 					  unsigned int optlen)
 {
 	struct sctp_sock *sp = sctp_sk(sk);
 	struct sctp_association *asoc;
 	int retval = -EINVAL;
 
-	if (optlen != sizeof(info))
+	if (optlen != sizeof(*info))
 		goto out;
 
-	if (info.pr_policy & ~SCTP_PR_SCTP_MASK)
+	if (info->pr_policy & ~SCTP_PR_SCTP_MASK)
 		goto out;
 
-	if (info.pr_policy = SCTP_PR_SCTP_NONE)
-		info.pr_value = 0;
+	if (info->pr_policy = SCTP_PR_SCTP_NONE)
+		info->pr_value = 0;
 
-	asoc = sctp_id2assoc(sk, info.pr_assoc_id);
-	if (!asoc && info.pr_assoc_id > SCTP_ALL_ASSOC &&
+	asoc = sctp_id2assoc(sk, info->pr_assoc_id);
+	if (!asoc && info->pr_assoc_id > SCTP_ALL_ASSOC &&
 	    sctp_style(sk, UDP))
 		goto out;
 
 	retval = 0;
 
 	if (asoc) {
-		SCTP_PR_SET_POLICY(asoc->default_flags, info.pr_policy);
-		asoc->default_timetolive = info.pr_value;
+		SCTP_PR_SET_POLICY(asoc->default_flags, info->pr_policy);
+		asoc->default_timetolive = info->pr_value;
 		goto out;
 	}
 
 	if (sctp_style(sk, TCP))
-		info.pr_assoc_id = SCTP_FUTURE_ASSOC;
+		info->pr_assoc_id = SCTP_FUTURE_ASSOC;
 
-	if (info.pr_assoc_id = SCTP_FUTURE_ASSOC ||
-	    info.pr_assoc_id = SCTP_ALL_ASSOC) {
-		SCTP_PR_SET_POLICY(sp->default_flags, info.pr_policy);
-		sp->default_timetolive = info.pr_value;
+	if (info->pr_assoc_id = SCTP_FUTURE_ASSOC ||
+	    info->pr_assoc_id = SCTP_ALL_ASSOC) {
+		SCTP_PR_SET_POLICY(sp->default_flags, info->pr_policy);
+		sp->default_timetolive = info->pr_value;
 	}
 
-	if (info.pr_assoc_id = SCTP_CURRENT_ASSOC ||
-	    info.pr_assoc_id = SCTP_ALL_ASSOC) {
+	if (info->pr_assoc_id = SCTP_CURRENT_ASSOC ||
+	    info->pr_assoc_id = SCTP_ALL_ASSOC) {
 		list_for_each_entry(asoc, &sp->ep->asocs, asocs) {
-			SCTP_PR_SET_POLICY(asoc->default_flags, info.pr_policy);
-			asoc->default_timetolive = info.pr_value;
+			SCTP_PR_SET_POLICY(asoc->default_flags, info->pr_policy);
+			asoc->default_timetolive = info->pr_value;
 		}
 	}
 
 out:
 	return retval;
 }
-#undef info
 
 static int sctp_setsockopt_reconfig_supported(struct sock *sk,
-					      struct sctp_assoc_value params,
+					      struct sctp_assoc_value *params,
 					      unsigned int optlen)
 {
 	struct sctp_association *asoc;
 	int retval = -EINVAL;
 
-	if (optlen != sizeof(params))
+	if (optlen != sizeof(*params))
 		goto out;
 
-	asoc = sctp_id2assoc(sk, params.assoc_id);
-	if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
+	asoc = sctp_id2assoc(sk, params->assoc_id);
+	if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC &&
 	    sctp_style(sk, UDP))
 		goto out;
 
-	sctp_sk(sk)->ep->reconf_enable = !!params.assoc_value;
+	sctp_sk(sk)->ep->reconf_enable = !!params->assoc_value;
 
 	retval = 0;
 
@@ -4035,48 +4018,47 @@ static int sctp_setsockopt_reconfig_supported(struct sock *sk,
 }
 
 static int sctp_setsockopt_enable_strreset(struct sock *sk,
-					   struct sctp_assoc_value params,
+					   struct sctp_assoc_value *params,
 					   unsigned int optlen)
 {
 	struct sctp_endpoint *ep = sctp_sk(sk)->ep;
 	struct sctp_association *asoc;
 	int retval = -EINVAL;
 
-	if (optlen != sizeof(params))
+	if (optlen != sizeof(*params))
 		goto out;
 
-	if (params.assoc_value & (~SCTP_ENABLE_STRRESET_MASK))
+	if (params->assoc_value & (~SCTP_ENABLE_STRRESET_MASK))
 		goto out;
 
-	asoc = sctp_id2assoc(sk, params.assoc_id);
-	if (!asoc && params.assoc_id > SCTP_ALL_ASSOC &&
+	asoc = sctp_id2assoc(sk, params->assoc_id);
+	if (!asoc && params->assoc_id > SCTP_ALL_ASSOC &&
 	    sctp_style(sk, UDP))
 		goto out;
 
 	retval = 0;
 
 	if (asoc) {
-		asoc->strreset_enable = params.assoc_value;
+		asoc->strreset_enable = params->assoc_value;
 		goto out;
 	}
 
 	if (sctp_style(sk, TCP))
-		params.assoc_id = SCTP_FUTURE_ASSOC;
+		params->assoc_id = SCTP_FUTURE_ASSOC;
 
-	if (params.assoc_id = SCTP_FUTURE_ASSOC ||
-	    params.assoc_id = SCTP_ALL_ASSOC)
-		ep->strreset_enable = params.assoc_value;
+	if (params->assoc_id = SCTP_FUTURE_ASSOC ||
+	    params->assoc_id = SCTP_ALL_ASSOC)
+		ep->strreset_enable = params->assoc_value;
 
-	if (params.assoc_id = SCTP_CURRENT_ASSOC ||
-	    params.assoc_id = SCTP_ALL_ASSOC)
+	if (params->assoc_id = SCTP_CURRENT_ASSOC ||
+	    params->assoc_id = SCTP_ALL_ASSOC)
 		list_for_each_entry(asoc, &ep->asocs, asocs)
-			asoc->strreset_enable = params.assoc_value;
+			asoc->strreset_enable = params->assoc_value;
 
 out:
 	return retval;
 }
 
-#undef params
 static int sctp_setsockopt_reset_streams(struct sock *sk,
 					 struct sctp_reset_streams *params,
 					 unsigned int optlen)
@@ -4103,20 +4085,17 @@ static int sctp_setsockopt_reset_streams(struct sock *sk,
 out:
 	return retval;
 }
-#define params (*params)
 
-
-#define associd (*associd)
-static int sctp_setsockopt_reset_assoc(struct sock *sk, sctp_assoc_t associd,
+static int sctp_setsockopt_reset_assoc(struct sock *sk, sctp_assoc_t *associd,
 				       unsigned int optlen)
 {
 	struct sctp_association *asoc;
 	int retval = -EINVAL;
 
-	if (optlen != sizeof(associd))
+	if (optlen != sizeof(*associd))
 		goto out;
 
-	asoc = sctp_id2assoc(sk, associd);
+	asoc = sctp_id2assoc(sk, (*associd));
 	if (!asoc)
 		goto out;
 
@@ -4125,62 +4104,61 @@ static int sctp_setsockopt_reset_assoc(struct sock *sk, sctp_assoc_t associd,
 out:
 	return retval;
 }
-#undef associd
 
 static int sctp_setsockopt_add_streams(struct sock *sk,
-				       struct sctp_add_streams params,
+				       struct sctp_add_streams *params,
 				       unsigned int optlen)
 {
 	struct sctp_association *asoc;
 	int retval = -EINVAL;
 
-	if (optlen != sizeof(params))
+	if (optlen != sizeof(*params))
 		goto out;
 
-	asoc = sctp_id2assoc(sk, params.sas_assoc_id);
+	asoc = sctp_id2assoc(sk, params->sas_assoc_id);
 	if (!asoc)
 		goto out;
 
-	retval = sctp_send_add_streams(asoc, &params);
+	retval = sctp_send_add_streams(asoc, params);
 
 out:
 	return retval;
 }
 
 static int sctp_setsockopt_scheduler(struct sock *sk,
-				     struct sctp_assoc_value params,
+				     struct sctp_assoc_value *params,
 				     unsigned int optlen)
 {
 	struct sctp_sock *sp = sctp_sk(sk);
 	struct sctp_association *asoc;
 	int retval = 0;
 
-	if (optlen < sizeof(params))
+	if (optlen < sizeof(*params))
 		return -EINVAL;
 
-	if (params.assoc_value > SCTP_SS_MAX)
+	if (params->assoc_value > SCTP_SS_MAX)
 		return -EINVAL;
 
-	asoc = sctp_id2assoc(sk, params.assoc_id);
-	if (!asoc && params.assoc_id > SCTP_ALL_ASSOC &&
+	asoc = sctp_id2assoc(sk, params->assoc_id);
+	if (!asoc && params->assoc_id > SCTP_ALL_ASSOC &&
 	    sctp_style(sk, UDP))
 		return -EINVAL;
 
 	if (asoc)
-		return sctp_sched_set_sched(asoc, params.assoc_value);
+		return sctp_sched_set_sched(asoc, params->assoc_value);
 
 	if (sctp_style(sk, TCP))
-		params.assoc_id = SCTP_FUTURE_ASSOC;
+		params->assoc_id = SCTP_FUTURE_ASSOC;
 
-	if (params.assoc_id = SCTP_FUTURE_ASSOC ||
-	    params.assoc_id = SCTP_ALL_ASSOC)
-		sp->default_ss = params.assoc_value;
+	if (params->assoc_id = SCTP_FUTURE_ASSOC ||
+	    params->assoc_id = SCTP_ALL_ASSOC)
+		sp->default_ss = params->assoc_value;
 
-	if (params.assoc_id = SCTP_CURRENT_ASSOC ||
-	    params.assoc_id = SCTP_ALL_ASSOC) {
+	if (params->assoc_id = SCTP_CURRENT_ASSOC ||
+	    params->assoc_id = SCTP_ALL_ASSOC) {
 		list_for_each_entry(asoc, &sp->ep->asocs, asocs) {
 			int ret = sctp_sched_set_sched(asoc,
-						       params.assoc_value);
+						       params->assoc_value);
 
 			if (ret && !retval)
 				retval = ret;
@@ -4191,31 +4169,31 @@ static int sctp_setsockopt_scheduler(struct sock *sk,
 }
 
 static int sctp_setsockopt_scheduler_value(struct sock *sk,
-					   struct sctp_stream_value params,
+					   struct sctp_stream_value *params,
 					   unsigned int optlen)
 {
 	struct sctp_association *asoc;
 	int retval = -EINVAL;
 
-	if (optlen < sizeof(params))
+	if (optlen < sizeof(*params))
 		goto out;
 
-	asoc = sctp_id2assoc(sk, params.assoc_id);
-	if (!asoc && params.assoc_id != SCTP_CURRENT_ASSOC &&
+	asoc = sctp_id2assoc(sk, params->assoc_id);
+	if (!asoc && params->assoc_id != SCTP_CURRENT_ASSOC &&
 	    sctp_style(sk, UDP))
 		goto out;
 
 	if (asoc) {
-		retval = sctp_sched_set_value(asoc, params.stream_id,
-					      params.stream_value, GFP_KERNEL);
+		retval = sctp_sched_set_value(asoc, params->stream_id,
+					      params->stream_value, GFP_KERNEL);
 		goto out;
 	}
 
 	retval = 0;
 
 	list_for_each_entry(asoc, &sctp_sk(sk)->ep->asocs, asocs) {
-		int ret = sctp_sched_set_value(asoc, params.stream_id,
-					       params.stream_value, GFP_KERNEL);
+		int ret = sctp_sched_set_value(asoc, params->stream_id,
+					       params->stream_value, GFP_KERNEL);
 		if (ret && !retval) /* try to return the 1st error. */
 			retval = ret;
 	}
@@ -4225,18 +4203,18 @@ static int sctp_setsockopt_scheduler_value(struct sock *sk,
 }
 
 static int sctp_setsockopt_interleaving_supported(struct sock *sk,
-						  struct sctp_assoc_value params,
+						  struct sctp_assoc_value *params,
 						  unsigned int optlen)
 {
 	struct sctp_sock *sp = sctp_sk(sk);
 	struct sctp_association *asoc;
 	int retval = -EINVAL;
 
-	if (optlen < sizeof(params))
+	if (optlen < sizeof(*params))
 		goto out;
 
-	asoc = sctp_id2assoc(sk, params.assoc_id);
-	if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
+	asoc = sctp_id2assoc(sk, params->assoc_id);
+	if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC &&
 	    sctp_style(sk, UDP))
 		goto out;
 
@@ -4245,7 +4223,7 @@ static int sctp_setsockopt_interleaving_supported(struct sock *sk,
 		goto out;
 	}
 
-	sp->ep->intl_enable = !!params.assoc_value;
+	sp->ep->intl_enable = !!params->assoc_value;
 
 	retval = 0;
 
@@ -4291,41 +4269,40 @@ static int sctp_assoc_ulpevent_type_set(struct sctp_event *param,
 	return 0;
 }
 
-#define param (*param)
-static int sctp_setsockopt_event(struct sock *sk, struct sctp_event param,
+static int sctp_setsockopt_event(struct sock *sk, struct sctp_event *param,
 				 unsigned int optlen)
 {
 	struct sctp_sock *sp = sctp_sk(sk);
 	struct sctp_association *asoc;
 	int retval = 0;
 
-	if (optlen < sizeof(param))
+	if (optlen < sizeof(*param))
 		return -EINVAL;
 
-	if (param.se_type < SCTP_SN_TYPE_BASE ||
-	    param.se_type > SCTP_SN_TYPE_MAX)
+	if (param->se_type < SCTP_SN_TYPE_BASE ||
+	    param->se_type > SCTP_SN_TYPE_MAX)
 		return -EINVAL;
 
-	asoc = sctp_id2assoc(sk, param.se_assoc_id);
-	if (!asoc && param.se_assoc_id > SCTP_ALL_ASSOC &&
+	asoc = sctp_id2assoc(sk, param->se_assoc_id);
+	if (!asoc && param->se_assoc_id > SCTP_ALL_ASSOC &&
 	    sctp_style(sk, UDP))
 		return -EINVAL;
 
 	if (asoc)
-		return sctp_assoc_ulpevent_type_set(&param, asoc);
+		return sctp_assoc_ulpevent_type_set(param, asoc);
 
 	if (sctp_style(sk, TCP))
-		param.se_assoc_id = SCTP_FUTURE_ASSOC;
+		param->se_assoc_id = SCTP_FUTURE_ASSOC;
 
-	if (param.se_assoc_id = SCTP_FUTURE_ASSOC ||
-	    param.se_assoc_id = SCTP_ALL_ASSOC)
+	if (param->se_assoc_id = SCTP_FUTURE_ASSOC ||
+	    param->se_assoc_id = SCTP_ALL_ASSOC)
 		sctp_ulpevent_type_set(&sp->subscribe,
-				       param.se_type, param.se_on);
+				       param->se_type, param->se_on);
 
-	if (param.se_assoc_id = SCTP_CURRENT_ASSOC ||
-	    param.se_assoc_id = SCTP_ALL_ASSOC) {
+	if (param->se_assoc_id = SCTP_CURRENT_ASSOC ||
+	    param->se_assoc_id = SCTP_ALL_ASSOC) {
 		list_for_each_entry(asoc, &sp->ep->asocs, asocs) {
-			int ret = sctp_assoc_ulpevent_type_set(&param, asoc);
+			int ret = sctp_assoc_ulpevent_type_set(param, asoc);
 
 			if (ret && !retval)
 				retval = ret;
@@ -4334,26 +4311,25 @@ static int sctp_setsockopt_event(struct sock *sk, struct sctp_event param,
 
 	return retval;
 }
-#undef param
 
 static int sctp_setsockopt_asconf_supported(struct sock *sk,
-					    struct sctp_assoc_value params,
+					    struct sctp_assoc_value *params,
 					    unsigned int optlen)
 {
 	struct sctp_association *asoc;
 	struct sctp_endpoint *ep;
 	int retval = -EINVAL;
 
-	if (optlen != sizeof(params))
+	if (optlen != sizeof(*params))
 		goto out;
 
-	asoc = sctp_id2assoc(sk, params.assoc_id);
-	if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
+	asoc = sctp_id2assoc(sk, params->assoc_id);
+	if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC &&
 	    sctp_style(sk, UDP))
 		goto out;
 
 	ep = sctp_sk(sk)->ep;
-	ep->asconf_enable = !!params.assoc_value;
+	ep->asconf_enable = !!params->assoc_value;
 
 	if (ep->asconf_enable && ep->auth_enable) {
 		sctp_auth_ep_add_chunkid(ep, SCTP_CID_ASCONF);
@@ -4367,23 +4343,23 @@ static int sctp_setsockopt_asconf_supported(struct sock *sk,
 }
 
 static int sctp_setsockopt_auth_supported(struct sock *sk,
-					  struct sctp_assoc_value params,
+					  struct sctp_assoc_value *params,
 					  unsigned int optlen)
 {
 	struct sctp_association *asoc;
 	struct sctp_endpoint *ep;
 	int retval = -EINVAL;
 
-	if (optlen != sizeof(params))
+	if (optlen != sizeof(*params))
 		goto out;
 
-	asoc = sctp_id2assoc(sk, params.assoc_id);
-	if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
+	asoc = sctp_id2assoc(sk, params->assoc_id);
+	if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC &&
 	    sctp_style(sk, UDP))
 		goto out;
 
 	ep = sctp_sk(sk)->ep;
-	if (params.assoc_value) {
+	if (params->assoc_value) {
 		retval = sctp_auth_init(ep, GFP_KERNEL);
 		if (retval)
 			goto out;
@@ -4393,7 +4369,7 @@ static int sctp_setsockopt_auth_supported(struct sock *sk,
 		}
 	}
 
-	ep->auth_enable = !!params.assoc_value;
+	ep->auth_enable = !!params->assoc_value;
 	retval = 0;
 
 out:
@@ -4401,21 +4377,21 @@ static int sctp_setsockopt_auth_supported(struct sock *sk,
 }
 
 static int sctp_setsockopt_ecn_supported(struct sock *sk,
-					 struct sctp_assoc_value params,
+					 struct sctp_assoc_value *params,
 					 unsigned int optlen)
 {
 	struct sctp_association *asoc;
 	int retval = -EINVAL;
 
-	if (optlen != sizeof(params))
+	if (optlen != sizeof(*params))
 		goto out;
 
-	asoc = sctp_id2assoc(sk, params.assoc_id);
-	if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
+	asoc = sctp_id2assoc(sk, params->assoc_id);
+	if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC &&
 	    sctp_style(sk, UDP))
 		goto out;
 
-	sctp_sk(sk)->ep->ecn_enable = !!params.assoc_value;
+	sctp_sk(sk)->ep->ecn_enable = !!params->assoc_value;
 	retval = 0;
 
 out:
@@ -4423,33 +4399,32 @@ static int sctp_setsockopt_ecn_supported(struct sock *sk,
 }
 
 static int sctp_setsockopt_pf_expose(struct sock *sk,
-				     struct sctp_assoc_value params,
+				     struct sctp_assoc_value *params,
 				     unsigned int optlen)
 {
 	struct sctp_association *asoc;
 	int retval = -EINVAL;
 
-	if (optlen != sizeof(params))
+	if (optlen != sizeof(*params))
 		goto out;
 
-	if (params.assoc_value > SCTP_PF_EXPOSE_MAX)
+	if (params->assoc_value > SCTP_PF_EXPOSE_MAX)
 		goto out;
 
-	asoc = sctp_id2assoc(sk, params.assoc_id);
-	if (!asoc && params.assoc_id != SCTP_FUTURE_ASSOC &&
+	asoc = sctp_id2assoc(sk, params->assoc_id);
+	if (!asoc && params->assoc_id != SCTP_FUTURE_ASSOC &&
 	    sctp_style(sk, UDP))
 		goto out;
 
 	if (asoc)
-		asoc->pf_expose = params.assoc_value;
+		asoc->pf_expose = params->assoc_value;
 	else
-		sctp_sk(sk)->pf_expose = params.assoc_value;
+		sctp_sk(sk)->pf_expose = params->assoc_value;
 	retval = 0;
 
 out:
 	return retval;
 }
-#undef params
 
 static int kernel_sctp_setsockopt(struct sock *sk, int optname, void *optval,
 			   int optlen)
-- 
1.8.1.2

-
Registered Address Lakeside, Bramley Road, Mount Farm, Milton Keynes, MK1 1PT, UK
Registration No: 1397386 (Wales)

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* RE: [PATCH v3 net-next 1/8] sctp: setsockopt, expand some #defines
  2020-05-26 16:40 ` [PATCH v3 net-next 1/8] sctp: setsockopt, expand some #defines David Laight
@ 2020-05-26 16:44   ` David Laight
  2020-05-26 22:36     ` David Miller
  0 siblings, 1 reply; 5+ messages in thread
From: David Laight @ 2020-05-26 16:44 UTC (permalink / raw)
  To: David Laight, 'Vlad Yasevich', 'Neil Horman',
	'David S. Miller', 'Jakub Kicinski',
	'linux-sctp@vger.kernel.org',
	'netdev@vger.kernel.org', 'Christoph Hellwig',
	'Marcelo Ricardo Leitner'

VGhpcyBzaG91bGQgYmUgMy84Lg0KDQo+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+IEZy
b206IG5ldGRldi1vd25lckB2Z2VyLmtlcm5lbC5vcmcgPG5ldGRldi1vd25lckB2Z2VyLmtlcm5l
bC5vcmc+IE9uIEJlaGFsZiBPZiBEYXZpZCBMYWlnaHQNCj4gU2VudDogMjYgTWF5IDIwMjAgMTc6
NDANCj4gVG86ICdWbGFkIFlhc2V2aWNoJyA8dnlhc2V2aWNoQGdtYWlsLmNvbT47ICdOZWlsIEhv
cm1hbicgPG5ob3JtYW5AdHV4ZHJpdmVyLmNvbT47ICdEYXZpZCBTLiBNaWxsZXInDQo+IDxkYXZl
bUBkYXZlbWxvZnQubmV0PjsgJ0pha3ViIEtpY2luc2tpJyA8a3ViYUBrZXJuZWwub3JnPjsgJ2xp
bnV4LXNjdHBAdmdlci5rZXJuZWwub3JnJyA8bGludXgtDQo+IHNjdHBAdmdlci5rZXJuZWwub3Jn
PjsgJ25ldGRldkB2Z2VyLmtlcm5lbC5vcmcnIDxuZXRkZXZAdmdlci5rZXJuZWwub3JnPjsgJ0No
cmlzdG9waCBIZWxsd2lnJw0KPiA8aGNoQGxzdC5kZT47ICdNYXJjZWxvIFJpY2FyZG8gTGVpdG5l
cicgPG1hcmNlbG8ubGVpdG5lckBnbWFpbC5jb20+DQo+IFN1YmplY3Q6IFtQQVRDSCB2MyBuZXQt
bmV4dCAxLzhdIHNjdHA6IHNldHNvY2tvcHQsIGV4cGFuZCBzb21lICNkZWZpbmVzDQo+IA0KPiBF
eHBhbmQgdGhlICNkZWZpbmUgZm9vICgqZm9vKSB1c2VkIHRvIHNpbXBsaWZ5IHRoZSBwcmV2aW91
cyBwYXRjaC4NCj4gRG9lc24ndCBjaGFuZ2UgdGhlIGdlbmVyYXRlZCBjb2RlLg0KPiANCj4gU2ln
bmVkLW9mZi1ieTogRGF2aWQgTGFpZ2h0IDxkYXZpZC5sYWlnaHRAYWN1bGFiLmNvbT4NCj4gDQo+
IC0tLQ0KPiAgbmV0L3NjdHAvc29ja2V0LmMgfCA2ODcgKysrKysrKysrKysrKysrKysrKysrKysr
KystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQo+ICAxIGZpbGUgY2hhbmdlZCwgMzMxIGlu
c2VydGlvbnMoKyksIDM1NiBkZWxldGlvbnMoLSkNCj4gDQo+IGRpZmYgLS1naXQgYS9uZXQvc2N0
cC9zb2NrZXQuYyBiL25ldC9zY3RwL3NvY2tldC5jDQo+IGluZGV4IDYzOWQ3ZGEuLmI4MDY4ZGEg
MTAwNjQ0DQo+IC0tLSBhL25ldC9zY3RwL3NvY2tldC5jDQo+ICsrKyBiL25ldC9zY3RwL3NvY2tl
dC5jDQo+IEBAIC0yNTg1LDkgKzI1ODUsOCBAQCBzdGF0aWMgaW50IHNjdHBfYXBwbHlfcGVlcl9h
ZGRyX3BhcmFtcyhzdHJ1Y3Qgc2N0cF9wYWRkcnBhcmFtcyAqcGFyYW1zLA0KPiAgCXJldHVybiAw
Ow0KPiAgfQ0KPiANCj4gLSNkZWZpbmUgcGFyYW1zICgqcGFyYW1zKQ0KPiAgc3RhdGljIGludCBz
Y3RwX3NldHNvY2tvcHRfcGVlcl9hZGRyX3BhcmFtcyhzdHJ1Y3Qgc29jayAqc2ssDQo+IC0JCQkJ
CSAgICBzdHJ1Y3Qgc2N0cF9wYWRkcnBhcmFtcyBwYXJhbXMsDQo+ICsJCQkJCSAgICBzdHJ1Y3Qg
c2N0cF9wYWRkcnBhcmFtcyAqcGFyYW1zLA0KPiAgCQkJCQkgICAgdW5zaWduZWQgaW50IG9wdGxl
bikNCj4gIHsNCj4gIAlzdHJ1Y3Qgc2N0cF90cmFuc3BvcnQgICAqdHJhbnMgPSBOVUxMOw0KPiBA
QCAtMjU5NiwzMyArMjU5NSwzMyBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9wZWVyX2Fk
ZHJfcGFyYW1zKHN0cnVjdCBzb2NrICpzaywNCj4gIAlpbnQgZXJyb3I7DQo+ICAJaW50IGhiX2No
YW5nZSwgcG10dWRfY2hhbmdlLCBzYWNrZGVsYXlfY2hhbmdlOw0KPiANCj4gLQlpZiAob3B0bGVu
ICE9IHNpemVvZihwYXJhbXMpKSB7DQo+ICsJaWYgKG9wdGxlbiAhPSBzaXplb2YoKnBhcmFtcykp
IHsNCj4gIAkJaWYgKG9wdGxlbiAhPSBBTElHTihvZmZzZXRvZihzdHJ1Y3Qgc2N0cF9wYWRkcnBh
cmFtcywNCj4gIAkJCQkJCSAgICBzcHBfaXB2Nl9mbG93bGFiZWwpLCA0KSkNCj4gIAkJCXJldHVy
biAtRUlOVkFMOw0KPiAtCQlpZiAocGFyYW1zLnNwcF9mbGFncyAmIChTUFBfRFNDUCB8IFNQUF9J
UFY2X0ZMT1dMQUJFTCkpDQo+ICsJCWlmIChwYXJhbXMtPnNwcF9mbGFncyAmIChTUFBfRFNDUCB8
IFNQUF9JUFY2X0ZMT1dMQUJFTCkpDQo+ICAJCQlyZXR1cm4gLUVJTlZBTDsNCj4gIAl9DQo+IA0K
PiAgCS8qIFZhbGlkYXRlIGZsYWdzIGFuZCB2YWx1ZSBwYXJhbWV0ZXJzLiAqLw0KPiAtCWhiX2No
YW5nZSAgICAgICAgPSBwYXJhbXMuc3BwX2ZsYWdzICYgU1BQX0hCOw0KPiAtCXBtdHVkX2NoYW5n
ZSAgICAgPSBwYXJhbXMuc3BwX2ZsYWdzICYgU1BQX1BNVFVEOw0KPiAtCXNhY2tkZWxheV9jaGFu
Z2UgPSBwYXJhbXMuc3BwX2ZsYWdzICYgU1BQX1NBQ0tERUxBWTsNCj4gKwloYl9jaGFuZ2UgICAg
ICAgID0gcGFyYW1zLT5zcHBfZmxhZ3MgJiBTUFBfSEI7DQo+ICsJcG10dWRfY2hhbmdlICAgICA9
IHBhcmFtcy0+c3BwX2ZsYWdzICYgU1BQX1BNVFVEOw0KPiArCXNhY2tkZWxheV9jaGFuZ2UgPSBw
YXJhbXMtPnNwcF9mbGFncyAmIFNQUF9TQUNLREVMQVk7DQo+IA0KPiAgCWlmIChoYl9jaGFuZ2Ug
ICAgICAgID09IFNQUF9IQiB8fA0KPiAgCSAgICBwbXR1ZF9jaGFuZ2UgICAgID09IFNQUF9QTVRV
RCB8fA0KPiAgCSAgICBzYWNrZGVsYXlfY2hhbmdlID09IFNQUF9TQUNLREVMQVkgfHwNCj4gLQkg
ICAgcGFyYW1zLnNwcF9zYWNrZGVsYXkgPiA1MDAgfHwNCj4gLQkgICAgKHBhcmFtcy5zcHBfcGF0
aG10dSAmJg0KPiAtCSAgICAgcGFyYW1zLnNwcF9wYXRobXR1IDwgU0NUUF9ERUZBVUxUX01JTlNF
R01FTlQpKQ0KPiArCSAgICBwYXJhbXMtPnNwcF9zYWNrZGVsYXkgPiA1MDAgfHwNCj4gKwkgICAg
KHBhcmFtcy0+c3BwX3BhdGhtdHUgJiYNCj4gKwkgICAgIHBhcmFtcy0+c3BwX3BhdGhtdHUgPCBT
Q1RQX0RFRkFVTFRfTUlOU0VHTUVOVCkpDQo+ICAJCXJldHVybiAtRUlOVkFMOw0KPiANCj4gIAkv
KiBJZiBhbiBhZGRyZXNzIG90aGVyIHRoYW4gSU5BRERSX0FOWSBpcyBzcGVjaWZpZWQsIGFuZA0K
PiAgCSAqIG5vIHRyYW5zcG9ydCBpcyBmb3VuZCwgdGhlbiB0aGUgcmVxdWVzdCBpcyBpbnZhbGlk
Lg0KPiAgCSAqLw0KPiAtCWlmICghc2N0cF9pc19hbnkoc2ssICh1bmlvbiBzY3RwX2FkZHIgKikm
cGFyYW1zLnNwcF9hZGRyZXNzKSkgew0KPiAtCQl0cmFucyA9IHNjdHBfYWRkcl9pZDJ0cmFuc3Bv
cnQoc2ssICZwYXJhbXMuc3BwX2FkZHJlc3MsDQo+IC0JCQkJCSAgICAgICBwYXJhbXMuc3BwX2Fz
c29jX2lkKTsNCj4gKwlpZiAoIXNjdHBfaXNfYW55KHNrLCAodW5pb24gc2N0cF9hZGRyICopJnBh
cmFtcy0+c3BwX2FkZHJlc3MpKSB7DQo+ICsJCXRyYW5zID0gc2N0cF9hZGRyX2lkMnRyYW5zcG9y
dChzaywgJnBhcmFtcy0+c3BwX2FkZHJlc3MsDQo+ICsJCQkJCSAgICAgICBwYXJhbXMtPnNwcF9h
c3NvY19pZCk7DQo+ICAJCWlmICghdHJhbnMpDQo+ICAJCQlyZXR1cm4gLUVJTlZBTDsNCj4gIAl9
DQo+IEBAIC0yNjMxLDE5ICsyNjMwLDE5IEBAIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3Bl
ZXJfYWRkcl9wYXJhbXMoc3RydWN0IHNvY2sgKnNrLA0KPiAgCSAqIHNvY2tldCBpcyBhIG9uZSB0
byBtYW55IHN0eWxlIHNvY2tldCwgYW5kIGFuIGFzc29jaWF0aW9uDQo+ICAJICogd2FzIG5vdCBm
b3VuZCwgdGhlbiB0aGUgaWQgd2FzIGludmFsaWQuDQo+ICAJICovDQo+IC0JYXNvYyA9IHNjdHBf
aWQyYXNzb2Moc2ssIHBhcmFtcy5zcHBfYXNzb2NfaWQpOw0KPiAtCWlmICghYXNvYyAmJiBwYXJh
bXMuc3BwX2Fzc29jX2lkICE9IFNDVFBfRlVUVVJFX0FTU09DICYmDQo+ICsJYXNvYyA9IHNjdHBf
aWQyYXNzb2Moc2ssIHBhcmFtcy0+c3BwX2Fzc29jX2lkKTsNCj4gKwlpZiAoIWFzb2MgJiYgcGFy
YW1zLT5zcHBfYXNzb2NfaWQgIT0gU0NUUF9GVVRVUkVfQVNTT0MgJiYNCj4gIAkgICAgc2N0cF9z
dHlsZShzaywgVURQKSkNCj4gIAkJcmV0dXJuIC1FSU5WQUw7DQo+IA0KPiAgCS8qIEhlYXJ0YmVh
dCBkZW1hbmQgY2FuIG9ubHkgYmUgc2VudCBvbiBhIHRyYW5zcG9ydCBvcg0KPiAgCSAqIGFzc29j
aWF0aW9uLCBidXQgbm90IGEgc29ja2V0Lg0KPiAgCSAqLw0KPiAtCWlmIChwYXJhbXMuc3BwX2Zs
YWdzICYgU1BQX0hCX0RFTUFORCAmJiAhdHJhbnMgJiYgIWFzb2MpDQo+ICsJaWYgKHBhcmFtcy0+
c3BwX2ZsYWdzICYgU1BQX0hCX0RFTUFORCAmJiAhdHJhbnMgJiYgIWFzb2MpDQo+ICAJCXJldHVy
biAtRUlOVkFMOw0KPiANCj4gIAkvKiBQcm9jZXNzIHBhcmFtZXRlcnMuICovDQo+IC0JZXJyb3Ig
PSBzY3RwX2FwcGx5X3BlZXJfYWRkcl9wYXJhbXMoJnBhcmFtcywgdHJhbnMsIGFzb2MsIHNwLA0K
PiArCWVycm9yID0gc2N0cF9hcHBseV9wZWVyX2FkZHJfcGFyYW1zKHBhcmFtcywgdHJhbnMsIGFz
b2MsIHNwLA0KPiAgCQkJCQkgICAgaGJfY2hhbmdlLCBwbXR1ZF9jaGFuZ2UsDQo+ICAJCQkJCSAg
ICBzYWNrZGVsYXlfY2hhbmdlKTsNCj4gDQo+IEBAIC0yNjU2LDcgKzI2NTUsNyBAQCBzdGF0aWMg
aW50IHNjdHBfc2V0c29ja29wdF9wZWVyX2FkZHJfcGFyYW1zKHN0cnVjdCBzb2NrICpzaywNCj4g
IAlpZiAoIXRyYW5zICYmIGFzb2MpIHsNCj4gIAkJbGlzdF9mb3JfZWFjaF9lbnRyeSh0cmFucywg
JmFzb2MtPnBlZXIudHJhbnNwb3J0X2FkZHJfbGlzdCwNCj4gIAkJCQl0cmFuc3BvcnRzKSB7DQo+
IC0JCQlzY3RwX2FwcGx5X3BlZXJfYWRkcl9wYXJhbXMoJnBhcmFtcywgdHJhbnMsIGFzb2MsIHNw
LA0KPiArCQkJc2N0cF9hcHBseV9wZWVyX2FkZHJfcGFyYW1zKHBhcmFtcywgdHJhbnMsIGFzb2Ms
IHNwLA0KPiAgCQkJCQkJICAgIGhiX2NoYW5nZSwgcG10dWRfY2hhbmdlLA0KPiAgCQkJCQkJICAg
IHNhY2tkZWxheV9jaGFuZ2UpOw0KPiAgCQl9DQo+IEBAIC0yNjY0LDcgKzI2NjMsNiBAQCBzdGF0
aWMgaW50IHNjdHBfc2V0c29ja29wdF9wZWVyX2FkZHJfcGFyYW1zKHN0cnVjdCBzb2NrICpzaywN
Cj4gDQo+ICAJcmV0dXJuIDA7DQo+ICB9DQo+IC0jdW5kZWYgcGFyYW1zDQo+IA0KPiAgc3RhdGlj
IGlubGluZSBfX3UzMiBzY3RwX3NwcF9zYWNrZGVsYXlfZW5hYmxlKF9fdTMyIHBhcmFtX2ZsYWdz
KQ0KPiAgew0KPiBAQCAtMjc0OSwxNiArMjc0NywxNSBAQCBzdGF0aWMgdm9pZCBzY3RwX2FwcGx5
X2Fzb2NfZGVsYXllZF9hY2soc3RydWN0IHNjdHBfc2Fja19pbmZvICpwYXJhbXMsDQo+ICAgKiAg
ICB2YWx1ZSB0byAxIHdpbGwgZGlzYWJsZSB0aGUgZGVsYXllZCBzYWNrIGFsZ29yaXRobS4NCj4g
ICAqLw0KPiANCj4gLSNkZWZpbmUgcGFyYW1zICgqcGFyYW1zKQ0KPiAgc3RhdGljIGludCBzY3Rw
X3NldHNvY2tvcHRfZGVsYXllZF9hY2soc3RydWN0IHNvY2sgKnNrLA0KPiAtCQkJCSAgICAgICBz
dHJ1Y3Qgc2N0cF9zYWNrX2luZm8gcGFyYW1zLA0KPiArCQkJCSAgICAgICBzdHJ1Y3Qgc2N0cF9z
YWNrX2luZm8gKnBhcmFtcywNCj4gIAkJCQkgICAgICAgdW5zaWduZWQgaW50IG9wdGxlbikNCj4g
IHsNCj4gIAlzdHJ1Y3Qgc2N0cF9zb2NrICpzcCA9IHNjdHBfc2soc2spOw0KPiAgCXN0cnVjdCBz
Y3RwX2Fzc29jaWF0aW9uICphc29jOw0KPiANCj4gIAlpZiAob3B0bGVuID09IHNpemVvZihzdHJ1
Y3Qgc2N0cF9zYWNrX2luZm8pKSB7DQo+IC0JCWlmIChwYXJhbXMuc2Fja19kZWxheSA9PSAwICYm
IHBhcmFtcy5zYWNrX2ZyZXEgPT0gMCkNCj4gKwkJaWYgKHBhcmFtcy0+c2Fja19kZWxheSA9PSAw
ICYmIHBhcmFtcy0+c2Fja19mcmVxID09IDApDQo+ICAJCQlyZXR1cm4gMDsNCj4gIAl9IGVsc2Ug
aWYgKG9wdGxlbiA9PSBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfdmFsdWUpKSB7DQo+ICAJCXBy
X3dhcm5fcmF0ZWxpbWl0ZWQoREVQUkVDQVRFRA0KPiBAQCAtMjc2Niw1NiArMjc2Myw1NiBAQCBz
dGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9kZWxheWVkX2FjayhzdHJ1Y3Qgc29jayAqc2ssDQo+
ICAJCQkJICAgICJVc2Ugb2Ygc3RydWN0IHNjdHBfYXNzb2NfdmFsdWUgaW4gZGVsYXllZF9hY2sg
c29ja2V0IG9wdGlvbi5cbiINCj4gIAkJCQkgICAgIlVzZSBzdHJ1Y3Qgc2N0cF9zYWNrX2luZm8g
aW5zdGVhZFxuIiwNCj4gIAkJCQkgICAgY3VycmVudC0+Y29tbSwgdGFza19waWRfbnIoY3VycmVu
dCkpOw0KPiAtCQlpZiAocGFyYW1zLnNhY2tfZGVsYXkgPT0gMCkNCj4gLQkJCXBhcmFtcy5zYWNr
X2ZyZXEgPSAxOw0KPiArCQlpZiAocGFyYW1zLT5zYWNrX2RlbGF5ID09IDApDQo+ICsJCQlwYXJh
bXMtPnNhY2tfZnJlcSA9IDE7DQo+ICAJCWVsc2UNCj4gLQkJCXBhcmFtcy5zYWNrX2ZyZXEgPSAw
Ow0KPiArCQkJcGFyYW1zLT5zYWNrX2ZyZXEgPSAwOw0KPiAgCX0gZWxzZQ0KPiAgCQlyZXR1cm4g
LUVJTlZBTDsNCj4gDQo+ICAJLyogVmFsaWRhdGUgdmFsdWUgcGFyYW1ldGVyLiAqLw0KPiAtCWlm
IChwYXJhbXMuc2Fja19kZWxheSA+IDUwMCkNCj4gKwlpZiAocGFyYW1zLT5zYWNrX2RlbGF5ID4g
NTAwKQ0KPiAgCQlyZXR1cm4gLUVJTlZBTDsNCj4gDQo+ICAJLyogR2V0IGFzc29jaWF0aW9uLCBp
ZiBzYWNrX2Fzc29jX2lkICE9IFNDVFBfRlVUVVJFX0FTU09DIGFuZCB0aGUNCj4gIAkgKiBzb2Nr
ZXQgaXMgYSBvbmUgdG8gbWFueSBzdHlsZSBzb2NrZXQsIGFuZCBhbiBhc3NvY2lhdGlvbg0KPiAg
CSAqIHdhcyBub3QgZm91bmQsIHRoZW4gdGhlIGlkIHdhcyBpbnZhbGlkLg0KPiAgCSAqLw0KPiAt
CWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCBwYXJhbXMuc2Fja19hc3NvY19pZCk7DQo+IC0JaWYg
KCFhc29jICYmIHBhcmFtcy5zYWNrX2Fzc29jX2lkID4gU0NUUF9BTExfQVNTT0MgJiYNCj4gKwlh
c29jID0gc2N0cF9pZDJhc3NvYyhzaywgcGFyYW1zLT5zYWNrX2Fzc29jX2lkKTsNCj4gKwlpZiAo
IWFzb2MgJiYgcGFyYW1zLT5zYWNrX2Fzc29jX2lkID4gU0NUUF9BTExfQVNTT0MgJiYNCj4gIAkg
ICAgc2N0cF9zdHlsZShzaywgVURQKSkNCj4gIAkJcmV0dXJuIC1FSU5WQUw7DQo+IA0KPiAgCWlm
IChhc29jKSB7DQo+IC0JCXNjdHBfYXBwbHlfYXNvY19kZWxheWVkX2FjaygmcGFyYW1zLCBhc29j
KTsNCj4gKwkJc2N0cF9hcHBseV9hc29jX2RlbGF5ZWRfYWNrKHBhcmFtcywgYXNvYyk7DQo+IA0K
PiAgCQlyZXR1cm4gMDsNCj4gIAl9DQo+IA0KPiAgCWlmIChzY3RwX3N0eWxlKHNrLCBUQ1ApKQ0K
PiAtCQlwYXJhbXMuc2Fja19hc3NvY19pZCA9IFNDVFBfRlVUVVJFX0FTU09DOw0KPiArCQlwYXJh
bXMtPnNhY2tfYXNzb2NfaWQgPSBTQ1RQX0ZVVFVSRV9BU1NPQzsNCj4gDQo+IC0JaWYgKHBhcmFt
cy5zYWNrX2Fzc29jX2lkID09IFNDVFBfRlVUVVJFX0FTU09DIHx8DQo+IC0JICAgIHBhcmFtcy5z
YWNrX2Fzc29jX2lkID09IFNDVFBfQUxMX0FTU09DKSB7DQo+IC0JCWlmIChwYXJhbXMuc2Fja19k
ZWxheSkgew0KPiAtCQkJc3AtPnNhY2tkZWxheSA9IHBhcmFtcy5zYWNrX2RlbGF5Ow0KPiArCWlm
IChwYXJhbXMtPnNhY2tfYXNzb2NfaWQgPT0gU0NUUF9GVVRVUkVfQVNTT0MgfHwNCj4gKwkgICAg
cGFyYW1zLT5zYWNrX2Fzc29jX2lkID09IFNDVFBfQUxMX0FTU09DKSB7DQo+ICsJCWlmIChwYXJh
bXMtPnNhY2tfZGVsYXkpIHsNCj4gKwkJCXNwLT5zYWNrZGVsYXkgPSBwYXJhbXMtPnNhY2tfZGVs
YXk7DQo+ICAJCQlzcC0+cGFyYW1fZmxhZ3MgPQ0KPiAgCQkJCXNjdHBfc3BwX3NhY2tkZWxheV9l
bmFibGUoc3AtPnBhcmFtX2ZsYWdzKTsNCj4gIAkJfQ0KPiAtCQlpZiAocGFyYW1zLnNhY2tfZnJl
cSA9PSAxKSB7DQo+ICsJCWlmIChwYXJhbXMtPnNhY2tfZnJlcSA9PSAxKSB7DQo+ICAJCQlzcC0+
cGFyYW1fZmxhZ3MgPQ0KPiAgCQkJCXNjdHBfc3BwX3NhY2tkZWxheV9kaXNhYmxlKHNwLT5wYXJh
bV9mbGFncyk7DQo+IC0JCX0gZWxzZSBpZiAocGFyYW1zLnNhY2tfZnJlcSA+IDEpIHsNCj4gLQkJ
CXNwLT5zYWNrZnJlcSA9IHBhcmFtcy5zYWNrX2ZyZXE7DQo+ICsJCX0gZWxzZSBpZiAocGFyYW1z
LT5zYWNrX2ZyZXEgPiAxKSB7DQo+ICsJCQlzcC0+c2Fja2ZyZXEgPSBwYXJhbXMtPnNhY2tfZnJl
cTsNCj4gIAkJCXNwLT5wYXJhbV9mbGFncyA9DQo+ICAJCQkJc2N0cF9zcHBfc2Fja2RlbGF5X2Vu
YWJsZShzcC0+cGFyYW1fZmxhZ3MpOw0KPiAgCQl9DQo+ICAJfQ0KPiANCj4gLQlpZiAocGFyYW1z
LnNhY2tfYXNzb2NfaWQgPT0gU0NUUF9DVVJSRU5UX0FTU09DIHx8DQo+IC0JICAgIHBhcmFtcy5z
YWNrX2Fzc29jX2lkID09IFNDVFBfQUxMX0FTU09DKQ0KPiArCWlmIChwYXJhbXMtPnNhY2tfYXNz
b2NfaWQgPT0gU0NUUF9DVVJSRU5UX0FTU09DIHx8DQo+ICsJICAgIHBhcmFtcy0+c2Fja19hc3Nv
Y19pZCA9PSBTQ1RQX0FMTF9BU1NPQykNCj4gIAkJbGlzdF9mb3JfZWFjaF9lbnRyeShhc29jLCAm
c3AtPmVwLT5hc29jcywgYXNvY3MpDQo+IC0JCQlzY3RwX2FwcGx5X2Fzb2NfZGVsYXllZF9hY2so
JnBhcmFtcywgYXNvYyk7DQo+ICsJCQlzY3RwX2FwcGx5X2Fzb2NfZGVsYXllZF9hY2socGFyYW1z
LCBhc29jKTsNCj4gDQo+ICAJcmV0dXJuIDA7DQo+ICB9DQo+IEBAIC0yODMxLDggKzI4MjgsNyBA
QCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9kZWxheWVkX2FjayhzdHJ1Y3Qgc29jayAqc2ss
DQo+ICAgKiBieSB0aGUgY2hhbmdlKS4gIFdpdGggVENQLXN0eWxlIHNvY2tldHMsIHRoaXMgb3B0
aW9uIGlzIGluaGVyaXRlZCBieQ0KPiAgICogc29ja2V0cyBkZXJpdmVkIGZyb20gYSBsaXN0ZW5l
ciBzb2NrZXQuDQo+ICAgKi8NCj4gLSNkZWZpbmUgc2luaXQgKCpzaW5pdCkNCj4gLXN0YXRpYyBp
bnQgc2N0cF9zZXRzb2Nrb3B0X2luaXRtc2coc3RydWN0IHNvY2sgKnNrLCBzdHJ1Y3Qgc2N0cF9p
bml0bXNnIHNpbml0LA0KPiArc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfaW5pdG1zZyhzdHJ1
Y3Qgc29jayAqc2ssIHN0cnVjdCBzY3RwX2luaXRtc2cgKnNpbml0LA0KPiAgCQkJCSAgIHVuc2ln
bmVkIGludCBvcHRsZW4pDQo+ICB7DQo+ICAJc3RydWN0IHNjdHBfc29jayAqc3AgPSBzY3RwX3Nr
KHNrKTsNCj4gQEAgLTI4NDAsMTggKzI4MzYsMTcgQEAgc3RhdGljIGludCBzY3RwX3NldHNvY2tv
cHRfaW5pdG1zZyhzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzY3RwX2luaXRtc2cgc2luaXQsDQo+
ICAJaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IHNjdHBfaW5pdG1zZykpDQo+ICAJCXJldHVy
biAtRUlOVkFMOw0KPiANCj4gLQlpZiAoc2luaXQuc2luaXRfbnVtX29zdHJlYW1zKQ0KPiAtCQlz
cC0+aW5pdG1zZy5zaW5pdF9udW1fb3N0cmVhbXMgPSBzaW5pdC5zaW5pdF9udW1fb3N0cmVhbXM7
DQo+IC0JaWYgKHNpbml0LnNpbml0X21heF9pbnN0cmVhbXMpDQo+IC0JCXNwLT5pbml0bXNnLnNp
bml0X21heF9pbnN0cmVhbXMgPSBzaW5pdC5zaW5pdF9tYXhfaW5zdHJlYW1zOw0KPiAtCWlmIChz
aW5pdC5zaW5pdF9tYXhfYXR0ZW1wdHMpDQo+IC0JCXNwLT5pbml0bXNnLnNpbml0X21heF9hdHRl
bXB0cyA9IHNpbml0LnNpbml0X21heF9hdHRlbXB0czsNCj4gLQlpZiAoc2luaXQuc2luaXRfbWF4
X2luaXRfdGltZW8pDQo+IC0JCXNwLT5pbml0bXNnLnNpbml0X21heF9pbml0X3RpbWVvID0gc2lu
aXQuc2luaXRfbWF4X2luaXRfdGltZW87DQo+ICsJaWYgKHNpbml0LT5zaW5pdF9udW1fb3N0cmVh
bXMpDQo+ICsJCXNwLT5pbml0bXNnLnNpbml0X251bV9vc3RyZWFtcyA9IHNpbml0LT5zaW5pdF9u
dW1fb3N0cmVhbXM7DQo+ICsJaWYgKHNpbml0LT5zaW5pdF9tYXhfaW5zdHJlYW1zKQ0KPiArCQlz
cC0+aW5pdG1zZy5zaW5pdF9tYXhfaW5zdHJlYW1zID0gc2luaXQtPnNpbml0X21heF9pbnN0cmVh
bXM7DQo+ICsJaWYgKHNpbml0LT5zaW5pdF9tYXhfYXR0ZW1wdHMpDQo+ICsJCXNwLT5pbml0bXNn
LnNpbml0X21heF9hdHRlbXB0cyA9IHNpbml0LT5zaW5pdF9tYXhfYXR0ZW1wdHM7DQo+ICsJaWYg
KHNpbml0LT5zaW5pdF9tYXhfaW5pdF90aW1lbykNCj4gKwkJc3AtPmluaXRtc2cuc2luaXRfbWF4
X2luaXRfdGltZW8gPSBzaW5pdC0+c2luaXRfbWF4X2luaXRfdGltZW87DQo+IA0KPiAgCXJldHVy
biAwOw0KPiAgfQ0KPiAtI3VuZGVmIHNpbml0DQo+IA0KPiAgLyoNCj4gICAqIDcuMS4xNCBTZXQg
ZGVmYXVsdCBzZW5kIHBhcmFtZXRlcnMgKFNDVFBfREVGQVVMVF9TRU5EX1BBUkFNKQ0KPiBAQCAt
Mjg2Nyw1NiArMjg2Miw1NSBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9pbml0bXNnKHN0
cnVjdCBzb2NrICpzaywgc3RydWN0IHNjdHBfaW5pdG1zZyBzaW5pdCwNCj4gICAqICAgc2luZm9f
dGltZXRvbGl2ZS4gIFRoZSB1c2VyIG11c3QgcHJvdmlkZSB0aGUgc2luZm9fYXNzb2NfaWQgZmll
bGQgaW4NCj4gICAqICAgdG8gdGhpcyBjYWxsIGlmIHRoZSBjYWxsZXIgaXMgdXNpbmcgdGhlIFVE
UCBtb2RlbC4NCj4gICAqLw0KPiAtI2RlZmluZSBpbmZvICgqaW5mbykNCj4gIHN0YXRpYyBpbnQg
c2N0cF9zZXRzb2Nrb3B0X2RlZmF1bHRfc2VuZF9wYXJhbShzdHJ1Y3Qgc29jayAqc2ssDQo+IC0J
CQkJCSAgICAgIHN0cnVjdCBzY3RwX3NuZHJjdmluZm8gaW5mbywNCj4gKwkJCQkJICAgICAgc3Ry
dWN0IHNjdHBfc25kcmN2aW5mbyAqaW5mbywNCj4gIAkJCQkJICAgICAgdW5zaWduZWQgaW50IG9w
dGxlbikNCj4gIHsNCj4gIAlzdHJ1Y3Qgc2N0cF9zb2NrICpzcCA9IHNjdHBfc2soc2spOw0KPiAg
CXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOw0KPiANCj4gLQlpZiAob3B0bGVuICE9IHNp
emVvZihpbmZvKSkNCj4gKwlpZiAob3B0bGVuICE9IHNpemVvZigqaW5mbykpDQo+ICAJCXJldHVy
biAtRUlOVkFMOw0KPiAtCWlmIChpbmZvLnNpbmZvX2ZsYWdzICYNCj4gKwlpZiAoaW5mby0+c2lu
Zm9fZmxhZ3MgJg0KPiAgCSAgICB+KFNDVFBfVU5PUkRFUkVEIHwgU0NUUF9BRERSX09WRVIgfA0K
PiAgCSAgICAgIFNDVFBfQUJPUlQgfCBTQ1RQX0VPRikpDQo+ICAJCXJldHVybiAtRUlOVkFMOw0K
PiANCj4gLQlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgaW5mby5zaW5mb19hc3NvY19pZCk7DQo+
IC0JaWYgKCFhc29jICYmIGluZm8uc2luZm9fYXNzb2NfaWQgPiBTQ1RQX0FMTF9BU1NPQyAmJg0K
PiArCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCBpbmZvLT5zaW5mb19hc3NvY19pZCk7DQo+ICsJ
aWYgKCFhc29jICYmIGluZm8tPnNpbmZvX2Fzc29jX2lkID4gU0NUUF9BTExfQVNTT0MgJiYNCj4g
IAkgICAgc2N0cF9zdHlsZShzaywgVURQKSkNCj4gIAkJcmV0dXJuIC1FSU5WQUw7DQo+IA0KPiAg
CWlmIChhc29jKSB7DQo+IC0JCWFzb2MtPmRlZmF1bHRfc3RyZWFtID0gaW5mby5zaW5mb19zdHJl
YW07DQo+IC0JCWFzb2MtPmRlZmF1bHRfZmxhZ3MgPSBpbmZvLnNpbmZvX2ZsYWdzOw0KPiAtCQlh
c29jLT5kZWZhdWx0X3BwaWQgPSBpbmZvLnNpbmZvX3BwaWQ7DQo+IC0JCWFzb2MtPmRlZmF1bHRf
Y29udGV4dCA9IGluZm8uc2luZm9fY29udGV4dDsNCj4gLQkJYXNvYy0+ZGVmYXVsdF90aW1ldG9s
aXZlID0gaW5mby5zaW5mb190aW1ldG9saXZlOw0KPiArCQlhc29jLT5kZWZhdWx0X3N0cmVhbSA9
IGluZm8tPnNpbmZvX3N0cmVhbTsNCj4gKwkJYXNvYy0+ZGVmYXVsdF9mbGFncyA9IGluZm8tPnNp
bmZvX2ZsYWdzOw0KPiArCQlhc29jLT5kZWZhdWx0X3BwaWQgPSBpbmZvLT5zaW5mb19wcGlkOw0K
PiArCQlhc29jLT5kZWZhdWx0X2NvbnRleHQgPSBpbmZvLT5zaW5mb19jb250ZXh0Ow0KPiArCQlh
c29jLT5kZWZhdWx0X3RpbWV0b2xpdmUgPSBpbmZvLT5zaW5mb190aW1ldG9saXZlOw0KPiANCj4g
IAkJcmV0dXJuIDA7DQo+ICAJfQ0KPiANCj4gIAlpZiAoc2N0cF9zdHlsZShzaywgVENQKSkNCj4g
LQkJaW5mby5zaW5mb19hc3NvY19pZCA9IFNDVFBfRlVUVVJFX0FTU09DOw0KPiArCQlpbmZvLT5z
aW5mb19hc3NvY19pZCA9IFNDVFBfRlVUVVJFX0FTU09DOw0KPiANCj4gLQlpZiAoaW5mby5zaW5m
b19hc3NvY19pZCA9PSBTQ1RQX0ZVVFVSRV9BU1NPQyB8fA0KPiAtCSAgICBpbmZvLnNpbmZvX2Fz
c29jX2lkID09IFNDVFBfQUxMX0FTU09DKSB7DQo+IC0JCXNwLT5kZWZhdWx0X3N0cmVhbSA9IGlu
Zm8uc2luZm9fc3RyZWFtOw0KPiAtCQlzcC0+ZGVmYXVsdF9mbGFncyA9IGluZm8uc2luZm9fZmxh
Z3M7DQo+IC0JCXNwLT5kZWZhdWx0X3BwaWQgPSBpbmZvLnNpbmZvX3BwaWQ7DQo+IC0JCXNwLT5k
ZWZhdWx0X2NvbnRleHQgPSBpbmZvLnNpbmZvX2NvbnRleHQ7DQo+IC0JCXNwLT5kZWZhdWx0X3Rp
bWV0b2xpdmUgPSBpbmZvLnNpbmZvX3RpbWV0b2xpdmU7DQo+ICsJaWYgKGluZm8tPnNpbmZvX2Fz
c29jX2lkID09IFNDVFBfRlVUVVJFX0FTU09DIHx8DQo+ICsJICAgIGluZm8tPnNpbmZvX2Fzc29j
X2lkID09IFNDVFBfQUxMX0FTU09DKSB7DQo+ICsJCXNwLT5kZWZhdWx0X3N0cmVhbSA9IGluZm8t
PnNpbmZvX3N0cmVhbTsNCj4gKwkJc3AtPmRlZmF1bHRfZmxhZ3MgPSBpbmZvLT5zaW5mb19mbGFn
czsNCj4gKwkJc3AtPmRlZmF1bHRfcHBpZCA9IGluZm8tPnNpbmZvX3BwaWQ7DQo+ICsJCXNwLT5k
ZWZhdWx0X2NvbnRleHQgPSBpbmZvLT5zaW5mb19jb250ZXh0Ow0KPiArCQlzcC0+ZGVmYXVsdF90
aW1ldG9saXZlID0gaW5mby0+c2luZm9fdGltZXRvbGl2ZTsNCj4gIAl9DQo+IA0KPiAtCWlmIChp
bmZvLnNpbmZvX2Fzc29jX2lkID09IFNDVFBfQ1VSUkVOVF9BU1NPQyB8fA0KPiAtCSAgICBpbmZv
LnNpbmZvX2Fzc29jX2lkID09IFNDVFBfQUxMX0FTU09DKSB7DQo+ICsJaWYgKGluZm8tPnNpbmZv
X2Fzc29jX2lkID09IFNDVFBfQ1VSUkVOVF9BU1NPQyB8fA0KPiArCSAgICBpbmZvLT5zaW5mb19h
c3NvY19pZCA9PSBTQ1RQX0FMTF9BU1NPQykgew0KPiAgCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFz
b2MsICZzcC0+ZXAtPmFzb2NzLCBhc29jcykgew0KPiAtCQkJYXNvYy0+ZGVmYXVsdF9zdHJlYW0g
PSBpbmZvLnNpbmZvX3N0cmVhbTsNCj4gLQkJCWFzb2MtPmRlZmF1bHRfZmxhZ3MgPSBpbmZvLnNp
bmZvX2ZsYWdzOw0KPiAtCQkJYXNvYy0+ZGVmYXVsdF9wcGlkID0gaW5mby5zaW5mb19wcGlkOw0K
PiAtCQkJYXNvYy0+ZGVmYXVsdF9jb250ZXh0ID0gaW5mby5zaW5mb19jb250ZXh0Ow0KPiAtCQkJ
YXNvYy0+ZGVmYXVsdF90aW1ldG9saXZlID0gaW5mby5zaW5mb190aW1ldG9saXZlOw0KPiArCQkJ
YXNvYy0+ZGVmYXVsdF9zdHJlYW0gPSBpbmZvLT5zaW5mb19zdHJlYW07DQo+ICsJCQlhc29jLT5k
ZWZhdWx0X2ZsYWdzID0gaW5mby0+c2luZm9fZmxhZ3M7DQo+ICsJCQlhc29jLT5kZWZhdWx0X3Bw
aWQgPSBpbmZvLT5zaW5mb19wcGlkOw0KPiArCQkJYXNvYy0+ZGVmYXVsdF9jb250ZXh0ID0gaW5m
by0+c2luZm9fY29udGV4dDsNCj4gKwkJCWFzb2MtPmRlZmF1bHRfdGltZXRvbGl2ZSA9IGluZm8t
PnNpbmZvX3RpbWV0b2xpdmU7DQo+ICAJCX0NCj4gIAl9DQo+IA0KPiBAQCAtMjkyNyw1MSArMjky
MSw1MSBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9kZWZhdWx0X3NlbmRfcGFyYW0oc3Ry
dWN0IHNvY2sgKnNrLA0KPiAgICogKFNDVFBfREVGQVVMVF9TTkRJTkZPKQ0KPiAgICovDQo+ICBz
dGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9kZWZhdWx0X3NuZGluZm8oc3RydWN0IHNvY2sgKnNr
LA0KPiAtCQkJCQkgICBzdHJ1Y3Qgc2N0cF9zbmRpbmZvIGluZm8sDQo+ICsJCQkJCSAgIHN0cnVj
dCBzY3RwX3NuZGluZm8gKmluZm8sDQo+ICAJCQkJCSAgIHVuc2lnbmVkIGludCBvcHRsZW4pDQo+
ICB7DQo+ICAJc3RydWN0IHNjdHBfc29jayAqc3AgPSBzY3RwX3NrKHNrKTsNCj4gIAlzdHJ1Y3Qg
c2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsNCj4gDQo+IC0JaWYgKG9wdGxlbiAhPSBzaXplb2YoaW5m
bykpDQo+ICsJaWYgKG9wdGxlbiAhPSBzaXplb2YoKmluZm8pKQ0KPiAgCQlyZXR1cm4gLUVJTlZB
TDsNCj4gLQlpZiAoaW5mby5zbmRfZmxhZ3MgJg0KPiArCWlmIChpbmZvLT5zbmRfZmxhZ3MgJg0K
PiAgCSAgICB+KFNDVFBfVU5PUkRFUkVEIHwgU0NUUF9BRERSX09WRVIgfA0KPiAgCSAgICAgIFND
VFBfQUJPUlQgfCBTQ1RQX0VPRikpDQo+ICAJCXJldHVybiAtRUlOVkFMOw0KPiANCj4gLQlhc29j
ID0gc2N0cF9pZDJhc3NvYyhzaywgaW5mby5zbmRfYXNzb2NfaWQpOw0KPiAtCWlmICghYXNvYyAm
JiBpbmZvLnNuZF9hc3NvY19pZCA+IFNDVFBfQUxMX0FTU09DICYmDQo+ICsJYXNvYyA9IHNjdHBf
aWQyYXNzb2Moc2ssIGluZm8tPnNuZF9hc3NvY19pZCk7DQo+ICsJaWYgKCFhc29jICYmIGluZm8t
PnNuZF9hc3NvY19pZCA+IFNDVFBfQUxMX0FTU09DICYmDQo+ICAJICAgIHNjdHBfc3R5bGUoc2ss
IFVEUCkpDQo+ICAJCXJldHVybiAtRUlOVkFMOw0KPiANCj4gIAlpZiAoYXNvYykgew0KPiAtCQlh
c29jLT5kZWZhdWx0X3N0cmVhbSA9IGluZm8uc25kX3NpZDsNCj4gLQkJYXNvYy0+ZGVmYXVsdF9m
bGFncyA9IGluZm8uc25kX2ZsYWdzOw0KPiAtCQlhc29jLT5kZWZhdWx0X3BwaWQgPSBpbmZvLnNu
ZF9wcGlkOw0KPiAtCQlhc29jLT5kZWZhdWx0X2NvbnRleHQgPSBpbmZvLnNuZF9jb250ZXh0Ow0K
PiArCQlhc29jLT5kZWZhdWx0X3N0cmVhbSA9IGluZm8tPnNuZF9zaWQ7DQo+ICsJCWFzb2MtPmRl
ZmF1bHRfZmxhZ3MgPSBpbmZvLT5zbmRfZmxhZ3M7DQo+ICsJCWFzb2MtPmRlZmF1bHRfcHBpZCA9
IGluZm8tPnNuZF9wcGlkOw0KPiArCQlhc29jLT5kZWZhdWx0X2NvbnRleHQgPSBpbmZvLT5zbmRf
Y29udGV4dDsNCj4gDQo+ICAJCXJldHVybiAwOw0KPiAgCX0NCj4gDQo+ICAJaWYgKHNjdHBfc3R5
bGUoc2ssIFRDUCkpDQo+IC0JCWluZm8uc25kX2Fzc29jX2lkID0gU0NUUF9GVVRVUkVfQVNTT0M7
DQo+ICsJCWluZm8tPnNuZF9hc3NvY19pZCA9IFNDVFBfRlVUVVJFX0FTU09DOw0KPiANCj4gLQlp
ZiAoaW5mby5zbmRfYXNzb2NfaWQgPT0gU0NUUF9GVVRVUkVfQVNTT0MgfHwNCj4gLQkgICAgaW5m
by5zbmRfYXNzb2NfaWQgPT0gU0NUUF9BTExfQVNTT0MpIHsNCj4gLQkJc3AtPmRlZmF1bHRfc3Ry
ZWFtID0gaW5mby5zbmRfc2lkOw0KPiAtCQlzcC0+ZGVmYXVsdF9mbGFncyA9IGluZm8uc25kX2Zs
YWdzOw0KPiAtCQlzcC0+ZGVmYXVsdF9wcGlkID0gaW5mby5zbmRfcHBpZDsNCj4gLQkJc3AtPmRl
ZmF1bHRfY29udGV4dCA9IGluZm8uc25kX2NvbnRleHQ7DQo+ICsJaWYgKGluZm8tPnNuZF9hc3Nv
Y19pZCA9PSBTQ1RQX0ZVVFVSRV9BU1NPQyB8fA0KPiArCSAgICBpbmZvLT5zbmRfYXNzb2NfaWQg
PT0gU0NUUF9BTExfQVNTT0MpIHsNCj4gKwkJc3AtPmRlZmF1bHRfc3RyZWFtID0gaW5mby0+c25k
X3NpZDsNCj4gKwkJc3AtPmRlZmF1bHRfZmxhZ3MgPSBpbmZvLT5zbmRfZmxhZ3M7DQo+ICsJCXNw
LT5kZWZhdWx0X3BwaWQgPSBpbmZvLT5zbmRfcHBpZDsNCj4gKwkJc3AtPmRlZmF1bHRfY29udGV4
dCA9IGluZm8tPnNuZF9jb250ZXh0Ow0KPiAgCX0NCj4gDQo+IC0JaWYgKGluZm8uc25kX2Fzc29j
X2lkID09IFNDVFBfQ1VSUkVOVF9BU1NPQyB8fA0KPiAtCSAgICBpbmZvLnNuZF9hc3NvY19pZCA9
PSBTQ1RQX0FMTF9BU1NPQykgew0KPiArCWlmIChpbmZvLT5zbmRfYXNzb2NfaWQgPT0gU0NUUF9D
VVJSRU5UX0FTU09DIHx8DQo+ICsJICAgIGluZm8tPnNuZF9hc3NvY19pZCA9PSBTQ1RQX0FMTF9B
U1NPQykgew0KPiAgCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFzb2MsICZzcC0+ZXAtPmFzb2NzLCBh
c29jcykgew0KPiAtCQkJYXNvYy0+ZGVmYXVsdF9zdHJlYW0gPSBpbmZvLnNuZF9zaWQ7DQo+IC0J
CQlhc29jLT5kZWZhdWx0X2ZsYWdzID0gaW5mby5zbmRfZmxhZ3M7DQo+IC0JCQlhc29jLT5kZWZh
dWx0X3BwaWQgPSBpbmZvLnNuZF9wcGlkOw0KPiAtCQkJYXNvYy0+ZGVmYXVsdF9jb250ZXh0ID0g
aW5mby5zbmRfY29udGV4dDsNCj4gKwkJCWFzb2MtPmRlZmF1bHRfc3RyZWFtID0gaW5mby0+c25k
X3NpZDsNCj4gKwkJCWFzb2MtPmRlZmF1bHRfZmxhZ3MgPSBpbmZvLT5zbmRfZmxhZ3M7DQo+ICsJ
CQlhc29jLT5kZWZhdWx0X3BwaWQgPSBpbmZvLT5zbmRfcHBpZDsNCj4gKwkJCWFzb2MtPmRlZmF1
bHRfY29udGV4dCA9IGluZm8tPnNuZF9jb250ZXh0Ow0KPiAgCQl9DQo+ICAJfQ0KPiANCj4gQEAg
LTI5ODQsOCArMjk3OCw3IEBAIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2RlZmF1bHRfc25k
aW5mbyhzdHJ1Y3Qgc29jayAqc2ssDQo+ICAgKiB0aGUgYXNzb2NpYXRpb24gcHJpbWFyeS4gIFRo
ZSBlbmNsb3NlZCBhZGRyZXNzIG11c3QgYmUgb25lIG9mIHRoZQ0KPiAgICogYXNzb2NpYXRpb24g
cGVlcidzIGFkZHJlc3Nlcy4NCj4gICAqLw0KPiAtI2RlZmluZSBwcmltICgqcHJpbSkNCj4gLXN0
YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3ByaW1hcnlfYWRkcihzdHJ1Y3Qgc29jayAqc2ssIHN0
cnVjdCBzY3RwX3ByaW0gcHJpbSwNCj4gK3N0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3ByaW1h
cnlfYWRkcihzdHJ1Y3Qgc29jayAqc2ssIHN0cnVjdCBzY3RwX3ByaW0gKnByaW0sDQo+ICAJCQkJ
CXVuc2lnbmVkIGludCBvcHRsZW4pDQo+ICB7DQo+ICAJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICp0
cmFuczsNCj4gQEAgLTI5OTYsMTcgKzI5ODksMTcgQEAgc3RhdGljIGludCBzY3RwX3NldHNvY2tv
cHRfcHJpbWFyeV9hZGRyKHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNjdHBfcHJpbQ0KPiBwcmlt
LA0KPiAgCQlyZXR1cm4gLUVJTlZBTDsNCj4gDQo+ICAJLyogQWxsb3cgc2VjdXJpdHkgbW9kdWxl
IHRvIHZhbGlkYXRlIGFkZHJlc3MgYnV0IG5lZWQgYWRkcmVzcyBsZW4uICovDQo+IC0JYWYgPSBz
Y3RwX2dldF9hZl9zcGVjaWZpYyhwcmltLnNzcF9hZGRyLnNzX2ZhbWlseSk7DQo+ICsJYWYgPSBz
Y3RwX2dldF9hZl9zcGVjaWZpYyhwcmltLT5zc3BfYWRkci5zc19mYW1pbHkpOw0KPiAgCWlmICgh
YWYpDQo+ICAJCXJldHVybiAtRUlOVkFMOw0KPiANCj4gIAllcnIgPSBzZWN1cml0eV9zY3RwX2Jp
bmRfY29ubmVjdChzaywgU0NUUF9QUklNQVJZX0FERFIsDQo+IC0JCQkJCSAoc3RydWN0IHNvY2th
ZGRyICopJnByaW0uc3NwX2FkZHIsDQo+ICsJCQkJCSAoc3RydWN0IHNvY2thZGRyICopJnByaW0t
PnNzcF9hZGRyLA0KPiAgCQkJCQkgYWYtPnNvY2thZGRyX2xlbik7DQo+ICAJaWYgKGVycikNCj4g
IAkJcmV0dXJuIGVycjsNCj4gDQo+IC0JdHJhbnMgPSBzY3RwX2FkZHJfaWQydHJhbnNwb3J0KHNr
LCAmcHJpbS5zc3BfYWRkciwgcHJpbS5zc3BfYXNzb2NfaWQpOw0KPiArCXRyYW5zID0gc2N0cF9h
ZGRyX2lkMnRyYW5zcG9ydChzaywgJnByaW0tPnNzcF9hZGRyLCBwcmltLT5zc3BfYXNzb2NfaWQp
Ow0KPiAgCWlmICghdHJhbnMpDQo+ICAJCXJldHVybiAtRUlOVkFMOw0KPiANCj4gQEAgLTMwMTQs
NyArMzAwNyw2IEBAIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3ByaW1hcnlfYWRkcihzdHJ1
Y3Qgc29jayAqc2ssIHN0cnVjdCBzY3RwX3ByaW0gcHJpbSwNCj4gDQo+ICAJcmV0dXJuIDA7DQo+
ICB9DQo+IC0jdW5kZWYgcHJpbQ0KPiANCj4gIC8qDQo+ICAgKiA3LjEuNSBTQ1RQX05PREVMQVkN
Cj4gQEAgLTMwNDcsNyArMzAzOSw3IEBAIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X25vZGVs
YXkoc3RydWN0IHNvY2sgKnNrLCBpbnQgKm9wdHZhbCwNCj4gICAqDQo+ICAgKi8NCj4gIHN0YXRp
YyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3J0b2luZm8oc3RydWN0IHNvY2sgKnNrLA0KPiAtCQkJCSAg
IHN0cnVjdCBzY3RwX3J0b2luZm8gcGFyYW1zLA0KPiArCQkJCSAgIHN0cnVjdCBzY3RwX3J0b2lu
Zm8gKnBhcmFtcywNCj4gIAkJCQkgICB1bnNpZ25lZCBpbnQgb3B0bGVuKQ0KPiAgew0KPiAgCXN0
cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOw0KPiBAQCAtMzA1NywxNSArMzA0OSwxNSBAQCBz
dGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9ydG9pbmZvKHN0cnVjdCBzb2NrICpzaywNCj4gIAlp
ZiAob3B0bGVuICE9IHNpemVvZiAoc3RydWN0IHNjdHBfcnRvaW5mbykpDQo+ICAJCXJldHVybiAt
RUlOVkFMOw0KPiANCj4gLQlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgcGFyYW1zLnNydG9fYXNz
b2NfaWQpOw0KPiArCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCBwYXJhbXMtPnNydG9fYXNzb2Nf
aWQpOw0KPiANCj4gIAkvKiBTZXQgdGhlIHZhbHVlcyB0byB0aGUgc3BlY2lmaWMgYXNzb2NpYXRp
b24gKi8NCj4gLQlpZiAoIWFzb2MgJiYgcGFyYW1zLnNydG9fYXNzb2NfaWQgIT0gU0NUUF9GVVRV
UkVfQVNTT0MgJiYNCj4gKwlpZiAoIWFzb2MgJiYgcGFyYW1zLT5zcnRvX2Fzc29jX2lkICE9IFND
VFBfRlVUVVJFX0FTU09DICYmDQo+ICAJICAgIHNjdHBfc3R5bGUoc2ssIFVEUCkpDQo+ICAJCXJl
dHVybiAtRUlOVkFMOw0KPiANCj4gLQlydG9fbWF4ID0gcGFyYW1zLnNydG9fbWF4Ow0KPiAtCXJ0
b19taW4gPSBwYXJhbXMuc3J0b19taW47DQo+ICsJcnRvX21heCA9IHBhcmFtcy0+c3J0b19tYXg7
DQo+ICsJcnRvX21pbiA9IHBhcmFtcy0+c3J0b19taW47DQo+IA0KPiAgCWlmIChydG9fbWF4KQ0K
PiAgCQlydG9fbWF4ID0gYXNvYyA/IG1zZWNzX3RvX2ppZmZpZXMocnRvX21heCkgOiBydG9fbWF4
Ow0KPiBAQCAtMzA4MSwxNyArMzA3MywxNyBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9y
dG9pbmZvKHN0cnVjdCBzb2NrICpzaywNCj4gIAkJcmV0dXJuIC1FSU5WQUw7DQo+IA0KPiAgCWlm
IChhc29jKSB7DQo+IC0JCWlmIChwYXJhbXMuc3J0b19pbml0aWFsICE9IDApDQo+ICsJCWlmIChw
YXJhbXMtPnNydG9faW5pdGlhbCAhPSAwKQ0KPiAgCQkJYXNvYy0+cnRvX2luaXRpYWwgPQ0KPiAt
CQkJCW1zZWNzX3RvX2ppZmZpZXMocGFyYW1zLnNydG9faW5pdGlhbCk7DQo+ICsJCQkJbXNlY3Nf
dG9famlmZmllcyhwYXJhbXMtPnNydG9faW5pdGlhbCk7DQo+ICAJCWFzb2MtPnJ0b19tYXggPSBy
dG9fbWF4Ow0KPiAgCQlhc29jLT5ydG9fbWluID0gcnRvX21pbjsNCj4gIAl9IGVsc2Ugew0KPiAg
CQkvKiBJZiB0aGVyZSBpcyBubyBhc3NvY2lhdGlvbiBvciB0aGUgYXNzb2NpYXRpb24taWQgPSAw
DQo+ICAJCSAqIHNldCB0aGUgdmFsdWVzIHRvIHRoZSBlbmRwb2ludC4NCj4gIAkJICovDQo+IC0J
CWlmIChwYXJhbXMuc3J0b19pbml0aWFsICE9IDApDQo+IC0JCQlzcC0+cnRvaW5mby5zcnRvX2lu
aXRpYWwgPSBwYXJhbXMuc3J0b19pbml0aWFsOw0KPiArCQlpZiAocGFyYW1zLT5zcnRvX2luaXRp
YWwgIT0gMCkNCj4gKwkJCXNwLT5ydG9pbmZvLnNydG9faW5pdGlhbCA9IHBhcmFtcy0+c3J0b19p
bml0aWFsOw0KPiAgCQlzcC0+cnRvaW5mby5zcnRvX21heCA9IHJ0b19tYXg7DQo+ICAJCXNwLT5y
dG9pbmZvLnNydG9fbWluID0gcnRvX21pbjsNCj4gIAl9DQo+IEBAIC0zMTExLDcgKzMxMDMsNyBA
QCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9ydG9pbmZvKHN0cnVjdCBzb2NrICpzaywNCj4g
ICAqDQo+ICAgKi8NCj4gIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2Fzc29jaW5mbyhzdHJ1
Y3Qgc29jayAqc2ssDQo+IC0JCQkJICAgICBzdHJ1Y3Qgc2N0cF9hc3NvY3BhcmFtcyBwYXJhbXMs
DQo+ICsJCQkJICAgICBzdHJ1Y3Qgc2N0cF9hc3NvY3BhcmFtcyAqcGFyYW1zLA0KPiAgCQkJCSAg
ICAgdW5zaWduZWQgaW50IG9wdGxlbikNCj4gIHsNCj4gDQo+IEBAIC0zMTIwLDE1ICszMTEyLDE1
IEBAIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2Fzc29jaW5mbyhzdHJ1Y3Qgc29jayAqc2ss
DQo+ICAJaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NwYXJhbXMpKQ0KPiAg
CQlyZXR1cm4gLUVJTlZBTDsNCj4gDQo+IC0JYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIHBhcmFt
cy5zYXNvY19hc3NvY19pZCk7DQo+ICsJYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIHBhcmFtcy0+
c2Fzb2NfYXNzb2NfaWQpOw0KPiANCj4gLQlpZiAoIWFzb2MgJiYgcGFyYW1zLnNhc29jX2Fzc29j
X2lkICE9IFNDVFBfRlVUVVJFX0FTU09DICYmDQo+ICsJaWYgKCFhc29jICYmIHBhcmFtcy0+c2Fz
b2NfYXNzb2NfaWQgIT0gU0NUUF9GVVRVUkVfQVNTT0MgJiYNCj4gIAkgICAgc2N0cF9zdHlsZShz
aywgVURQKSkNCj4gIAkJcmV0dXJuIC1FSU5WQUw7DQo+IA0KPiAgCS8qIFNldCB0aGUgdmFsdWVz
IHRvIHRoZSBzcGVjaWZpYyBhc3NvY2lhdGlvbiAqLw0KPiAgCWlmIChhc29jKSB7DQo+IC0JCWlm
IChwYXJhbXMuc2Fzb2NfYXNvY21heHJ4dCAhPSAwKSB7DQo+ICsJCWlmIChwYXJhbXMtPnNhc29j
X2Fzb2NtYXhyeHQgIT0gMCkgew0KPiAgCQkJX191MzIgcGF0aF9zdW0gPSAwOw0KPiAgCQkJaW50
ICAgcGF0aHMgPSAwOw0KPiAgCQkJc3RydWN0IHNjdHBfdHJhbnNwb3J0ICpwZWVyX2FkZHI7DQo+
IEBAIC0zMTQ1LDI0ICszMTM3LDI0IEBAIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2Fzc29j
aW5mbyhzdHJ1Y3Qgc29jayAqc2ssDQo+ICAJCQkgKiB0aGVuIG9uZSBwYXRoLg0KPiAgCQkJICov
DQo+ICAJCQlpZiAocGF0aHMgPiAxICYmDQo+IC0JCQkgICAgcGFyYW1zLnNhc29jX2Fzb2NtYXhy
eHQgPiBwYXRoX3N1bSkNCj4gKwkJCSAgICBwYXJhbXMtPnNhc29jX2Fzb2NtYXhyeHQgPiBwYXRo
X3N1bSkNCj4gIAkJCQlyZXR1cm4gLUVJTlZBTDsNCj4gDQo+IC0JCQlhc29jLT5tYXhfcmV0cmFu
cyA9IHBhcmFtcy5zYXNvY19hc29jbWF4cnh0Ow0KPiArCQkJYXNvYy0+bWF4X3JldHJhbnMgPSBw
YXJhbXMtPnNhc29jX2Fzb2NtYXhyeHQ7DQo+ICAJCX0NCj4gDQo+IC0JCWlmIChwYXJhbXMuc2Fz
b2NfY29va2llX2xpZmUgIT0gMCkNCj4gLQkJCWFzb2MtPmNvb2tpZV9saWZlID0gbXNfdG9fa3Rp
bWUocGFyYW1zLnNhc29jX2Nvb2tpZV9saWZlKTsNCj4gKwkJaWYgKHBhcmFtcy0+c2Fzb2NfY29v
a2llX2xpZmUgIT0gMCkNCj4gKwkJCWFzb2MtPmNvb2tpZV9saWZlID0gbXNfdG9fa3RpbWUocGFy
YW1zLT5zYXNvY19jb29raWVfbGlmZSk7DQo+ICAJfSBlbHNlIHsNCj4gIAkJLyogU2V0IHRoZSB2
YWx1ZXMgdG8gdGhlIGVuZHBvaW50ICovDQo+ICAJCXN0cnVjdCBzY3RwX3NvY2sgKnNwID0gc2N0
cF9zayhzayk7DQo+IA0KPiAtCQlpZiAocGFyYW1zLnNhc29jX2Fzb2NtYXhyeHQgIT0gMCkNCj4g
KwkJaWYgKHBhcmFtcy0+c2Fzb2NfYXNvY21heHJ4dCAhPSAwKQ0KPiAgCQkJc3AtPmFzc29jcGFy
YW1zLnNhc29jX2Fzb2NtYXhyeHQgPQ0KPiAtCQkJCQkJcGFyYW1zLnNhc29jX2Fzb2NtYXhyeHQ7
DQo+IC0JCWlmIChwYXJhbXMuc2Fzb2NfY29va2llX2xpZmUgIT0gMCkNCj4gKwkJCQkJCXBhcmFt
cy0+c2Fzb2NfYXNvY21heHJ4dDsNCj4gKwkJaWYgKHBhcmFtcy0+c2Fzb2NfY29va2llX2xpZmUg
IT0gMCkNCj4gIAkJCXNwLT5hc3NvY3BhcmFtcy5zYXNvY19jb29raWVfbGlmZSA9DQo+IC0JCQkJ
CQlwYXJhbXMuc2Fzb2NfY29va2llX2xpZmU7DQo+ICsJCQkJCQlwYXJhbXMtPnNhc29jX2Nvb2tp
ZV9saWZlOw0KPiAgCX0NCj4gIAlyZXR1cm4gMDsNCj4gIH0NCj4gQEAgLTMyMjAsNyArMzIxMiw3
IEBAIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X21hcHBlZHY0KHN0cnVjdCBzb2NrICpzaywg
aW50ICpvcHR2YWwsDQo+ICAgKiBhc3NvY192YWx1ZTogIFRoaXMgcGFyYW1ldGVyIHNwZWNpZmll
cyB0aGUgbWF4aW11bSBzaXplIGluIGJ5dGVzLg0KPiAgICovDQo+ICBzdGF0aWMgaW50IHNjdHBf
c2V0c29ja29wdF9tYXhzZWcoc3RydWN0IHNvY2sgKnNrLA0KPiAtCQkJCSAgc3RydWN0IHNjdHBf
YXNzb2NfdmFsdWUgcGFyYW1zLA0KPiArCQkJCSAgc3RydWN0IHNjdHBfYXNzb2NfdmFsdWUgKnBh
cmFtcywNCj4gIAkJCQkgIHVuc2lnbmVkIGludCBvcHRsZW4pDQo+ICB7DQo+ICAJc3RydWN0IHNj
dHBfc29jayAqc3AgPSBzY3RwX3NrKHNrKTsNCj4gQEAgLTMyMzMsMTYgKzMyMjUsMTYgQEAgc3Rh
dGljIGludCBzY3RwX3NldHNvY2tvcHRfbWF4c2VnKHN0cnVjdCBzb2NrICpzaywNCj4gIAkJCQkg
ICAgIlVzZSBvZiBpbnQgaW4gbWF4c2VnIHNvY2tldCBvcHRpb24uXG4iDQo+ICAJCQkJICAgICJV
c2Ugc3RydWN0IHNjdHBfYXNzb2NfdmFsdWUgaW5zdGVhZFxuIiwNCj4gIAkJCQkgICAgY3VycmVu
dC0+Y29tbSwgdGFza19waWRfbnIoY3VycmVudCkpOw0KPiAtCQl2YWwgPSAqKGludCAqKSZwYXJh
bXM7DQo+IC0JCXBhcmFtcy5hc3NvY19pZCA9IFNDVFBfRlVUVVJFX0FTU09DOw0KPiArCQl2YWwg
PSAqKGludCAqKXBhcmFtczsNCj4gKwkJcGFyYW1zLT5hc3NvY19pZCA9IFNDVFBfRlVUVVJFX0FT
U09DOw0KPiAgCX0gZWxzZSBpZiAob3B0bGVuICE9IHNpemVvZihzdHJ1Y3Qgc2N0cF9hc3NvY192
YWx1ZSkpIHsNCj4gLQkJdmFsID0gcGFyYW1zLmFzc29jX3ZhbHVlOw0KPiArCQl2YWwgPSBwYXJh
bXMtPmFzc29jX3ZhbHVlOw0KPiAgCX0gZWxzZSB7DQo+ICAJCXJldHVybiAtRUlOVkFMOw0KPiAg
CX0NCj4gDQo+IC0JYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIHBhcmFtcy5hc3NvY19pZCk7DQo+
IC0JaWYgKCFhc29jICYmIHBhcmFtcy5hc3NvY19pZCAhPSBTQ1RQX0ZVVFVSRV9BU1NPQyAmJg0K
PiArCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCBwYXJhbXMtPmFzc29jX2lkKTsNCj4gKwlpZiAo
IWFzb2MgJiYgcGFyYW1zLT5hc3NvY19pZCAhPSBTQ1RQX0ZVVFVSRV9BU1NPQyAmJg0KPiAgCSAg
ICBzY3RwX3N0eWxlKHNrLCBVRFApKQ0KPiAgCQlyZXR1cm4gLUVJTlZBTDsNCj4gDQo+IEBAIC0z
Mjc3LDkgKzMyNjksOCBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9tYXhzZWcoc3RydWN0
IHNvY2sgKnNrLA0KPiAgICogICBsb2NhbGx5IGJvdW5kIGFkZHJlc3Nlcy4gVGhlIGZvbGxvd2lu
ZyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBtYWtlIGENCj4gICAqICAgc2V0IHByaW1hcnkgcmVxdWVz
dDoNCj4gICAqLw0KPiAtI2RlZmluZSBwcmltICgqcHJpbSkNCj4gIHN0YXRpYyBpbnQgc2N0cF9z
ZXRzb2Nrb3B0X3BlZXJfcHJpbWFyeV9hZGRyKHN0cnVjdCBzb2NrICpzaywNCj4gLQkJCQkJICAg
ICBzdHJ1Y3Qgc2N0cF9zZXRwZWVycHJpbSBwcmltLA0KPiArCQkJCQkgICAgIHN0cnVjdCBzY3Rw
X3NldHBlZXJwcmltICpwcmltLA0KPiAgCQkJCQkgICAgIHVuc2lnbmVkIGludCBvcHRsZW4pDQo+
ICB7DQo+ICAJc3RydWN0IHNjdHBfc29jawkqc3A7DQo+IEBAIC0zMjk2LDcgKzMyODcsNyBAQCBz
dGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9wZWVyX3ByaW1hcnlfYWRkcihzdHJ1Y3Qgc29jayAq
c2ssDQo+ICAJaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IHNjdHBfc2V0cGVlcnByaW0pKQ0K
PiAgCQlyZXR1cm4gLUVJTlZBTDsNCj4gDQo+IC0JYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIHBy
aW0uc3NwcF9hc3NvY19pZCk7DQo+ICsJYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIHByaW0tPnNz
cHBfYXNzb2NfaWQpOw0KPiAgCWlmICghYXNvYykNCj4gIAkJcmV0dXJuIC1FSU5WQUw7DQo+IA0K
PiBAQCAtMzMwOSwyNiArMzMwMCwyNiBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9wZWVy
X3ByaW1hcnlfYWRkcihzdHJ1Y3Qgc29jayAqc2ssDQo+ICAJaWYgKCFzY3RwX3N0YXRlKGFzb2Ms
IEVTVEFCTElTSEVEKSkNCj4gIAkJcmV0dXJuIC1FTk9UQ09OTjsNCj4gDQo+IC0JYWYgPSBzY3Rw
X2dldF9hZl9zcGVjaWZpYyhwcmltLnNzcHBfYWRkci5zc19mYW1pbHkpOw0KPiArCWFmID0gc2N0
cF9nZXRfYWZfc3BlY2lmaWMocHJpbS0+c3NwcF9hZGRyLnNzX2ZhbWlseSk7DQo+ICAJaWYgKCFh
ZikNCj4gIAkJcmV0dXJuIC1FSU5WQUw7DQo+IA0KPiAtCWlmICghYWYtPmFkZHJfdmFsaWQoKHVu
aW9uIHNjdHBfYWRkciAqKSZwcmltLnNzcHBfYWRkciwgc3AsIE5VTEwpKQ0KPiArCWlmICghYWYt
PmFkZHJfdmFsaWQoKHVuaW9uIHNjdHBfYWRkciAqKSZwcmltLT5zc3BwX2FkZHIsIHNwLCBOVUxM
KSkNCj4gIAkJcmV0dXJuIC1FQUREUk5PVEFWQUlMOw0KPiANCj4gLQlpZiAoIXNjdHBfYXNzb2Nf
bG9va3VwX2xhZGRyKGFzb2MsICh1bmlvbiBzY3RwX2FkZHIgKikmcHJpbS5zc3BwX2FkZHIpKQ0K
PiArCWlmICghc2N0cF9hc3NvY19sb29rdXBfbGFkZHIoYXNvYywgKHVuaW9uIHNjdHBfYWRkciAq
KSZwcmltLT5zc3BwX2FkZHIpKQ0KPiAgCQlyZXR1cm4gLUVBRERSTk9UQVZBSUw7DQo+IA0KPiAg
CS8qIEFsbG93IHNlY3VyaXR5IG1vZHVsZSB0byB2YWxpZGF0ZSBhZGRyZXNzLiAqLw0KPiAgCWVy
ciA9IHNlY3VyaXR5X3NjdHBfYmluZF9jb25uZWN0KHNrLCBTQ1RQX1NFVF9QRUVSX1BSSU1BUllf
QUREUiwNCj4gLQkJCQkJIChzdHJ1Y3Qgc29ja2FkZHIgKikmcHJpbS5zc3BwX2FkZHIsDQo+ICsJ
CQkJCSAoc3RydWN0IHNvY2thZGRyICopJnByaW0tPnNzcHBfYWRkciwNCj4gIAkJCQkJIGFmLT5z
b2NrYWRkcl9sZW4pOw0KPiAgCWlmIChlcnIpDQo+ICAJCXJldHVybiBlcnI7DQo+IA0KPiAgCS8q
IENyZWF0ZSBhbiBBU0NPTkYgY2h1bmsgd2l0aCBTRVRfUFJJTUFSWSBwYXJhbWV0ZXIJKi8NCj4g
IAljaHVuayA9IHNjdHBfbWFrZV9hc2NvbmZfc2V0X3ByaW0oYXNvYywNCj4gLQkJCQkJICAodW5p
b24gc2N0cF9hZGRyICopJnByaW0uc3NwcF9hZGRyKTsNCj4gKwkJCQkJICAodW5pb24gc2N0cF9h
ZGRyICopJnByaW0tPnNzcHBfYWRkcik7DQo+ICAJaWYgKCFjaHVuaykNCj4gIAkJcmV0dXJuIC1F
Tk9NRU07DQo+IA0KPiBAQCAtMzMzOCw3ICszMzI5LDYgQEAgc3RhdGljIGludCBzY3RwX3NldHNv
Y2tvcHRfcGVlcl9wcmltYXJ5X2FkZHIoc3RydWN0IHNvY2sgKnNrLA0KPiANCj4gIAlyZXR1cm4g
ZXJyOw0KPiAgfQ0KPiAtI3VuZGVmIHByaW0NCj4gDQo+ICBzdGF0aWMgaW50IHNjdHBfc2V0c29j
a29wdF9hZGFwdGF0aW9uX2xheWVyKHN0cnVjdCBzb2NrICpzaywNCj4gIAkJCQkJICAgIHN0cnVj
dCBzY3RwX3NldGFkYXB0YXRpb24gKmFkYXB0YXRpb24sDQo+IEBAIC0zMzY3LDcgKzMzNTcsNyBA
QCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9hZGFwdGF0aW9uX2xheWVyKHN0cnVjdCBzb2Nr
ICpzaywNCj4gICAqIHNhdmVkIHdpdGggb3V0Ym91bmQgbWVzc2FnZXMuDQo+ICAgKi8NCj4gIHN0
YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2NvbnRleHQoc3RydWN0IHNvY2sgKnNrLA0KPiAtCQkJ
CSAgIHN0cnVjdCBzY3RwX2Fzc29jX3ZhbHVlIHBhcmFtcywNCj4gKwkJCQkgICBzdHJ1Y3Qgc2N0
cF9hc3NvY192YWx1ZSAqcGFyYW1zLA0KPiAgCQkJCSAgIHVuc2lnbmVkIGludCBvcHRsZW4pDQo+
ICB7DQo+ICAJc3RydWN0IHNjdHBfc29jayAqc3AgPSBzY3RwX3NrKHNrKTsNCj4gQEAgLTMzNzYs
MjggKzMzNjYsMjggQEAgc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfY29udGV4dChzdHJ1Y3Qg
c29jayAqc2ssDQo+ICAJaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfdmFs
dWUpKQ0KPiAgCQlyZXR1cm4gLUVJTlZBTDsNCj4gDQo+IC0JYXNvYyA9IHNjdHBfaWQyYXNzb2Mo
c2ssIHBhcmFtcy5hc3NvY19pZCk7DQo+IC0JaWYgKCFhc29jICYmIHBhcmFtcy5hc3NvY19pZCA+
IFNDVFBfQUxMX0FTU09DICYmDQo+ICsJYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIHBhcmFtcy0+
YXNzb2NfaWQpOw0KPiArCWlmICghYXNvYyAmJiBwYXJhbXMtPmFzc29jX2lkID4gU0NUUF9BTExf
QVNTT0MgJiYNCj4gIAkgICAgc2N0cF9zdHlsZShzaywgVURQKSkNCj4gIAkJcmV0dXJuIC1FSU5W
QUw7DQo+IA0KPiAgCWlmIChhc29jKSB7DQo+IC0JCWFzb2MtPmRlZmF1bHRfcmN2X2NvbnRleHQg
PSBwYXJhbXMuYXNzb2NfdmFsdWU7DQo+ICsJCWFzb2MtPmRlZmF1bHRfcmN2X2NvbnRleHQgPSBw
YXJhbXMtPmFzc29jX3ZhbHVlOw0KPiANCj4gIAkJcmV0dXJuIDA7DQo+ICAJfQ0KPiANCj4gIAlp
ZiAoc2N0cF9zdHlsZShzaywgVENQKSkNCj4gLQkJcGFyYW1zLmFzc29jX2lkID0gU0NUUF9GVVRV
UkVfQVNTT0M7DQo+ICsJCXBhcmFtcy0+YXNzb2NfaWQgPSBTQ1RQX0ZVVFVSRV9BU1NPQzsNCj4g
DQo+IC0JaWYgKHBhcmFtcy5hc3NvY19pZCA9PSBTQ1RQX0ZVVFVSRV9BU1NPQyB8fA0KPiAtCSAg
ICBwYXJhbXMuYXNzb2NfaWQgPT0gU0NUUF9BTExfQVNTT0MpDQo+IC0JCXNwLT5kZWZhdWx0X3Jj
dl9jb250ZXh0ID0gcGFyYW1zLmFzc29jX3ZhbHVlOw0KPiArCWlmIChwYXJhbXMtPmFzc29jX2lk
ID09IFNDVFBfRlVUVVJFX0FTU09DIHx8DQo+ICsJICAgIHBhcmFtcy0+YXNzb2NfaWQgPT0gU0NU
UF9BTExfQVNTT0MpDQo+ICsJCXNwLT5kZWZhdWx0X3Jjdl9jb250ZXh0ID0gcGFyYW1zLT5hc3Nv
Y192YWx1ZTsNCj4gDQo+IC0JaWYgKHBhcmFtcy5hc3NvY19pZCA9PSBTQ1RQX0NVUlJFTlRfQVNT
T0MgfHwNCj4gLQkgICAgcGFyYW1zLmFzc29jX2lkID09IFNDVFBfQUxMX0FTU09DKQ0KPiArCWlm
IChwYXJhbXMtPmFzc29jX2lkID09IFNDVFBfQ1VSUkVOVF9BU1NPQyB8fA0KPiArCSAgICBwYXJh
bXMtPmFzc29jX2lkID09IFNDVFBfQUxMX0FTU09DKQ0KPiAgCQlsaXN0X2Zvcl9lYWNoX2VudHJ5
KGFzb2MsICZzcC0+ZXAtPmFzb2NzLCBhc29jcykNCj4gLQkJCWFzb2MtPmRlZmF1bHRfcmN2X2Nv
bnRleHQgPSBwYXJhbXMuYXNzb2NfdmFsdWU7DQo+ICsJCQlhc29jLT5kZWZhdWx0X3Jjdl9jb250
ZXh0ID0gcGFyYW1zLT5hc3NvY192YWx1ZTsNCj4gDQo+ICAJcmV0dXJuIDA7DQo+ICB9DQo+IEBA
IC0zNDg4LDcgKzM0NzgsNyBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9wYXJ0aWFsX2Rl
bGl2ZXJ5X3BvaW50KHN0cnVjdCBzb2NrICpzaywNCj4gICAqIGZ1dHVyZSBhc3NvY2lhdGlvbnMg
aW5oZXJpdGluZyB0aGUgc29ja2V0IHZhbHVlLg0KPiAgICovDQo+ICBzdGF0aWMgaW50IHNjdHBf
c2V0c29ja29wdF9tYXhidXJzdChzdHJ1Y3Qgc29jayAqc2ssDQo+IC0JCQkJICAgIHN0cnVjdCBz
Y3RwX2Fzc29jX3ZhbHVlIHBhcmFtcywNCj4gKwkJCQkgICAgc3RydWN0IHNjdHBfYXNzb2NfdmFs
dWUgKnBhcmFtcywNCj4gIAkJCQkgICAgdW5zaWduZWQgaW50IG9wdGxlbikNCj4gIHsNCj4gIAlz
dHJ1Y3Qgc2N0cF9zb2NrICpzcCA9IHNjdHBfc2soc2spOw0KPiBAQCAtMzUwMCwzNCArMzQ5MCwz
NCBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9tYXhidXJzdChzdHJ1Y3Qgc29jayAqc2ss
DQo+ICAJCQkJICAgICJVc2Ugb2YgaW50IGluIG1heF9idXJzdCBzb2NrZXQgb3B0aW9uIGRlcHJl
Y2F0ZWQuXG4iDQo+ICAJCQkJICAgICJVc2Ugc3RydWN0IHNjdHBfYXNzb2NfdmFsdWUgaW5zdGVh
ZFxuIiwNCj4gIAkJCQkgICAgY3VycmVudC0+Y29tbSwgdGFza19waWRfbnIoY3VycmVudCkpOw0K
PiAtCQlwYXJhbXMuYXNzb2NfdmFsdWUgPSAqKGludCAqKSZwYXJhbXM7DQo+IC0JCXBhcmFtcy5h
c3NvY19pZCA9IFNDVFBfRlVUVVJFX0FTU09DOw0KPiArCQlwYXJhbXMtPmFzc29jX3ZhbHVlID0g
KihpbnQgKilwYXJhbXM7DQo+ICsJCXBhcmFtcy0+YXNzb2NfaWQgPSBTQ1RQX0ZVVFVSRV9BU1NP
QzsNCj4gIAl9IGVsc2UgaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IHNjdHBfYXNzb2NfdmFs
dWUpKSB7DQo+ICAJCXJldHVybiAtRUlOVkFMOw0KPiAgCX0NCj4gDQo+IC0JYXNvYyA9IHNjdHBf
aWQyYXNzb2Moc2ssIHBhcmFtcy5hc3NvY19pZCk7DQo+IC0JaWYgKCFhc29jICYmIHBhcmFtcy5h
c3NvY19pZCA+IFNDVFBfQUxMX0FTU09DICYmDQo+ICsJYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ss
IHBhcmFtcy0+YXNzb2NfaWQpOw0KPiArCWlmICghYXNvYyAmJiBwYXJhbXMtPmFzc29jX2lkID4g
U0NUUF9BTExfQVNTT0MgJiYNCj4gIAkgICAgc2N0cF9zdHlsZShzaywgVURQKSkNCj4gIAkJcmV0
dXJuIC1FSU5WQUw7DQo+IA0KPiAgCWlmIChhc29jKSB7DQo+IC0JCWFzb2MtPm1heF9idXJzdCA9
IHBhcmFtcy5hc3NvY192YWx1ZTsNCj4gKwkJYXNvYy0+bWF4X2J1cnN0ID0gcGFyYW1zLT5hc3Nv
Y192YWx1ZTsNCj4gDQo+ICAJCXJldHVybiAwOw0KPiAgCX0NCj4gDQo+ICAJaWYgKHNjdHBfc3R5
bGUoc2ssIFRDUCkpDQo+IC0JCXBhcmFtcy5hc3NvY19pZCA9IFNDVFBfRlVUVVJFX0FTU09DOw0K
PiArCQlwYXJhbXMtPmFzc29jX2lkID0gU0NUUF9GVVRVUkVfQVNTT0M7DQo+IA0KPiAtCWlmIChw
YXJhbXMuYXNzb2NfaWQgPT0gU0NUUF9GVVRVUkVfQVNTT0MgfHwNCj4gLQkgICAgcGFyYW1zLmFz
c29jX2lkID09IFNDVFBfQUxMX0FTU09DKQ0KPiAtCQlzcC0+bWF4X2J1cnN0ID0gcGFyYW1zLmFz
c29jX3ZhbHVlOw0KPiArCWlmIChwYXJhbXMtPmFzc29jX2lkID09IFNDVFBfRlVUVVJFX0FTU09D
IHx8DQo+ICsJICAgIHBhcmFtcy0+YXNzb2NfaWQgPT0gU0NUUF9BTExfQVNTT0MpDQo+ICsJCXNw
LT5tYXhfYnVyc3QgPSBwYXJhbXMtPmFzc29jX3ZhbHVlOw0KPiANCj4gLQlpZiAocGFyYW1zLmFz
c29jX2lkID09IFNDVFBfQ1VSUkVOVF9BU1NPQyB8fA0KPiAtCSAgICBwYXJhbXMuYXNzb2NfaWQg
PT0gU0NUUF9BTExfQVNTT0MpDQo+ICsJaWYgKHBhcmFtcy0+YXNzb2NfaWQgPT0gU0NUUF9DVVJS
RU5UX0FTU09DIHx8DQo+ICsJICAgIHBhcmFtcy0+YXNzb2NfaWQgPT0gU0NUUF9BTExfQVNTT0Mp
DQo+ICAJCWxpc3RfZm9yX2VhY2hfZW50cnkoYXNvYywgJnNwLT5lcC0+YXNvY3MsIGFzb2NzKQ0K
PiAtCQkJYXNvYy0+bWF4X2J1cnN0ID0gcGFyYW1zLmFzc29jX3ZhbHVlOw0KPiArCQkJYXNvYy0+
bWF4X2J1cnN0ID0gcGFyYW1zLT5hc3NvY192YWx1ZTsNCj4gDQo+ICAJcmV0dXJuIDA7DQo+ICB9
DQo+IEBAIC0zNTM5LDkgKzM1MjksOCBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9tYXhi
dXJzdChzdHJ1Y3Qgc29jayAqc2ssDQo+ICAgKiByZWNlaXZlZCBvbmx5IGluIGFuIGF1dGhlbnRp
Y2F0ZWQgd2F5LiAgQ2hhbmdlcyB0byB0aGUgbGlzdCBvZiBjaHVua3MNCj4gICAqIHdpbGwgb25s
eSBlZmZlY3QgZnV0dXJlIGFzc29jaWF0aW9ucyBvbiB0aGUgc29ja2V0Lg0KPiAgICovDQo+IC0j
ZGVmaW5lIHZhbCAoKnZhbCkNCj4gIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2F1dGhfY2h1
bmsoc3RydWN0IHNvY2sgKnNrLA0KPiAtCQkJCSAgICAgIHN0cnVjdCBzY3RwX2F1dGhjaHVuayB2
YWwsDQo+ICsJCQkJICAgICAgc3RydWN0IHNjdHBfYXV0aGNodW5rICp2YWwsDQo+ICAJCQkJICAg
ICAgdW5zaWduZWQgaW50IG9wdGxlbikNCj4gIHsNCj4gIAlzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAq
ZXAgPSBzY3RwX3NrKHNrKS0+ZXA7DQo+IEBAIC0zNTUyLDcgKzM1NDEsNyBAQCBzdGF0aWMgaW50
IHNjdHBfc2V0c29ja29wdF9hdXRoX2NodW5rKHN0cnVjdCBzb2NrICpzaywNCj4gIAlpZiAob3B0
bGVuICE9IHNpemVvZihzdHJ1Y3Qgc2N0cF9hdXRoY2h1bmspKQ0KPiAgCQlyZXR1cm4gLUVJTlZB
TDsNCj4gDQo+IC0Jc3dpdGNoICh2YWwuc2F1dGhfY2h1bmspIHsNCj4gKwlzd2l0Y2ggKHZhbC0+
c2F1dGhfY2h1bmspIHsNCj4gIAljYXNlIFNDVFBfQ0lEX0lOSVQ6DQo+ICAJY2FzZSBTQ1RQX0NJ
RF9JTklUX0FDSzoNCj4gIAljYXNlIFNDVFBfQ0lEX1NIVVRET1dOX0NPTVBMRVRFOg0KPiBAQCAt
MzU2MSw3ICszNTUwLDcgQEAgc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfYXV0aF9jaHVuayhz
dHJ1Y3Qgc29jayAqc2ssDQo+ICAJfQ0KPiANCj4gIAkvKiBhZGQgdGhpcyBjaHVuayBpZCB0byB0
aGUgZW5kcG9pbnQgKi8NCj4gLQlyZXR1cm4gc2N0cF9hdXRoX2VwX2FkZF9jaHVua2lkKGVwLCB2
YWwuc2F1dGhfY2h1bmspOw0KPiArCXJldHVybiBzY3RwX2F1dGhfZXBfYWRkX2NodW5raWQoZXAs
IHZhbC0+c2F1dGhfY2h1bmspOw0KPiAgfQ0KPiANCj4gIC8qDQo+IEBAIC0zNjY2LDcgKzM2NTUs
NyBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9hdXRoX2tleShzdHJ1Y3Qgc29jayAqc2ss
DQo+ICAgKiB0aGUgYXNzb2NpYXRpb24gc2hhcmVkIGtleS4NCj4gICAqLw0KPiAgc3RhdGljIGlu
dCBzY3RwX3NldHNvY2tvcHRfYWN0aXZlX2tleShzdHJ1Y3Qgc29jayAqc2ssDQo+IC0JCQkJICAg
ICAgc3RydWN0IHNjdHBfYXV0aGtleWlkIHZhbCwNCj4gKwkJCQkgICAgICBzdHJ1Y3Qgc2N0cF9h
dXRoa2V5aWQgKnZhbCwNCj4gIAkJCQkgICAgICB1bnNpZ25lZCBpbnQgb3B0bGVuKQ0KPiAgew0K
PiAgCXN0cnVjdCBzY3RwX2VuZHBvaW50ICplcCA9IHNjdHBfc2soc2spLT5lcDsNCj4gQEAgLTM2
NzYsMjkgKzM2NjUsMjkgQEAgc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfYWN0aXZlX2tleShz
dHJ1Y3Qgc29jayAqc2ssDQo+ICAJaWYgKG9wdGxlbiAhPSBzaXplb2Yoc3RydWN0IHNjdHBfYXV0
aGtleWlkKSkNCj4gIAkJcmV0dXJuIC1FSU5WQUw7DQo+IA0KPiAtCWFzb2MgPSBzY3RwX2lkMmFz
c29jKHNrLCB2YWwuc2NhY3RfYXNzb2NfaWQpOw0KPiAtCWlmICghYXNvYyAmJiB2YWwuc2NhY3Rf
YXNzb2NfaWQgPiBTQ1RQX0FMTF9BU1NPQyAmJg0KPiArCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNr
LCB2YWwtPnNjYWN0X2Fzc29jX2lkKTsNCj4gKwlpZiAoIWFzb2MgJiYgdmFsLT5zY2FjdF9hc3Nv
Y19pZCA+IFNDVFBfQUxMX0FTU09DICYmDQo+ICAJICAgIHNjdHBfc3R5bGUoc2ssIFVEUCkpDQo+
ICAJCXJldHVybiAtRUlOVkFMOw0KPiANCj4gIAlpZiAoYXNvYykNCj4gLQkJcmV0dXJuIHNjdHBf
YXV0aF9zZXRfYWN0aXZlX2tleShlcCwgYXNvYywgdmFsLnNjYWN0X2tleW51bWJlcik7DQo+ICsJ
CXJldHVybiBzY3RwX2F1dGhfc2V0X2FjdGl2ZV9rZXkoZXAsIGFzb2MsIHZhbC0+c2NhY3Rfa2V5
bnVtYmVyKTsNCj4gDQo+ICAJaWYgKHNjdHBfc3R5bGUoc2ssIFRDUCkpDQo+IC0JCXZhbC5zY2Fj
dF9hc3NvY19pZCA9IFNDVFBfRlVUVVJFX0FTU09DOw0KPiArCQl2YWwtPnNjYWN0X2Fzc29jX2lk
ID0gU0NUUF9GVVRVUkVfQVNTT0M7DQo+IA0KPiAtCWlmICh2YWwuc2NhY3RfYXNzb2NfaWQgPT0g
U0NUUF9GVVRVUkVfQVNTT0MgfHwNCj4gLQkgICAgdmFsLnNjYWN0X2Fzc29jX2lkID09IFNDVFBf
QUxMX0FTU09DKSB7DQo+IC0JCXJldCA9IHNjdHBfYXV0aF9zZXRfYWN0aXZlX2tleShlcCwgYXNv
YywgdmFsLnNjYWN0X2tleW51bWJlcik7DQo+ICsJaWYgKHZhbC0+c2NhY3RfYXNzb2NfaWQgPT0g
U0NUUF9GVVRVUkVfQVNTT0MgfHwNCj4gKwkgICAgdmFsLT5zY2FjdF9hc3NvY19pZCA9PSBTQ1RQ
X0FMTF9BU1NPQykgew0KPiArCQlyZXQgPSBzY3RwX2F1dGhfc2V0X2FjdGl2ZV9rZXkoZXAsIGFz
b2MsIHZhbC0+c2NhY3Rfa2V5bnVtYmVyKTsNCj4gIAkJaWYgKHJldCkNCj4gIAkJCXJldHVybiBy
ZXQ7DQo+ICAJfQ0KPiANCj4gLQlpZiAodmFsLnNjYWN0X2Fzc29jX2lkID09IFNDVFBfQ1VSUkVO
VF9BU1NPQyB8fA0KPiAtCSAgICB2YWwuc2NhY3RfYXNzb2NfaWQgPT0gU0NUUF9BTExfQVNTT0Mp
IHsNCj4gKwlpZiAodmFsLT5zY2FjdF9hc3NvY19pZCA9PSBTQ1RQX0NVUlJFTlRfQVNTT0MgfHwN
Cj4gKwkgICAgdmFsLT5zY2FjdF9hc3NvY19pZCA9PSBTQ1RQX0FMTF9BU1NPQykgew0KPiAgCQls
aXN0X2Zvcl9lYWNoX2VudHJ5KGFzb2MsICZlcC0+YXNvY3MsIGFzb2NzKSB7DQo+ICAJCQlpbnQg
cmVzID0gc2N0cF9hdXRoX3NldF9hY3RpdmVfa2V5KGVwLCBhc29jLA0KPiAtCQkJCQkJCSAgIHZh
bC5zY2FjdF9rZXludW1iZXIpOw0KPiArCQkJCQkJCSAgIHZhbC0+c2NhY3Rfa2V5bnVtYmVyKTsN
Cj4gDQo+ICAJCQlpZiAocmVzICYmICFyZXQpDQo+ICAJCQkJcmV0ID0gcmVzOw0KPiBAQCAtMzcx
NCw3ICszNzAzLDcgQEAgc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfYWN0aXZlX2tleShzdHJ1
Y3Qgc29jayAqc2ssDQo+ICAgKiBUaGlzIHNldCBvcHRpb24gd2lsbCBkZWxldGUgYSBzaGFyZWQg
c2VjcmV0IGtleSBmcm9tIHVzZS4NCj4gICAqLw0KPiAgc3RhdGljIGludCBzY3RwX3NldHNvY2tv
cHRfZGVsX2tleShzdHJ1Y3Qgc29jayAqc2ssDQo+IC0JCQkJICAgc3RydWN0IHNjdHBfYXV0aGtl
eWlkIHZhbCwNCj4gKwkJCQkgICBzdHJ1Y3Qgc2N0cF9hdXRoa2V5aWQgKnZhbCwNCj4gIAkJCQkg
ICB1bnNpZ25lZCBpbnQgb3B0bGVuKQ0KPiAgew0KPiAgCXN0cnVjdCBzY3RwX2VuZHBvaW50ICpl
cCA9IHNjdHBfc2soc2spLT5lcDsNCj4gQEAgLTM3MjQsMjkgKzM3MTMsMjkgQEAgc3RhdGljIGlu
dCBzY3RwX3NldHNvY2tvcHRfZGVsX2tleShzdHJ1Y3Qgc29jayAqc2ssDQo+ICAJaWYgKG9wdGxl
biAhPSBzaXplb2Yoc3RydWN0IHNjdHBfYXV0aGtleWlkKSkNCj4gIAkJcmV0dXJuIC1FSU5WQUw7
DQo+IA0KPiAtCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCB2YWwuc2NhY3RfYXNzb2NfaWQpOw0K
PiAtCWlmICghYXNvYyAmJiB2YWwuc2NhY3RfYXNzb2NfaWQgPiBTQ1RQX0FMTF9BU1NPQyAmJg0K
PiArCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCB2YWwtPnNjYWN0X2Fzc29jX2lkKTsNCj4gKwlp
ZiAoIWFzb2MgJiYgdmFsLT5zY2FjdF9hc3NvY19pZCA+IFNDVFBfQUxMX0FTU09DICYmDQo+ICAJ
ICAgIHNjdHBfc3R5bGUoc2ssIFVEUCkpDQo+ICAJCXJldHVybiAtRUlOVkFMOw0KPiANCj4gIAlp
ZiAoYXNvYykNCj4gLQkJcmV0dXJuIHNjdHBfYXV0aF9kZWxfa2V5X2lkKGVwLCBhc29jLCB2YWwu
c2NhY3Rfa2V5bnVtYmVyKTsNCj4gKwkJcmV0dXJuIHNjdHBfYXV0aF9kZWxfa2V5X2lkKGVwLCBh
c29jLCB2YWwtPnNjYWN0X2tleW51bWJlcik7DQo+IA0KPiAgCWlmIChzY3RwX3N0eWxlKHNrLCBU
Q1ApKQ0KPiAtCQl2YWwuc2NhY3RfYXNzb2NfaWQgPSBTQ1RQX0ZVVFVSRV9BU1NPQzsNCj4gKwkJ
dmFsLT5zY2FjdF9hc3NvY19pZCA9IFNDVFBfRlVUVVJFX0FTU09DOw0KPiANCj4gLQlpZiAodmFs
LnNjYWN0X2Fzc29jX2lkID09IFNDVFBfRlVUVVJFX0FTU09DIHx8DQo+IC0JICAgIHZhbC5zY2Fj
dF9hc3NvY19pZCA9PSBTQ1RQX0FMTF9BU1NPQykgew0KPiAtCQlyZXQgPSBzY3RwX2F1dGhfZGVs
X2tleV9pZChlcCwgYXNvYywgdmFsLnNjYWN0X2tleW51bWJlcik7DQo+ICsJaWYgKHZhbC0+c2Nh
Y3RfYXNzb2NfaWQgPT0gU0NUUF9GVVRVUkVfQVNTT0MgfHwNCj4gKwkgICAgdmFsLT5zY2FjdF9h
c3NvY19pZCA9PSBTQ1RQX0FMTF9BU1NPQykgew0KPiArCQlyZXQgPSBzY3RwX2F1dGhfZGVsX2tl
eV9pZChlcCwgYXNvYywgdmFsLT5zY2FjdF9rZXludW1iZXIpOw0KPiAgCQlpZiAocmV0KQ0KPiAg
CQkJcmV0dXJuIHJldDsNCj4gIAl9DQo+IA0KPiAtCWlmICh2YWwuc2NhY3RfYXNzb2NfaWQgPT0g
U0NUUF9DVVJSRU5UX0FTU09DIHx8DQo+IC0JICAgIHZhbC5zY2FjdF9hc3NvY19pZCA9PSBTQ1RQ
X0FMTF9BU1NPQykgew0KPiArCWlmICh2YWwtPnNjYWN0X2Fzc29jX2lkID09IFNDVFBfQ1VSUkVO
VF9BU1NPQyB8fA0KPiArCSAgICB2YWwtPnNjYWN0X2Fzc29jX2lkID09IFNDVFBfQUxMX0FTU09D
KSB7DQo+ICAJCWxpc3RfZm9yX2VhY2hfZW50cnkoYXNvYywgJmVwLT5hc29jcywgYXNvY3MpIHsN
Cj4gIAkJCWludCByZXMgPSBzY3RwX2F1dGhfZGVsX2tleV9pZChlcCwgYXNvYywNCj4gLQkJCQkJ
CSAgICAgICB2YWwuc2NhY3Rfa2V5bnVtYmVyKTsNCj4gKwkJCQkJCSAgICAgICB2YWwtPnNjYWN0
X2tleW51bWJlcik7DQo+IA0KPiAgCQkJaWYgKHJlcyAmJiAhcmV0KQ0KPiAgCQkJCXJldCA9IHJl
czsNCj4gQEAgLTM3NjIsNyArMzc1MSw3IEBAIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2Rl
bF9rZXkoc3RydWN0IHNvY2sgKnNrLA0KPiAgICogVGhpcyBzZXQgb3B0aW9uIHdpbGwgZGVhY3Rp
dmF0ZSBhIHNoYXJlZCBzZWNyZXQga2V5Lg0KPiAgICovDQo+ICBzdGF0aWMgaW50IHNjdHBfc2V0
c29ja29wdF9kZWFjdGl2YXRlX2tleShzdHJ1Y3Qgc29jayAqc2ssDQo+IC0JCQkJCSAgc3RydWN0
IHNjdHBfYXV0aGtleWlkIHZhbCwNCj4gKwkJCQkJICBzdHJ1Y3Qgc2N0cF9hdXRoa2V5aWQgKnZh
bCwNCj4gIAkJCQkJICB1bnNpZ25lZCBpbnQgb3B0bGVuKQ0KPiAgew0KPiAgCXN0cnVjdCBzY3Rw
X2VuZHBvaW50ICplcCA9IHNjdHBfc2soc2spLT5lcDsNCj4gQEAgLTM3NzIsMjkgKzM3NjEsMjkg
QEAgc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfZGVhY3RpdmF0ZV9rZXkoc3RydWN0IHNvY2sg
KnNrLA0KPiAgCWlmIChvcHRsZW4gIT0gc2l6ZW9mKHN0cnVjdCBzY3RwX2F1dGhrZXlpZCkpDQo+
ICAJCXJldHVybiAtRUlOVkFMOw0KPiANCj4gLQlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgdmFs
LnNjYWN0X2Fzc29jX2lkKTsNCj4gLQlpZiAoIWFzb2MgJiYgdmFsLnNjYWN0X2Fzc29jX2lkID4g
U0NUUF9BTExfQVNTT0MgJiYNCj4gKwlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgdmFsLT5zY2Fj
dF9hc3NvY19pZCk7DQo+ICsJaWYgKCFhc29jICYmIHZhbC0+c2NhY3RfYXNzb2NfaWQgPiBTQ1RQ
X0FMTF9BU1NPQyAmJg0KPiAgCSAgICBzY3RwX3N0eWxlKHNrLCBVRFApKQ0KPiAgCQlyZXR1cm4g
LUVJTlZBTDsNCj4gDQo+ICAJaWYgKGFzb2MpDQo+IC0JCXJldHVybiBzY3RwX2F1dGhfZGVhY3Rf
a2V5X2lkKGVwLCBhc29jLCB2YWwuc2NhY3Rfa2V5bnVtYmVyKTsNCj4gKwkJcmV0dXJuIHNjdHBf
YXV0aF9kZWFjdF9rZXlfaWQoZXAsIGFzb2MsIHZhbC0+c2NhY3Rfa2V5bnVtYmVyKTsNCj4gDQo+
ICAJaWYgKHNjdHBfc3R5bGUoc2ssIFRDUCkpDQo+IC0JCXZhbC5zY2FjdF9hc3NvY19pZCA9IFND
VFBfRlVUVVJFX0FTU09DOw0KPiArCQl2YWwtPnNjYWN0X2Fzc29jX2lkID0gU0NUUF9GVVRVUkVf
QVNTT0M7DQo+IA0KPiAtCWlmICh2YWwuc2NhY3RfYXNzb2NfaWQgPT0gU0NUUF9GVVRVUkVfQVNT
T0MgfHwNCj4gLQkgICAgdmFsLnNjYWN0X2Fzc29jX2lkID09IFNDVFBfQUxMX0FTU09DKSB7DQo+
IC0JCXJldCA9IHNjdHBfYXV0aF9kZWFjdF9rZXlfaWQoZXAsIGFzb2MsIHZhbC5zY2FjdF9rZXlu
dW1iZXIpOw0KPiArCWlmICh2YWwtPnNjYWN0X2Fzc29jX2lkID09IFNDVFBfRlVUVVJFX0FTU09D
IHx8DQo+ICsJICAgIHZhbC0+c2NhY3RfYXNzb2NfaWQgPT0gU0NUUF9BTExfQVNTT0MpIHsNCj4g
KwkJcmV0ID0gc2N0cF9hdXRoX2RlYWN0X2tleV9pZChlcCwgYXNvYywgdmFsLT5zY2FjdF9rZXlu
dW1iZXIpOw0KPiAgCQlpZiAocmV0KQ0KPiAgCQkJcmV0dXJuIHJldDsNCj4gIAl9DQo+IA0KPiAt
CWlmICh2YWwuc2NhY3RfYXNzb2NfaWQgPT0gU0NUUF9DVVJSRU5UX0FTU09DIHx8DQo+IC0JICAg
IHZhbC5zY2FjdF9hc3NvY19pZCA9PSBTQ1RQX0FMTF9BU1NPQykgew0KPiArCWlmICh2YWwtPnNj
YWN0X2Fzc29jX2lkID09IFNDVFBfQ1VSUkVOVF9BU1NPQyB8fA0KPiArCSAgICB2YWwtPnNjYWN0
X2Fzc29jX2lkID09IFNDVFBfQUxMX0FTU09DKSB7DQo+ICAJCWxpc3RfZm9yX2VhY2hfZW50cnko
YXNvYywgJmVwLT5hc29jcywgYXNvY3MpIHsNCj4gIAkJCWludCByZXMgPSBzY3RwX2F1dGhfZGVh
Y3Rfa2V5X2lkKGVwLCBhc29jLA0KPiAtCQkJCQkJCSB2YWwuc2NhY3Rfa2V5bnVtYmVyKTsNCj4g
KwkJCQkJCQkgdmFsLT5zY2FjdF9rZXludW1iZXIpOw0KPiANCj4gIAkJCWlmIChyZXMgJiYgIXJl
dCkNCj4gIAkJCQlyZXQgPSByZXM7DQo+IEBAIC0zODAzLDcgKzM3OTIsNiBAQCBzdGF0aWMgaW50
IHNjdHBfc2V0c29ja29wdF9kZWFjdGl2YXRlX2tleShzdHJ1Y3Qgc29jayAqc2ssDQo+IA0KPiAg
CXJldHVybiByZXQ7DQo+ICB9DQo+IC0jdW5kZWYgdmFsDQo+IA0KPiAgLyoNCj4gICAqIDguMS4y
MyBTQ1RQX0FVVE9fQVNDT05GDQo+IEBAIC0zODE5LDI0ICszODA3LDIzIEBAIHN0YXRpYyBpbnQg
c2N0cF9zZXRzb2Nrb3B0X2RlYWN0aXZhdGVfa2V5KHN0cnVjdCBzb2NrICpzaywNCj4gICAqIE5v
dGUuIEluIHRoaXMgaW1wbGVtZW50YXRpb24sIHNvY2tldCBvcGVyYXRpb24gb3ZlcnJpZGVzIGRl
ZmF1bHQgcGFyYW1ldGVyDQo+ICAgKiBiZWluZyBzZXQgYnkgc3lzY3RsIGFzIHdlbGwgYXMgRnJl
ZUJTRCBpbXBsZW1lbnRhdGlvbg0KPiAgICovDQo+IC0jZGVmaW5lIHZhbCAoKm9wdHZhbCkNCj4g
LXN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2F1dG9fYXNjb25mKHN0cnVjdCBzb2NrICpzaywg
aW50IHZhbCwNCj4gK3N0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2F1dG9fYXNjb25mKHN0cnVj
dCBzb2NrICpzaywgaW50ICpvcHR2YWwsDQo+ICAJCQkJICAgICAgIHVuc2lnbmVkIGludCBvcHRs
ZW4pDQo+ICB7DQo+ICAJc3RydWN0IHNjdHBfc29jayAqc3AgPSBzY3RwX3NrKHNrKTsNCj4gDQo+
ICAJaWYgKG9wdGxlbiA8IHNpemVvZihpbnQpKQ0KPiAgCQlyZXR1cm4gLUVJTlZBTDsNCj4gLQlp
ZiAoIXNjdHBfaXNfZXBfYm91bmRhbGwoc2spICYmIHZhbCkNCj4gKwlpZiAoIXNjdHBfaXNfZXBf
Ym91bmRhbGwoc2spICYmICgqb3B0dmFsKSkNCj4gIAkJcmV0dXJuIC1FSU5WQUw7DQo+IC0JaWYg
KCh2YWwgJiYgc3AtPmRvX2F1dG9fYXNjb25mKSB8fCAoIXZhbCAmJiAhc3AtPmRvX2F1dG9fYXNj
b25mKSkNCj4gKwlpZiAoKCgqb3B0dmFsKSAmJiBzcC0+ZG9fYXV0b19hc2NvbmYpIHx8ICghKCpv
cHR2YWwpICYmICFzcC0+ZG9fYXV0b19hc2NvbmYpKQ0KPiAgCQlyZXR1cm4gMDsNCj4gDQo+ICAJ
c3Bpbl9sb2NrX2JoKCZzb2NrX25ldChzayktPnNjdHAuYWRkcl93cV9sb2NrKTsNCj4gLQlpZiAo
dmFsID09IDAgJiYgc3AtPmRvX2F1dG9fYXNjb25mKSB7DQo+ICsJaWYgKCgqb3B0dmFsKSA9PSAw
ICYmIHNwLT5kb19hdXRvX2FzY29uZikgew0KPiAgCQlsaXN0X2RlbCgmc3AtPmF1dG9fYXNjb25m
X2xpc3QpOw0KPiAgCQlzcC0+ZG9fYXV0b19hc2NvbmYgPSAwOw0KPiAtCX0gZWxzZSBpZiAodmFs
ICYmICFzcC0+ZG9fYXV0b19hc2NvbmYpIHsNCj4gKwl9IGVsc2UgaWYgKCgqb3B0dmFsKSAmJiAh
c3AtPmRvX2F1dG9fYXNjb25mKSB7DQo+ICAJCWxpc3RfYWRkX3RhaWwoJnNwLT5hdXRvX2FzY29u
Zl9saXN0LA0KPiAgCQkgICAgJnNvY2tfbmV0KHNrKS0+c2N0cC5hdXRvX2FzY29uZl9zcGxpc3Qp
Ow0KPiAgCQlzcC0+ZG9fYXV0b19hc2NvbmYgPSAxOw0KPiBAQCAtMzg0NCw3ICszODMxLDYgQEAg
c3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfYXV0b19hc2NvbmYoc3RydWN0IHNvY2sgKnNrLCBp
bnQgdmFsLA0KPiAgCXNwaW5fdW5sb2NrX2JoKCZzb2NrX25ldChzayktPnNjdHAuYWRkcl93cV9s
b2NrKTsNCj4gIAlyZXR1cm4gMDsNCj4gIH0NCj4gLSN1bmRlZiB2YWwNCj4gDQo+ICAvKg0KPiAg
ICogU0NUUF9QRUVSX0FERFJfVEhMRFMNCj4gQEAgLTM4NTMsNzAgKzM4MzksNjggQEAgc3RhdGlj
IGludCBzY3RwX3NldHNvY2tvcHRfYXV0b19hc2NvbmYoc3RydWN0IHNvY2sgKnNrLCBpbnQgdmFs
LA0KPiAgICogdHJhbnNwb3J0cyBpbiBhbiBhc3NvY2lhdGlvbi4gIFNlZSBTZWN0aW9uIDYuMSBv
ZjoNCj4gICAqIGh0dHA6Ly93d3cuaWV0Zi5vcmcvaWQvZHJhZnQtbmlzaGlkYS10c3Z3Zy1zY3Rw
LWZhaWxvdmVyLTA1LnR4dA0KPiAgICovDQo+IC0jZGVmaW5lIHZhbCAoKnZhbCkNCj4gIHN0YXRp
YyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3BhZGRyX3RocmVzaG9sZHMoc3RydWN0IHNvY2sgKnNrLA0K
PiAtCQkJCQkgICAgc3RydWN0IHNjdHBfcGFkZHJ0aGxkc192MiB2YWwsDQo+ICsJCQkJCSAgICBz
dHJ1Y3Qgc2N0cF9wYWRkcnRobGRzX3YyICp2YWwsDQo+ICAJCQkJCSAgICB1bnNpZ25lZCBpbnQg
b3B0bGVuLCBib29sIHYyKQ0KPiAgew0KPiAgCXN0cnVjdCBzY3RwX3RyYW5zcG9ydCAqdHJhbnM7
DQo+ICAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7DQo+ICAJaW50IGxlbjsNCj4gDQo+
IC0JbGVuID0gdjIgPyBzaXplb2YodmFsKSA6IHNpemVvZihzdHJ1Y3Qgc2N0cF9wYWRkcnRobGRz
KTsNCj4gKwlsZW4gPSB2MiA/IHNpemVvZigqdmFsKSA6IHNpemVvZihzdHJ1Y3Qgc2N0cF9wYWRk
cnRobGRzKTsNCj4gIAlpZiAob3B0bGVuIDwgbGVuKQ0KPiAgCQlyZXR1cm4gLUVJTlZBTDsNCj4g
DQo+IC0JaWYgKHYyICYmIHZhbC5zcHRfcGF0aHBmdGhsZCA+IHZhbC5zcHRfcGF0aGNwdGhsZCkN
Cj4gKwlpZiAodjIgJiYgdmFsLT5zcHRfcGF0aHBmdGhsZCA+IHZhbC0+c3B0X3BhdGhjcHRobGQp
DQo+ICAJCXJldHVybiAtRUlOVkFMOw0KPiANCj4gLQlpZiAoIXNjdHBfaXNfYW55KHNrLCAoY29u
c3QgdW5pb24gc2N0cF9hZGRyICopJnZhbC5zcHRfYWRkcmVzcykpIHsNCj4gLQkJdHJhbnMgPSBz
Y3RwX2FkZHJfaWQydHJhbnNwb3J0KHNrLCAmdmFsLnNwdF9hZGRyZXNzLA0KPiAtCQkJCQkgICAg
ICAgdmFsLnNwdF9hc3NvY19pZCk7DQo+ICsJaWYgKCFzY3RwX2lzX2FueShzaywgKGNvbnN0IHVu
aW9uIHNjdHBfYWRkciAqKSZ2YWwtPnNwdF9hZGRyZXNzKSkgew0KPiArCQl0cmFucyA9IHNjdHBf
YWRkcl9pZDJ0cmFuc3BvcnQoc2ssICZ2YWwtPnNwdF9hZGRyZXNzLA0KPiArCQkJCQkgICAgICAg
dmFsLT5zcHRfYXNzb2NfaWQpOw0KPiAgCQlpZiAoIXRyYW5zKQ0KPiAgCQkJcmV0dXJuIC1FTk9F
TlQ7DQo+IA0KPiAtCQlpZiAodmFsLnNwdF9wYXRobWF4cnh0KQ0KPiAtCQkJdHJhbnMtPnBhdGht
YXhyeHQgPSB2YWwuc3B0X3BhdGhtYXhyeHQ7DQo+ICsJCWlmICh2YWwtPnNwdF9wYXRobWF4cnh0
KQ0KPiArCQkJdHJhbnMtPnBhdGhtYXhyeHQgPSB2YWwtPnNwdF9wYXRobWF4cnh0Ow0KPiAgCQlp
ZiAodjIpDQo+IC0JCQl0cmFucy0+cHNfcmV0cmFucyA9IHZhbC5zcHRfcGF0aGNwdGhsZDsNCj4g
LQkJdHJhbnMtPnBmX3JldHJhbnMgPSB2YWwuc3B0X3BhdGhwZnRobGQ7DQo+ICsJCQl0cmFucy0+
cHNfcmV0cmFucyA9IHZhbC0+c3B0X3BhdGhjcHRobGQ7DQo+ICsJCXRyYW5zLT5wZl9yZXRyYW5z
ID0gdmFsLT5zcHRfcGF0aHBmdGhsZDsNCj4gDQo+ICAJCXJldHVybiAwOw0KPiAgCX0NCj4gDQo+
IC0JYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIHZhbC5zcHRfYXNzb2NfaWQpOw0KPiAtCWlmICgh
YXNvYyAmJiB2YWwuc3B0X2Fzc29jX2lkICE9IFNDVFBfRlVUVVJFX0FTU09DICYmDQo+ICsJYXNv
YyA9IHNjdHBfaWQyYXNzb2Moc2ssIHZhbC0+c3B0X2Fzc29jX2lkKTsNCj4gKwlpZiAoIWFzb2Mg
JiYgdmFsLT5zcHRfYXNzb2NfaWQgIT0gU0NUUF9GVVRVUkVfQVNTT0MgJiYNCj4gIAkgICAgc2N0
cF9zdHlsZShzaywgVURQKSkNCj4gIAkJcmV0dXJuIC1FSU5WQUw7DQo+IA0KPiAgCWlmIChhc29j
KSB7DQo+ICAJCWxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnMsICZhc29jLT5wZWVyLnRyYW5zcG9y
dF9hZGRyX2xpc3QsDQo+ICAJCQkJICAgIHRyYW5zcG9ydHMpIHsNCj4gLQkJCWlmICh2YWwuc3B0
X3BhdGhtYXhyeHQpDQo+IC0JCQkJdHJhbnMtPnBhdGhtYXhyeHQgPSB2YWwuc3B0X3BhdGhtYXhy
eHQ7DQo+ICsJCQlpZiAodmFsLT5zcHRfcGF0aG1heHJ4dCkNCj4gKwkJCQl0cmFucy0+cGF0aG1h
eHJ4dCA9IHZhbC0+c3B0X3BhdGhtYXhyeHQ7DQo+ICAJCQlpZiAodjIpDQo+IC0JCQkJdHJhbnMt
PnBzX3JldHJhbnMgPSB2YWwuc3B0X3BhdGhjcHRobGQ7DQo+IC0JCQl0cmFucy0+cGZfcmV0cmFu
cyA9IHZhbC5zcHRfcGF0aHBmdGhsZDsNCj4gKwkJCQl0cmFucy0+cHNfcmV0cmFucyA9IHZhbC0+
c3B0X3BhdGhjcHRobGQ7DQo+ICsJCQl0cmFucy0+cGZfcmV0cmFucyA9IHZhbC0+c3B0X3BhdGhw
ZnRobGQ7DQo+ICAJCX0NCj4gDQo+IC0JCWlmICh2YWwuc3B0X3BhdGhtYXhyeHQpDQo+IC0JCQlh
c29jLT5wYXRobWF4cnh0ID0gdmFsLnNwdF9wYXRobWF4cnh0Ow0KPiArCQlpZiAodmFsLT5zcHRf
cGF0aG1heHJ4dCkNCj4gKwkJCWFzb2MtPnBhdGhtYXhyeHQgPSB2YWwtPnNwdF9wYXRobWF4cnh0
Ow0KPiAgCQlpZiAodjIpDQo+IC0JCQlhc29jLT5wc19yZXRyYW5zID0gdmFsLnNwdF9wYXRoY3B0
aGxkOw0KPiAtCQlhc29jLT5wZl9yZXRyYW5zID0gdmFsLnNwdF9wYXRocGZ0aGxkOw0KPiArCQkJ
YXNvYy0+cHNfcmV0cmFucyA9IHZhbC0+c3B0X3BhdGhjcHRobGQ7DQo+ICsJCWFzb2MtPnBmX3Jl
dHJhbnMgPSB2YWwtPnNwdF9wYXRocGZ0aGxkOw0KPiAgCX0gZWxzZSB7DQo+ICAJCXN0cnVjdCBz
Y3RwX3NvY2sgKnNwID0gc2N0cF9zayhzayk7DQo+IA0KPiAtCQlpZiAodmFsLnNwdF9wYXRobWF4
cnh0KQ0KPiAtCQkJc3AtPnBhdGhtYXhyeHQgPSB2YWwuc3B0X3BhdGhtYXhyeHQ7DQo+ICsJCWlm
ICh2YWwtPnNwdF9wYXRobWF4cnh0KQ0KPiArCQkJc3AtPnBhdGhtYXhyeHQgPSB2YWwtPnNwdF9w
YXRobWF4cnh0Ow0KPiAgCQlpZiAodjIpDQo+IC0JCQlzcC0+cHNfcmV0cmFucyA9IHZhbC5zcHRf
cGF0aGNwdGhsZDsNCj4gLQkJc3AtPnBmX3JldHJhbnMgPSB2YWwuc3B0X3BhdGhwZnRobGQ7DQo+
ICsJCQlzcC0+cHNfcmV0cmFucyA9IHZhbC0+c3B0X3BhdGhjcHRobGQ7DQo+ICsJCXNwLT5wZl9y
ZXRyYW5zID0gdmFsLT5zcHRfcGF0aHBmdGhsZDsNCj4gIAl9DQo+IA0KPiAgCXJldHVybiAwOw0K
PiAgfQ0KPiAtI3VuZGVmIHZhbA0KPiANCj4gIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3Jl
Y3ZyY3ZpbmZvKHN0cnVjdCBzb2NrICpzaywgaW50ICpvcHR2YWwsDQo+ICAJCQkJICAgICAgIHVu
c2lnbmVkIGludCBvcHRsZW4pDQo+IEBAIC0zOTQxLDkyICszOTI1LDkxIEBAIHN0YXRpYyBpbnQg
c2N0cF9zZXRzb2Nrb3B0X3JlY3ZueHRpbmZvKHN0cnVjdCBzb2NrICpzaywgaW50ICpvcHR2YWws
DQo+ICB9DQo+IA0KPiAgc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfcHJfc3VwcG9ydGVkKHN0
cnVjdCBzb2NrICpzaywNCj4gLQkJCQkJc3RydWN0IHNjdHBfYXNzb2NfdmFsdWUgcGFyYW1zLA0K
PiArCQkJCQlzdHJ1Y3Qgc2N0cF9hc3NvY192YWx1ZSAqcGFyYW1zLA0KPiAgCQkJCQl1bnNpZ25l
ZCBpbnQgb3B0bGVuKQ0KPiAgew0KPiAgCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOw0K
PiANCj4gLQlpZiAob3B0bGVuICE9IHNpemVvZihwYXJhbXMpKQ0KPiArCWlmIChvcHRsZW4gIT0g
c2l6ZW9mKCpwYXJhbXMpKQ0KPiAgCQlyZXR1cm4gLUVJTlZBTDsNCj4gDQo+IC0JYXNvYyA9IHNj
dHBfaWQyYXNzb2Moc2ssIHBhcmFtcy5hc3NvY19pZCk7DQo+IC0JaWYgKCFhc29jICYmIHBhcmFt
cy5hc3NvY19pZCAhPSBTQ1RQX0ZVVFVSRV9BU1NPQyAmJg0KPiArCWFzb2MgPSBzY3RwX2lkMmFz
c29jKHNrLCBwYXJhbXMtPmFzc29jX2lkKTsNCj4gKwlpZiAoIWFzb2MgJiYgcGFyYW1zLT5hc3Nv
Y19pZCAhPSBTQ1RQX0ZVVFVSRV9BU1NPQyAmJg0KPiAgCSAgICBzY3RwX3N0eWxlKHNrLCBVRFAp
KQ0KPiAgCQlyZXR1cm4gLUVJTlZBTDsNCj4gDQo+IC0Jc2N0cF9zayhzayktPmVwLT5wcnNjdHBf
ZW5hYmxlID0gISFwYXJhbXMuYXNzb2NfdmFsdWU7DQo+ICsJc2N0cF9zayhzayktPmVwLT5wcnNj
dHBfZW5hYmxlID0gISFwYXJhbXMtPmFzc29jX3ZhbHVlOw0KPiANCj4gIAlyZXR1cm4gMDsNCj4g
IH0NCj4gDQo+ICBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9kZWZhdWx0X3ByaW5mbyhzdHJ1
Y3Qgc29jayAqc2ssDQo+IC0JCQkJCSAgc3RydWN0IHNjdHBfZGVmYXVsdF9wcmluZm8gaW5mbywN
Cj4gKwkJCQkJICBzdHJ1Y3Qgc2N0cF9kZWZhdWx0X3ByaW5mbyAqaW5mbywNCj4gIAkJCQkJICB1
bnNpZ25lZCBpbnQgb3B0bGVuKQ0KPiAgew0KPiAgCXN0cnVjdCBzY3RwX3NvY2sgKnNwID0gc2N0
cF9zayhzayk7DQo+ICAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7DQo+ICAJaW50IHJl
dHZhbCA9IC1FSU5WQUw7DQo+IA0KPiAtCWlmIChvcHRsZW4gIT0gc2l6ZW9mKGluZm8pKQ0KPiAr
CWlmIChvcHRsZW4gIT0gc2l6ZW9mKCppbmZvKSkNCj4gIAkJZ290byBvdXQ7DQo+IA0KPiAtCWlm
IChpbmZvLnByX3BvbGljeSAmIH5TQ1RQX1BSX1NDVFBfTUFTSykNCj4gKwlpZiAoaW5mby0+cHJf
cG9saWN5ICYgflNDVFBfUFJfU0NUUF9NQVNLKQ0KPiAgCQlnb3RvIG91dDsNCj4gDQo+IC0JaWYg
KGluZm8ucHJfcG9saWN5ID09IFNDVFBfUFJfU0NUUF9OT05FKQ0KPiAtCQlpbmZvLnByX3ZhbHVl
ID0gMDsNCj4gKwlpZiAoaW5mby0+cHJfcG9saWN5ID09IFNDVFBfUFJfU0NUUF9OT05FKQ0KPiAr
CQlpbmZvLT5wcl92YWx1ZSA9IDA7DQo+IA0KPiAtCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCBp
bmZvLnByX2Fzc29jX2lkKTsNCj4gLQlpZiAoIWFzb2MgJiYgaW5mby5wcl9hc3NvY19pZCA+IFND
VFBfQUxMX0FTU09DICYmDQo+ICsJYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIGluZm8tPnByX2Fz
c29jX2lkKTsNCj4gKwlpZiAoIWFzb2MgJiYgaW5mby0+cHJfYXNzb2NfaWQgPiBTQ1RQX0FMTF9B
U1NPQyAmJg0KPiAgCSAgICBzY3RwX3N0eWxlKHNrLCBVRFApKQ0KPiAgCQlnb3RvIG91dDsNCj4g
DQo+ICAJcmV0dmFsID0gMDsNCj4gDQo+ICAJaWYgKGFzb2MpIHsNCj4gLQkJU0NUUF9QUl9TRVRf
UE9MSUNZKGFzb2MtPmRlZmF1bHRfZmxhZ3MsIGluZm8ucHJfcG9saWN5KTsNCj4gLQkJYXNvYy0+
ZGVmYXVsdF90aW1ldG9saXZlID0gaW5mby5wcl92YWx1ZTsNCj4gKwkJU0NUUF9QUl9TRVRfUE9M
SUNZKGFzb2MtPmRlZmF1bHRfZmxhZ3MsIGluZm8tPnByX3BvbGljeSk7DQo+ICsJCWFzb2MtPmRl
ZmF1bHRfdGltZXRvbGl2ZSA9IGluZm8tPnByX3ZhbHVlOw0KPiAgCQlnb3RvIG91dDsNCj4gIAl9
DQo+IA0KPiAgCWlmIChzY3RwX3N0eWxlKHNrLCBUQ1ApKQ0KPiAtCQlpbmZvLnByX2Fzc29jX2lk
ID0gU0NUUF9GVVRVUkVfQVNTT0M7DQo+ICsJCWluZm8tPnByX2Fzc29jX2lkID0gU0NUUF9GVVRV
UkVfQVNTT0M7DQo+IA0KPiAtCWlmIChpbmZvLnByX2Fzc29jX2lkID09IFNDVFBfRlVUVVJFX0FT
U09DIHx8DQo+IC0JICAgIGluZm8ucHJfYXNzb2NfaWQgPT0gU0NUUF9BTExfQVNTT0MpIHsNCj4g
LQkJU0NUUF9QUl9TRVRfUE9MSUNZKHNwLT5kZWZhdWx0X2ZsYWdzLCBpbmZvLnByX3BvbGljeSk7
DQo+IC0JCXNwLT5kZWZhdWx0X3RpbWV0b2xpdmUgPSBpbmZvLnByX3ZhbHVlOw0KPiArCWlmIChp
bmZvLT5wcl9hc3NvY19pZCA9PSBTQ1RQX0ZVVFVSRV9BU1NPQyB8fA0KPiArCSAgICBpbmZvLT5w
cl9hc3NvY19pZCA9PSBTQ1RQX0FMTF9BU1NPQykgew0KPiArCQlTQ1RQX1BSX1NFVF9QT0xJQ1ko
c3AtPmRlZmF1bHRfZmxhZ3MsIGluZm8tPnByX3BvbGljeSk7DQo+ICsJCXNwLT5kZWZhdWx0X3Rp
bWV0b2xpdmUgPSBpbmZvLT5wcl92YWx1ZTsNCj4gIAl9DQo+IA0KPiAtCWlmIChpbmZvLnByX2Fz
c29jX2lkID09IFNDVFBfQ1VSUkVOVF9BU1NPQyB8fA0KPiAtCSAgICBpbmZvLnByX2Fzc29jX2lk
ID09IFNDVFBfQUxMX0FTU09DKSB7DQo+ICsJaWYgKGluZm8tPnByX2Fzc29jX2lkID09IFNDVFBf
Q1VSUkVOVF9BU1NPQyB8fA0KPiArCSAgICBpbmZvLT5wcl9hc3NvY19pZCA9PSBTQ1RQX0FMTF9B
U1NPQykgew0KPiAgCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFzb2MsICZzcC0+ZXAtPmFzb2NzLCBh
c29jcykgew0KPiAtCQkJU0NUUF9QUl9TRVRfUE9MSUNZKGFzb2MtPmRlZmF1bHRfZmxhZ3MsIGlu
Zm8ucHJfcG9saWN5KTsNCj4gLQkJCWFzb2MtPmRlZmF1bHRfdGltZXRvbGl2ZSA9IGluZm8ucHJf
dmFsdWU7DQo+ICsJCQlTQ1RQX1BSX1NFVF9QT0xJQ1koYXNvYy0+ZGVmYXVsdF9mbGFncywgaW5m
by0+cHJfcG9saWN5KTsNCj4gKwkJCWFzb2MtPmRlZmF1bHRfdGltZXRvbGl2ZSA9IGluZm8tPnBy
X3ZhbHVlOw0KPiAgCQl9DQo+ICAJfQ0KPiANCj4gIG91dDoNCj4gIAlyZXR1cm4gcmV0dmFsOw0K
PiAgfQ0KPiAtI3VuZGVmIGluZm8NCj4gDQo+ICBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9y
ZWNvbmZpZ19zdXBwb3J0ZWQoc3RydWN0IHNvY2sgKnNrLA0KPiAtCQkJCQkgICAgICBzdHJ1Y3Qg
c2N0cF9hc3NvY192YWx1ZSBwYXJhbXMsDQo+ICsJCQkJCSAgICAgIHN0cnVjdCBzY3RwX2Fzc29j
X3ZhbHVlICpwYXJhbXMsDQo+ICAJCQkJCSAgICAgIHVuc2lnbmVkIGludCBvcHRsZW4pDQo+ICB7
DQo+ICAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7DQo+ICAJaW50IHJldHZhbCA9IC1F
SU5WQUw7DQo+IA0KPiAtCWlmIChvcHRsZW4gIT0gc2l6ZW9mKHBhcmFtcykpDQo+ICsJaWYgKG9w
dGxlbiAhPSBzaXplb2YoKnBhcmFtcykpDQo+ICAJCWdvdG8gb3V0Ow0KPiANCj4gLQlhc29jID0g
c2N0cF9pZDJhc3NvYyhzaywgcGFyYW1zLmFzc29jX2lkKTsNCj4gLQlpZiAoIWFzb2MgJiYgcGFy
YW1zLmFzc29jX2lkICE9IFNDVFBfRlVUVVJFX0FTU09DICYmDQo+ICsJYXNvYyA9IHNjdHBfaWQy
YXNzb2Moc2ssIHBhcmFtcy0+YXNzb2NfaWQpOw0KPiArCWlmICghYXNvYyAmJiBwYXJhbXMtPmFz
c29jX2lkICE9IFNDVFBfRlVUVVJFX0FTU09DICYmDQo+ICAJICAgIHNjdHBfc3R5bGUoc2ssIFVE
UCkpDQo+ICAJCWdvdG8gb3V0Ow0KPiANCj4gLQlzY3RwX3NrKHNrKS0+ZXAtPnJlY29uZl9lbmFi
bGUgPSAhIXBhcmFtcy5hc3NvY192YWx1ZTsNCj4gKwlzY3RwX3NrKHNrKS0+ZXAtPnJlY29uZl9l
bmFibGUgPSAhIXBhcmFtcy0+YXNzb2NfdmFsdWU7DQo+IA0KPiAgCXJldHZhbCA9IDA7DQo+IA0K
PiBAQCAtNDAzNSw0OCArNDAxOCw0NyBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9yZWNv
bmZpZ19zdXBwb3J0ZWQoc3RydWN0IHNvY2sgKnNrLA0KPiAgfQ0KPiANCj4gIHN0YXRpYyBpbnQg
c2N0cF9zZXRzb2Nrb3B0X2VuYWJsZV9zdHJyZXNldChzdHJ1Y3Qgc29jayAqc2ssDQo+IC0JCQkJ
CSAgIHN0cnVjdCBzY3RwX2Fzc29jX3ZhbHVlIHBhcmFtcywNCj4gKwkJCQkJICAgc3RydWN0IHNj
dHBfYXNzb2NfdmFsdWUgKnBhcmFtcywNCj4gIAkJCQkJICAgdW5zaWduZWQgaW50IG9wdGxlbikN
Cj4gIHsNCj4gIAlzdHJ1Y3Qgc2N0cF9lbmRwb2ludCAqZXAgPSBzY3RwX3NrKHNrKS0+ZXA7DQo+
ICAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7DQo+ICAJaW50IHJldHZhbCA9IC1FSU5W
QUw7DQo+IA0KPiAtCWlmIChvcHRsZW4gIT0gc2l6ZW9mKHBhcmFtcykpDQo+ICsJaWYgKG9wdGxl
biAhPSBzaXplb2YoKnBhcmFtcykpDQo+ICAJCWdvdG8gb3V0Ow0KPiANCj4gLQlpZiAocGFyYW1z
LmFzc29jX3ZhbHVlICYgKH5TQ1RQX0VOQUJMRV9TVFJSRVNFVF9NQVNLKSkNCj4gKwlpZiAocGFy
YW1zLT5hc3NvY192YWx1ZSAmICh+U0NUUF9FTkFCTEVfU1RSUkVTRVRfTUFTSykpDQo+ICAJCWdv
dG8gb3V0Ow0KPiANCj4gLQlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgcGFyYW1zLmFzc29jX2lk
KTsNCj4gLQlpZiAoIWFzb2MgJiYgcGFyYW1zLmFzc29jX2lkID4gU0NUUF9BTExfQVNTT0MgJiYN
Cj4gKwlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgcGFyYW1zLT5hc3NvY19pZCk7DQo+ICsJaWYg
KCFhc29jICYmIHBhcmFtcy0+YXNzb2NfaWQgPiBTQ1RQX0FMTF9BU1NPQyAmJg0KPiAgCSAgICBz
Y3RwX3N0eWxlKHNrLCBVRFApKQ0KPiAgCQlnb3RvIG91dDsNCj4gDQo+ICAJcmV0dmFsID0gMDsN
Cj4gDQo+ICAJaWYgKGFzb2MpIHsNCj4gLQkJYXNvYy0+c3RycmVzZXRfZW5hYmxlID0gcGFyYW1z
LmFzc29jX3ZhbHVlOw0KPiArCQlhc29jLT5zdHJyZXNldF9lbmFibGUgPSBwYXJhbXMtPmFzc29j
X3ZhbHVlOw0KPiAgCQlnb3RvIG91dDsNCj4gIAl9DQo+IA0KPiAgCWlmIChzY3RwX3N0eWxlKHNr
LCBUQ1ApKQ0KPiAtCQlwYXJhbXMuYXNzb2NfaWQgPSBTQ1RQX0ZVVFVSRV9BU1NPQzsNCj4gKwkJ
cGFyYW1zLT5hc3NvY19pZCA9IFNDVFBfRlVUVVJFX0FTU09DOw0KPiANCj4gLQlpZiAocGFyYW1z
LmFzc29jX2lkID09IFNDVFBfRlVUVVJFX0FTU09DIHx8DQo+IC0JICAgIHBhcmFtcy5hc3NvY19p
ZCA9PSBTQ1RQX0FMTF9BU1NPQykNCj4gLQkJZXAtPnN0cnJlc2V0X2VuYWJsZSA9IHBhcmFtcy5h
c3NvY192YWx1ZTsNCj4gKwlpZiAocGFyYW1zLT5hc3NvY19pZCA9PSBTQ1RQX0ZVVFVSRV9BU1NP
QyB8fA0KPiArCSAgICBwYXJhbXMtPmFzc29jX2lkID09IFNDVFBfQUxMX0FTU09DKQ0KPiArCQll
cC0+c3RycmVzZXRfZW5hYmxlID0gcGFyYW1zLT5hc3NvY192YWx1ZTsNCj4gDQo+IC0JaWYgKHBh
cmFtcy5hc3NvY19pZCA9PSBTQ1RQX0NVUlJFTlRfQVNTT0MgfHwNCj4gLQkgICAgcGFyYW1zLmFz
c29jX2lkID09IFNDVFBfQUxMX0FTU09DKQ0KPiArCWlmIChwYXJhbXMtPmFzc29jX2lkID09IFND
VFBfQ1VSUkVOVF9BU1NPQyB8fA0KPiArCSAgICBwYXJhbXMtPmFzc29jX2lkID09IFNDVFBfQUxM
X0FTU09DKQ0KPiAgCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFzb2MsICZlcC0+YXNvY3MsIGFzb2Nz
KQ0KPiAtCQkJYXNvYy0+c3RycmVzZXRfZW5hYmxlID0gcGFyYW1zLmFzc29jX3ZhbHVlOw0KPiAr
CQkJYXNvYy0+c3RycmVzZXRfZW5hYmxlID0gcGFyYW1zLT5hc3NvY192YWx1ZTsNCj4gDQo+ICBv
dXQ6DQo+ICAJcmV0dXJuIHJldHZhbDsNCj4gIH0NCj4gDQo+IC0jdW5kZWYgcGFyYW1zDQo+ICBz
dGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9yZXNldF9zdHJlYW1zKHN0cnVjdCBzb2NrICpzaywN
Cj4gIAkJCQkJIHN0cnVjdCBzY3RwX3Jlc2V0X3N0cmVhbXMgKnBhcmFtcywNCj4gIAkJCQkJIHVu
c2lnbmVkIGludCBvcHRsZW4pDQo+IEBAIC00MTAzLDIwICs0MDg1LDE3IEBAIHN0YXRpYyBpbnQg
c2N0cF9zZXRzb2Nrb3B0X3Jlc2V0X3N0cmVhbXMoc3RydWN0IHNvY2sgKnNrLA0KPiAgb3V0Og0K
PiAgCXJldHVybiByZXR2YWw7DQo+ICB9DQo+IC0jZGVmaW5lIHBhcmFtcyAoKnBhcmFtcykNCj4g
DQo+IC0NCj4gLSNkZWZpbmUgYXNzb2NpZCAoKmFzc29jaWQpDQo+IC1zdGF0aWMgaW50IHNjdHBf
c2V0c29ja29wdF9yZXNldF9hc3NvYyhzdHJ1Y3Qgc29jayAqc2ssIHNjdHBfYXNzb2NfdCBhc3Nv
Y2lkLA0KPiArc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfcmVzZXRfYXNzb2Moc3RydWN0IHNv
Y2sgKnNrLCBzY3RwX2Fzc29jX3QgKmFzc29jaWQsDQo+ICAJCQkJICAgICAgIHVuc2lnbmVkIGlu
dCBvcHRsZW4pDQo+ICB7DQo+ICAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7DQo+ICAJ
aW50IHJldHZhbCA9IC1FSU5WQUw7DQo+IA0KPiAtCWlmIChvcHRsZW4gIT0gc2l6ZW9mKGFzc29j
aWQpKQ0KPiArCWlmIChvcHRsZW4gIT0gc2l6ZW9mKCphc3NvY2lkKSkNCj4gIAkJZ290byBvdXQ7
DQo+IA0KPiAtCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCBhc3NvY2lkKTsNCj4gKwlhc29jID0g
c2N0cF9pZDJhc3NvYyhzaywgKCphc3NvY2lkKSk7DQo+ICAJaWYgKCFhc29jKQ0KPiAgCQlnb3Rv
IG91dDsNCj4gDQo+IEBAIC00MTI1LDYyICs0MTA0LDYxIEBAIHN0YXRpYyBpbnQgc2N0cF9zZXRz
b2Nrb3B0X3Jlc2V0X2Fzc29jKHN0cnVjdCBzb2NrICpzaywgc2N0cF9hc3NvY190IGFzc29jaWQs
DQo+ICBvdXQ6DQo+ICAJcmV0dXJuIHJldHZhbDsNCj4gIH0NCj4gLSN1bmRlZiBhc3NvY2lkDQo+
IA0KPiAgc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfYWRkX3N0cmVhbXMoc3RydWN0IHNvY2sg
KnNrLA0KPiAtCQkJCSAgICAgICBzdHJ1Y3Qgc2N0cF9hZGRfc3RyZWFtcyBwYXJhbXMsDQo+ICsJ
CQkJICAgICAgIHN0cnVjdCBzY3RwX2FkZF9zdHJlYW1zICpwYXJhbXMsDQo+ICAJCQkJICAgICAg
IHVuc2lnbmVkIGludCBvcHRsZW4pDQo+ICB7DQo+ICAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24g
KmFzb2M7DQo+ICAJaW50IHJldHZhbCA9IC1FSU5WQUw7DQo+IA0KPiAtCWlmIChvcHRsZW4gIT0g
c2l6ZW9mKHBhcmFtcykpDQo+ICsJaWYgKG9wdGxlbiAhPSBzaXplb2YoKnBhcmFtcykpDQo+ICAJ
CWdvdG8gb3V0Ow0KPiANCj4gLQlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgcGFyYW1zLnNhc19h
c3NvY19pZCk7DQo+ICsJYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIHBhcmFtcy0+c2FzX2Fzc29j
X2lkKTsNCj4gIAlpZiAoIWFzb2MpDQo+ICAJCWdvdG8gb3V0Ow0KPiANCj4gLQlyZXR2YWwgPSBz
Y3RwX3NlbmRfYWRkX3N0cmVhbXMoYXNvYywgJnBhcmFtcyk7DQo+ICsJcmV0dmFsID0gc2N0cF9z
ZW5kX2FkZF9zdHJlYW1zKGFzb2MsIHBhcmFtcyk7DQo+IA0KPiAgb3V0Og0KPiAgCXJldHVybiBy
ZXR2YWw7DQo+ICB9DQo+IA0KPiAgc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfc2NoZWR1bGVy
KHN0cnVjdCBzb2NrICpzaywNCj4gLQkJCQkgICAgIHN0cnVjdCBzY3RwX2Fzc29jX3ZhbHVlIHBh
cmFtcywNCj4gKwkJCQkgICAgIHN0cnVjdCBzY3RwX2Fzc29jX3ZhbHVlICpwYXJhbXMsDQo+ICAJ
CQkJICAgICB1bnNpZ25lZCBpbnQgb3B0bGVuKQ0KPiAgew0KPiAgCXN0cnVjdCBzY3RwX3NvY2sg
KnNwID0gc2N0cF9zayhzayk7DQo+ICAJc3RydWN0IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7DQo+
ICAJaW50IHJldHZhbCA9IDA7DQo+IA0KPiAtCWlmIChvcHRsZW4gPCBzaXplb2YocGFyYW1zKSkN
Cj4gKwlpZiAob3B0bGVuIDwgc2l6ZW9mKCpwYXJhbXMpKQ0KPiAgCQlyZXR1cm4gLUVJTlZBTDsN
Cj4gDQo+IC0JaWYgKHBhcmFtcy5hc3NvY192YWx1ZSA+IFNDVFBfU1NfTUFYKQ0KPiArCWlmIChw
YXJhbXMtPmFzc29jX3ZhbHVlID4gU0NUUF9TU19NQVgpDQo+ICAJCXJldHVybiAtRUlOVkFMOw0K
PiANCj4gLQlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgcGFyYW1zLmFzc29jX2lkKTsNCj4gLQlp
ZiAoIWFzb2MgJiYgcGFyYW1zLmFzc29jX2lkID4gU0NUUF9BTExfQVNTT0MgJiYNCj4gKwlhc29j
ID0gc2N0cF9pZDJhc3NvYyhzaywgcGFyYW1zLT5hc3NvY19pZCk7DQo+ICsJaWYgKCFhc29jICYm
IHBhcmFtcy0+YXNzb2NfaWQgPiBTQ1RQX0FMTF9BU1NPQyAmJg0KPiAgCSAgICBzY3RwX3N0eWxl
KHNrLCBVRFApKQ0KPiAgCQlyZXR1cm4gLUVJTlZBTDsNCj4gDQo+ICAJaWYgKGFzb2MpDQo+IC0J
CXJldHVybiBzY3RwX3NjaGVkX3NldF9zY2hlZChhc29jLCBwYXJhbXMuYXNzb2NfdmFsdWUpOw0K
PiArCQlyZXR1cm4gc2N0cF9zY2hlZF9zZXRfc2NoZWQoYXNvYywgcGFyYW1zLT5hc3NvY192YWx1
ZSk7DQo+IA0KPiAgCWlmIChzY3RwX3N0eWxlKHNrLCBUQ1ApKQ0KPiAtCQlwYXJhbXMuYXNzb2Nf
aWQgPSBTQ1RQX0ZVVFVSRV9BU1NPQzsNCj4gKwkJcGFyYW1zLT5hc3NvY19pZCA9IFNDVFBfRlVU
VVJFX0FTU09DOw0KPiANCj4gLQlpZiAocGFyYW1zLmFzc29jX2lkID09IFNDVFBfRlVUVVJFX0FT
U09DIHx8DQo+IC0JICAgIHBhcmFtcy5hc3NvY19pZCA9PSBTQ1RQX0FMTF9BU1NPQykNCj4gLQkJ
c3AtPmRlZmF1bHRfc3MgPSBwYXJhbXMuYXNzb2NfdmFsdWU7DQo+ICsJaWYgKHBhcmFtcy0+YXNz
b2NfaWQgPT0gU0NUUF9GVVRVUkVfQVNTT0MgfHwNCj4gKwkgICAgcGFyYW1zLT5hc3NvY19pZCA9
PSBTQ1RQX0FMTF9BU1NPQykNCj4gKwkJc3AtPmRlZmF1bHRfc3MgPSBwYXJhbXMtPmFzc29jX3Zh
bHVlOw0KPiANCj4gLQlpZiAocGFyYW1zLmFzc29jX2lkID09IFNDVFBfQ1VSUkVOVF9BU1NPQyB8
fA0KPiAtCSAgICBwYXJhbXMuYXNzb2NfaWQgPT0gU0NUUF9BTExfQVNTT0MpIHsNCj4gKwlpZiAo
cGFyYW1zLT5hc3NvY19pZCA9PSBTQ1RQX0NVUlJFTlRfQVNTT0MgfHwNCj4gKwkgICAgcGFyYW1z
LT5hc3NvY19pZCA9PSBTQ1RQX0FMTF9BU1NPQykgew0KPiAgCQlsaXN0X2Zvcl9lYWNoX2VudHJ5
KGFzb2MsICZzcC0+ZXAtPmFzb2NzLCBhc29jcykgew0KPiAgCQkJaW50IHJldCA9IHNjdHBfc2No
ZWRfc2V0X3NjaGVkKGFzb2MsDQo+IC0JCQkJCQkgICAgICAgcGFyYW1zLmFzc29jX3ZhbHVlKTsN
Cj4gKwkJCQkJCSAgICAgICBwYXJhbXMtPmFzc29jX3ZhbHVlKTsNCj4gDQo+ICAJCQlpZiAocmV0
ICYmICFyZXR2YWwpDQo+ICAJCQkJcmV0dmFsID0gcmV0Ow0KPiBAQCAtNDE5MSwzMSArNDE2OSwz
MSBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9zY2hlZHVsZXIoc3RydWN0IHNvY2sgKnNr
LA0KPiAgfQ0KPiANCj4gIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3NjaGVkdWxlcl92YWx1
ZShzdHJ1Y3Qgc29jayAqc2ssDQo+IC0JCQkJCSAgIHN0cnVjdCBzY3RwX3N0cmVhbV92YWx1ZSBw
YXJhbXMsDQo+ICsJCQkJCSAgIHN0cnVjdCBzY3RwX3N0cmVhbV92YWx1ZSAqcGFyYW1zLA0KPiAg
CQkJCQkgICB1bnNpZ25lZCBpbnQgb3B0bGVuKQ0KPiAgew0KPiAgCXN0cnVjdCBzY3RwX2Fzc29j
aWF0aW9uICphc29jOw0KPiAgCWludCByZXR2YWwgPSAtRUlOVkFMOw0KPiANCj4gLQlpZiAob3B0
bGVuIDwgc2l6ZW9mKHBhcmFtcykpDQo+ICsJaWYgKG9wdGxlbiA8IHNpemVvZigqcGFyYW1zKSkN
Cj4gIAkJZ290byBvdXQ7DQo+IA0KPiAtCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCBwYXJhbXMu
YXNzb2NfaWQpOw0KPiAtCWlmICghYXNvYyAmJiBwYXJhbXMuYXNzb2NfaWQgIT0gU0NUUF9DVVJS
RU5UX0FTU09DICYmDQo+ICsJYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIHBhcmFtcy0+YXNzb2Nf
aWQpOw0KPiArCWlmICghYXNvYyAmJiBwYXJhbXMtPmFzc29jX2lkICE9IFNDVFBfQ1VSUkVOVF9B
U1NPQyAmJg0KPiAgCSAgICBzY3RwX3N0eWxlKHNrLCBVRFApKQ0KPiAgCQlnb3RvIG91dDsNCj4g
DQo+ICAJaWYgKGFzb2MpIHsNCj4gLQkJcmV0dmFsID0gc2N0cF9zY2hlZF9zZXRfdmFsdWUoYXNv
YywgcGFyYW1zLnN0cmVhbV9pZCwNCj4gLQkJCQkJICAgICAgcGFyYW1zLnN0cmVhbV92YWx1ZSwg
R0ZQX0tFUk5FTCk7DQo+ICsJCXJldHZhbCA9IHNjdHBfc2NoZWRfc2V0X3ZhbHVlKGFzb2MsIHBh
cmFtcy0+c3RyZWFtX2lkLA0KPiArCQkJCQkgICAgICBwYXJhbXMtPnN0cmVhbV92YWx1ZSwgR0ZQ
X0tFUk5FTCk7DQo+ICAJCWdvdG8gb3V0Ow0KPiAgCX0NCj4gDQo+ICAJcmV0dmFsID0gMDsNCj4g
DQo+ICAJbGlzdF9mb3JfZWFjaF9lbnRyeShhc29jLCAmc2N0cF9zayhzayktPmVwLT5hc29jcywg
YXNvY3MpIHsNCj4gLQkJaW50IHJldCA9IHNjdHBfc2NoZWRfc2V0X3ZhbHVlKGFzb2MsIHBhcmFt
cy5zdHJlYW1faWQsDQo+IC0JCQkJCSAgICAgICBwYXJhbXMuc3RyZWFtX3ZhbHVlLCBHRlBfS0VS
TkVMKTsNCj4gKwkJaW50IHJldCA9IHNjdHBfc2NoZWRfc2V0X3ZhbHVlKGFzb2MsIHBhcmFtcy0+
c3RyZWFtX2lkLA0KPiArCQkJCQkgICAgICAgcGFyYW1zLT5zdHJlYW1fdmFsdWUsIEdGUF9LRVJO
RUwpOw0KPiAgCQlpZiAocmV0ICYmICFyZXR2YWwpIC8qIHRyeSB0byByZXR1cm4gdGhlIDFzdCBl
cnJvci4gKi8NCj4gIAkJCXJldHZhbCA9IHJldDsNCj4gIAl9DQo+IEBAIC00MjI1LDE4ICs0MjAz
LDE4IEBAIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3NjaGVkdWxlcl92YWx1ZShzdHJ1Y3Qg
c29jayAqc2ssDQo+ICB9DQo+IA0KPiAgc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfaW50ZXJs
ZWF2aW5nX3N1cHBvcnRlZChzdHJ1Y3Qgc29jayAqc2ssDQo+IC0JCQkJCQkgIHN0cnVjdCBzY3Rw
X2Fzc29jX3ZhbHVlIHBhcmFtcywNCj4gKwkJCQkJCSAgc3RydWN0IHNjdHBfYXNzb2NfdmFsdWUg
KnBhcmFtcywNCj4gIAkJCQkJCSAgdW5zaWduZWQgaW50IG9wdGxlbikNCj4gIHsNCj4gIAlzdHJ1
Y3Qgc2N0cF9zb2NrICpzcCA9IHNjdHBfc2soc2spOw0KPiAgCXN0cnVjdCBzY3RwX2Fzc29jaWF0
aW9uICphc29jOw0KPiAgCWludCByZXR2YWwgPSAtRUlOVkFMOw0KPiANCj4gLQlpZiAob3B0bGVu
IDwgc2l6ZW9mKHBhcmFtcykpDQo+ICsJaWYgKG9wdGxlbiA8IHNpemVvZigqcGFyYW1zKSkNCj4g
IAkJZ290byBvdXQ7DQo+IA0KPiAtCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCBwYXJhbXMuYXNz
b2NfaWQpOw0KPiAtCWlmICghYXNvYyAmJiBwYXJhbXMuYXNzb2NfaWQgIT0gU0NUUF9GVVRVUkVf
QVNTT0MgJiYNCj4gKwlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgcGFyYW1zLT5hc3NvY19pZCk7
DQo+ICsJaWYgKCFhc29jICYmIHBhcmFtcy0+YXNzb2NfaWQgIT0gU0NUUF9GVVRVUkVfQVNTT0Mg
JiYNCj4gIAkgICAgc2N0cF9zdHlsZShzaywgVURQKSkNCj4gIAkJZ290byBvdXQ7DQo+IA0KPiBA
QCAtNDI0NSw3ICs0MjIzLDcgQEAgc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfaW50ZXJsZWF2
aW5nX3N1cHBvcnRlZChzdHJ1Y3Qgc29jayAqc2ssDQo+ICAJCWdvdG8gb3V0Ow0KPiAgCX0NCj4g
DQo+IC0Jc3AtPmVwLT5pbnRsX2VuYWJsZSA9ICEhcGFyYW1zLmFzc29jX3ZhbHVlOw0KPiArCXNw
LT5lcC0+aW50bF9lbmFibGUgPSAhIXBhcmFtcy0+YXNzb2NfdmFsdWU7DQo+IA0KPiAgCXJldHZh
bCA9IDA7DQo+IA0KPiBAQCAtNDI5MSw0MSArNDI2OSw0MCBAQCBzdGF0aWMgaW50IHNjdHBfYXNz
b2NfdWxwZXZlbnRfdHlwZV9zZXQoc3RydWN0IHNjdHBfZXZlbnQgKnBhcmFtLA0KPiAgCXJldHVy
biAwOw0KPiAgfQ0KPiANCj4gLSNkZWZpbmUgcGFyYW0gKCpwYXJhbSkNCj4gLXN0YXRpYyBpbnQg
c2N0cF9zZXRzb2Nrb3B0X2V2ZW50KHN0cnVjdCBzb2NrICpzaywgc3RydWN0IHNjdHBfZXZlbnQg
cGFyYW0sDQo+ICtzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9ldmVudChzdHJ1Y3Qgc29jayAq
c2ssIHN0cnVjdCBzY3RwX2V2ZW50ICpwYXJhbSwNCj4gIAkJCQkgdW5zaWduZWQgaW50IG9wdGxl
bikNCj4gIHsNCj4gIAlzdHJ1Y3Qgc2N0cF9zb2NrICpzcCA9IHNjdHBfc2soc2spOw0KPiAgCXN0
cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOw0KPiAgCWludCByZXR2YWwgPSAwOw0KPiANCj4g
LQlpZiAob3B0bGVuIDwgc2l6ZW9mKHBhcmFtKSkNCj4gKwlpZiAob3B0bGVuIDwgc2l6ZW9mKCpw
YXJhbSkpDQo+ICAJCXJldHVybiAtRUlOVkFMOw0KPiANCj4gLQlpZiAocGFyYW0uc2VfdHlwZSA8
IFNDVFBfU05fVFlQRV9CQVNFIHx8DQo+IC0JICAgIHBhcmFtLnNlX3R5cGUgPiBTQ1RQX1NOX1RZ
UEVfTUFYKQ0KPiArCWlmIChwYXJhbS0+c2VfdHlwZSA8IFNDVFBfU05fVFlQRV9CQVNFIHx8DQo+
ICsJICAgIHBhcmFtLT5zZV90eXBlID4gU0NUUF9TTl9UWVBFX01BWCkNCj4gIAkJcmV0dXJuIC1F
SU5WQUw7DQo+IA0KPiAtCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCBwYXJhbS5zZV9hc3NvY19p
ZCk7DQo+IC0JaWYgKCFhc29jICYmIHBhcmFtLnNlX2Fzc29jX2lkID4gU0NUUF9BTExfQVNTT0Mg
JiYNCj4gKwlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgcGFyYW0tPnNlX2Fzc29jX2lkKTsNCj4g
KwlpZiAoIWFzb2MgJiYgcGFyYW0tPnNlX2Fzc29jX2lkID4gU0NUUF9BTExfQVNTT0MgJiYNCj4g
IAkgICAgc2N0cF9zdHlsZShzaywgVURQKSkNCj4gIAkJcmV0dXJuIC1FSU5WQUw7DQo+IA0KPiAg
CWlmIChhc29jKQ0KPiAtCQlyZXR1cm4gc2N0cF9hc3NvY191bHBldmVudF90eXBlX3NldCgmcGFy
YW0sIGFzb2MpOw0KPiArCQlyZXR1cm4gc2N0cF9hc3NvY191bHBldmVudF90eXBlX3NldChwYXJh
bSwgYXNvYyk7DQo+IA0KPiAgCWlmIChzY3RwX3N0eWxlKHNrLCBUQ1ApKQ0KPiAtCQlwYXJhbS5z
ZV9hc3NvY19pZCA9IFNDVFBfRlVUVVJFX0FTU09DOw0KPiArCQlwYXJhbS0+c2VfYXNzb2NfaWQg
PSBTQ1RQX0ZVVFVSRV9BU1NPQzsNCj4gDQo+IC0JaWYgKHBhcmFtLnNlX2Fzc29jX2lkID09IFND
VFBfRlVUVVJFX0FTU09DIHx8DQo+IC0JICAgIHBhcmFtLnNlX2Fzc29jX2lkID09IFNDVFBfQUxM
X0FTU09DKQ0KPiArCWlmIChwYXJhbS0+c2VfYXNzb2NfaWQgPT0gU0NUUF9GVVRVUkVfQVNTT0Mg
fHwNCj4gKwkgICAgcGFyYW0tPnNlX2Fzc29jX2lkID09IFNDVFBfQUxMX0FTU09DKQ0KPiAgCQlz
Y3RwX3VscGV2ZW50X3R5cGVfc2V0KCZzcC0+c3Vic2NyaWJlLA0KPiAtCQkJCSAgICAgICBwYXJh
bS5zZV90eXBlLCBwYXJhbS5zZV9vbik7DQo+ICsJCQkJICAgICAgIHBhcmFtLT5zZV90eXBlLCBw
YXJhbS0+c2Vfb24pOw0KPiANCj4gLQlpZiAocGFyYW0uc2VfYXNzb2NfaWQgPT0gU0NUUF9DVVJS
RU5UX0FTU09DIHx8DQo+IC0JICAgIHBhcmFtLnNlX2Fzc29jX2lkID09IFNDVFBfQUxMX0FTU09D
KSB7DQo+ICsJaWYgKHBhcmFtLT5zZV9hc3NvY19pZCA9PSBTQ1RQX0NVUlJFTlRfQVNTT0MgfHwN
Cj4gKwkgICAgcGFyYW0tPnNlX2Fzc29jX2lkID09IFNDVFBfQUxMX0FTU09DKSB7DQo+ICAJCWxp
c3RfZm9yX2VhY2hfZW50cnkoYXNvYywgJnNwLT5lcC0+YXNvY3MsIGFzb2NzKSB7DQo+IC0JCQlp
bnQgcmV0ID0gc2N0cF9hc3NvY191bHBldmVudF90eXBlX3NldCgmcGFyYW0sIGFzb2MpOw0KPiAr
CQkJaW50IHJldCA9IHNjdHBfYXNzb2NfdWxwZXZlbnRfdHlwZV9zZXQocGFyYW0sIGFzb2MpOw0K
PiANCj4gIAkJCWlmIChyZXQgJiYgIXJldHZhbCkNCj4gIAkJCQlyZXR2YWwgPSByZXQ7DQo+IEBA
IC00MzM0LDI2ICs0MzExLDI1IEBAIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2V2ZW50KHN0
cnVjdCBzb2NrICpzaywgc3RydWN0IHNjdHBfZXZlbnQgcGFyYW0sDQo+IA0KPiAgCXJldHVybiBy
ZXR2YWw7DQo+ICB9DQo+IC0jdW5kZWYgcGFyYW0NCj4gDQo+ICBzdGF0aWMgaW50IHNjdHBfc2V0
c29ja29wdF9hc2NvbmZfc3VwcG9ydGVkKHN0cnVjdCBzb2NrICpzaywNCj4gLQkJCQkJICAgIHN0
cnVjdCBzY3RwX2Fzc29jX3ZhbHVlIHBhcmFtcywNCj4gKwkJCQkJICAgIHN0cnVjdCBzY3RwX2Fz
c29jX3ZhbHVlICpwYXJhbXMsDQo+ICAJCQkJCSAgICB1bnNpZ25lZCBpbnQgb3B0bGVuKQ0KPiAg
ew0KPiAgCXN0cnVjdCBzY3RwX2Fzc29jaWF0aW9uICphc29jOw0KPiAgCXN0cnVjdCBzY3RwX2Vu
ZHBvaW50ICplcDsNCj4gIAlpbnQgcmV0dmFsID0gLUVJTlZBTDsNCj4gDQo+IC0JaWYgKG9wdGxl
biAhPSBzaXplb2YocGFyYW1zKSkNCj4gKwlpZiAob3B0bGVuICE9IHNpemVvZigqcGFyYW1zKSkN
Cj4gIAkJZ290byBvdXQ7DQo+IA0KPiAtCWFzb2MgPSBzY3RwX2lkMmFzc29jKHNrLCBwYXJhbXMu
YXNzb2NfaWQpOw0KPiAtCWlmICghYXNvYyAmJiBwYXJhbXMuYXNzb2NfaWQgIT0gU0NUUF9GVVRV
UkVfQVNTT0MgJiYNCj4gKwlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgcGFyYW1zLT5hc3NvY19p
ZCk7DQo+ICsJaWYgKCFhc29jICYmIHBhcmFtcy0+YXNzb2NfaWQgIT0gU0NUUF9GVVRVUkVfQVNT
T0MgJiYNCj4gIAkgICAgc2N0cF9zdHlsZShzaywgVURQKSkNCj4gIAkJZ290byBvdXQ7DQo+IA0K
PiAgCWVwID0gc2N0cF9zayhzayktPmVwOw0KPiAtCWVwLT5hc2NvbmZfZW5hYmxlID0gISFwYXJh
bXMuYXNzb2NfdmFsdWU7DQo+ICsJZXAtPmFzY29uZl9lbmFibGUgPSAhIXBhcmFtcy0+YXNzb2Nf
dmFsdWU7DQo+IA0KPiAgCWlmIChlcC0+YXNjb25mX2VuYWJsZSAmJiBlcC0+YXV0aF9lbmFibGUp
IHsNCj4gIAkJc2N0cF9hdXRoX2VwX2FkZF9jaHVua2lkKGVwLCBTQ1RQX0NJRF9BU0NPTkYpOw0K
PiBAQCAtNDM2NywyMyArNDM0MywyMyBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9hc2Nv
bmZfc3VwcG9ydGVkKHN0cnVjdCBzb2NrICpzaywNCj4gIH0NCj4gDQo+ICBzdGF0aWMgaW50IHNj
dHBfc2V0c29ja29wdF9hdXRoX3N1cHBvcnRlZChzdHJ1Y3Qgc29jayAqc2ssDQo+IC0JCQkJCSAg
c3RydWN0IHNjdHBfYXNzb2NfdmFsdWUgcGFyYW1zLA0KPiArCQkJCQkgIHN0cnVjdCBzY3RwX2Fz
c29jX3ZhbHVlICpwYXJhbXMsDQo+ICAJCQkJCSAgdW5zaWduZWQgaW50IG9wdGxlbikNCj4gIHsN
Cj4gIAlzdHJ1Y3Qgc2N0cF9hc3NvY2lhdGlvbiAqYXNvYzsNCj4gIAlzdHJ1Y3Qgc2N0cF9lbmRw
b2ludCAqZXA7DQo+ICAJaW50IHJldHZhbCA9IC1FSU5WQUw7DQo+IA0KPiAtCWlmIChvcHRsZW4g
IT0gc2l6ZW9mKHBhcmFtcykpDQo+ICsJaWYgKG9wdGxlbiAhPSBzaXplb2YoKnBhcmFtcykpDQo+
ICAJCWdvdG8gb3V0Ow0KPiANCj4gLQlhc29jID0gc2N0cF9pZDJhc3NvYyhzaywgcGFyYW1zLmFz
c29jX2lkKTsNCj4gLQlpZiAoIWFzb2MgJiYgcGFyYW1zLmFzc29jX2lkICE9IFNDVFBfRlVUVVJF
X0FTU09DICYmDQo+ICsJYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIHBhcmFtcy0+YXNzb2NfaWQp
Ow0KPiArCWlmICghYXNvYyAmJiBwYXJhbXMtPmFzc29jX2lkICE9IFNDVFBfRlVUVVJFX0FTU09D
ICYmDQo+ICAJICAgIHNjdHBfc3R5bGUoc2ssIFVEUCkpDQo+ICAJCWdvdG8gb3V0Ow0KPiANCj4g
IAllcCA9IHNjdHBfc2soc2spLT5lcDsNCj4gLQlpZiAocGFyYW1zLmFzc29jX3ZhbHVlKSB7DQo+
ICsJaWYgKHBhcmFtcy0+YXNzb2NfdmFsdWUpIHsNCj4gIAkJcmV0dmFsID0gc2N0cF9hdXRoX2lu
aXQoZXAsIEdGUF9LRVJORUwpOw0KPiAgCQlpZiAocmV0dmFsKQ0KPiAgCQkJZ290byBvdXQ7DQo+
IEBAIC00MzkzLDcgKzQzNjksNyBAQCBzdGF0aWMgaW50IHNjdHBfc2V0c29ja29wdF9hdXRoX3N1
cHBvcnRlZChzdHJ1Y3Qgc29jayAqc2ssDQo+ICAJCX0NCj4gIAl9DQo+IA0KPiAtCWVwLT5hdXRo
X2VuYWJsZSA9ICEhcGFyYW1zLmFzc29jX3ZhbHVlOw0KPiArCWVwLT5hdXRoX2VuYWJsZSA9ICEh
cGFyYW1zLT5hc3NvY192YWx1ZTsNCj4gIAlyZXR2YWwgPSAwOw0KPiANCj4gIG91dDoNCj4gQEAg
LTQ0MDEsMjEgKzQzNzcsMjEgQEAgc3RhdGljIGludCBzY3RwX3NldHNvY2tvcHRfYXV0aF9zdXBw
b3J0ZWQoc3RydWN0IHNvY2sgKnNrLA0KPiAgfQ0KPiANCj4gIHN0YXRpYyBpbnQgc2N0cF9zZXRz
b2Nrb3B0X2Vjbl9zdXBwb3J0ZWQoc3RydWN0IHNvY2sgKnNrLA0KPiAtCQkJCQkgc3RydWN0IHNj
dHBfYXNzb2NfdmFsdWUgcGFyYW1zLA0KPiArCQkJCQkgc3RydWN0IHNjdHBfYXNzb2NfdmFsdWUg
KnBhcmFtcywNCj4gIAkJCQkJIHVuc2lnbmVkIGludCBvcHRsZW4pDQo+ICB7DQo+ICAJc3RydWN0
IHNjdHBfYXNzb2NpYXRpb24gKmFzb2M7DQo+ICAJaW50IHJldHZhbCA9IC1FSU5WQUw7DQo+IA0K
PiAtCWlmIChvcHRsZW4gIT0gc2l6ZW9mKHBhcmFtcykpDQo+ICsJaWYgKG9wdGxlbiAhPSBzaXpl
b2YoKnBhcmFtcykpDQo+ICAJCWdvdG8gb3V0Ow0KPiANCj4gLQlhc29jID0gc2N0cF9pZDJhc3Nv
YyhzaywgcGFyYW1zLmFzc29jX2lkKTsNCj4gLQlpZiAoIWFzb2MgJiYgcGFyYW1zLmFzc29jX2lk
ICE9IFNDVFBfRlVUVVJFX0FTU09DICYmDQo+ICsJYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ssIHBh
cmFtcy0+YXNzb2NfaWQpOw0KPiArCWlmICghYXNvYyAmJiBwYXJhbXMtPmFzc29jX2lkICE9IFND
VFBfRlVUVVJFX0FTU09DICYmDQo+ICAJICAgIHNjdHBfc3R5bGUoc2ssIFVEUCkpDQo+ICAJCWdv
dG8gb3V0Ow0KPiANCj4gLQlzY3RwX3NrKHNrKS0+ZXAtPmVjbl9lbmFibGUgPSAhIXBhcmFtcy5h
c3NvY192YWx1ZTsNCj4gKwlzY3RwX3NrKHNrKS0+ZXAtPmVjbl9lbmFibGUgPSAhIXBhcmFtcy0+
YXNzb2NfdmFsdWU7DQo+ICAJcmV0dmFsID0gMDsNCj4gDQo+ICBvdXQ6DQo+IEBAIC00NDIzLDMz
ICs0Mzk5LDMyIEBAIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X2Vjbl9zdXBwb3J0ZWQoc3Ry
dWN0IHNvY2sgKnNrLA0KPiAgfQ0KPiANCj4gIHN0YXRpYyBpbnQgc2N0cF9zZXRzb2Nrb3B0X3Bm
X2V4cG9zZShzdHJ1Y3Qgc29jayAqc2ssDQo+IC0JCQkJICAgICBzdHJ1Y3Qgc2N0cF9hc3NvY192
YWx1ZSBwYXJhbXMsDQo+ICsJCQkJICAgICBzdHJ1Y3Qgc2N0cF9hc3NvY192YWx1ZSAqcGFyYW1z
LA0KPiAgCQkJCSAgICAgdW5zaWduZWQgaW50IG9wdGxlbikNCj4gIHsNCj4gIAlzdHJ1Y3Qgc2N0
cF9hc3NvY2lhdGlvbiAqYXNvYzsNCj4gIAlpbnQgcmV0dmFsID0gLUVJTlZBTDsNCj4gDQo+IC0J
aWYgKG9wdGxlbiAhPSBzaXplb2YocGFyYW1zKSkNCj4gKwlpZiAob3B0bGVuICE9IHNpemVvZigq
cGFyYW1zKSkNCj4gIAkJZ290byBvdXQ7DQo+IA0KPiAtCWlmIChwYXJhbXMuYXNzb2NfdmFsdWUg
PiBTQ1RQX1BGX0VYUE9TRV9NQVgpDQo+ICsJaWYgKHBhcmFtcy0+YXNzb2NfdmFsdWUgPiBTQ1RQ
X1BGX0VYUE9TRV9NQVgpDQo+ICAJCWdvdG8gb3V0Ow0KPiANCj4gLQlhc29jID0gc2N0cF9pZDJh
c3NvYyhzaywgcGFyYW1zLmFzc29jX2lkKTsNCj4gLQlpZiAoIWFzb2MgJiYgcGFyYW1zLmFzc29j
X2lkICE9IFNDVFBfRlVUVVJFX0FTU09DICYmDQo+ICsJYXNvYyA9IHNjdHBfaWQyYXNzb2Moc2ss
IHBhcmFtcy0+YXNzb2NfaWQpOw0KPiArCWlmICghYXNvYyAmJiBwYXJhbXMtPmFzc29jX2lkICE9
IFNDVFBfRlVUVVJFX0FTU09DICYmDQo+ICAJICAgIHNjdHBfc3R5bGUoc2ssIFVEUCkpDQo+ICAJ
CWdvdG8gb3V0Ow0KPiANCj4gIAlpZiAoYXNvYykNCj4gLQkJYXNvYy0+cGZfZXhwb3NlID0gcGFy
YW1zLmFzc29jX3ZhbHVlOw0KPiArCQlhc29jLT5wZl9leHBvc2UgPSBwYXJhbXMtPmFzc29jX3Zh
bHVlOw0KPiAgCWVsc2UNCj4gLQkJc2N0cF9zayhzayktPnBmX2V4cG9zZSA9IHBhcmFtcy5hc3Nv
Y192YWx1ZTsNCj4gKwkJc2N0cF9zayhzayktPnBmX2V4cG9zZSA9IHBhcmFtcy0+YXNzb2NfdmFs
dWU7DQo+ICAJcmV0dmFsID0gMDsNCj4gDQo+ICBvdXQ6DQo+ICAJcmV0dXJuIHJldHZhbDsNCj4g
IH0NCj4gLSN1bmRlZiBwYXJhbXMNCj4gDQo+ICBzdGF0aWMgaW50IGtlcm5lbF9zY3RwX3NldHNv
Y2tvcHQoc3RydWN0IHNvY2sgKnNrLCBpbnQgb3B0bmFtZSwgdm9pZCAqb3B0dmFsLA0KPiAgCQkJ
ICAgaW50IG9wdGxlbikNCj4gLS0NCj4gMS44LjEuMg0KPiANCj4gLQ0KPiBSZWdpc3RlcmVkIEFk
ZHJlc3MgTGFrZXNpZGUsIEJyYW1sZXkgUm9hZCwgTW91bnQgRmFybSwgTWlsdG9uIEtleW5lcywg
TUsxIDFQVCwgVUsNCj4gUmVnaXN0cmF0aW9uIE5vOiAxMzk3Mzg2IChXYWxlcykNCg0KLQ0KUmVn
aXN0ZXJlZCBBZGRyZXNzIExha2VzaWRlLCBCcmFtbGV5IFJvYWQsIE1vdW50IEZhcm0sIE1pbHRv
biBLZXluZXMsIE1LMSAxUFQsIFVLDQpSZWdpc3RyYXRpb24gTm86IDEzOTczODYgKFdhbGVzKQ0K

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v3 net-next 1/8] sctp: setsockopt, expand some #defines
  2020-05-26 16:44   ` David Laight
@ 2020-05-26 22:36     ` David Miller
  2020-05-29 16:12       ` Marcelo Ricardo Leitner
  0 siblings, 1 reply; 5+ messages in thread
From: David Miller @ 2020-05-26 22:36 UTC (permalink / raw)
  To: David.Laight
  Cc: vyasevich, nhorman, kuba, linux-sctp, netdev, hch, marcelo.leitner

From: David Laight <David.Laight@ACULAB.COM>
Date: Tue, 26 May 2020 16:44:07 +0000

> This should be 3/8.

David just respin this at some point and with this fixed and also the
header posting saying "0/8" properly instead of "0/1", this is really
messy.

Thanks.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v3 net-next 1/8] sctp: setsockopt, expand some #defines
  2020-05-26 22:36     ` David Miller
@ 2020-05-29 16:12       ` Marcelo Ricardo Leitner
  0 siblings, 0 replies; 5+ messages in thread
From: Marcelo Ricardo Leitner @ 2020-05-29 16:12 UTC (permalink / raw)
  To: David Miller
  Cc: David.Laight, vyasevich, nhorman, kuba, linux-sctp, netdev, hch

On Tue, May 26, 2020 at 03:36:31PM -0700, David Miller wrote:
> From: David Laight <David.Laight@ACULAB.COM>
> Date: Tue, 26 May 2020 16:44:07 +0000
> 
> > This should be 3/8.
> 
> David just respin this at some point and with this fixed and also the
> header posting saying "0/8" properly instead of "0/1", this is really
> messy.
> 
> Thanks.

I don't know why David's workflow is that cumbersome. I'll try to
respin this myself, on top of Christoph's latest changes.

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2020-05-29 16:12 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-05-26 16:39 [PATCH v3 net-next 1/8] sctp: setsockopt, rename some locals David Laight
2020-05-26 16:40 ` [PATCH v3 net-next 1/8] sctp: setsockopt, expand some #defines David Laight
2020-05-26 16:44   ` David Laight
2020-05-26 22:36     ` David Miller
2020-05-29 16:12       ` Marcelo Ricardo Leitner

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).