cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

bind_addr.c (14220B)


      1// SPDX-License-Identifier: GPL-2.0-or-later
      2/* SCTP kernel implementation
      3 * (C) Copyright IBM Corp. 2001, 2003
      4 * Copyright (c) Cisco 1999,2000
      5 * Copyright (c) Motorola 1999,2000,2001
      6 * Copyright (c) La Monte H.P. Yarroll 2001
      7 *
      8 * This file is part of the SCTP kernel implementation.
      9 *
     10 * A collection class to handle the storage of transport addresses.
     11 *
     12 * Please send any bug reports or fixes you make to the
     13 * email address(es):
     14 *    lksctp developers <linux-sctp@vger.kernel.org>
     15 *
     16 * Written or modified by:
     17 *    La Monte H.P. Yarroll <piggy@acm.org>
     18 *    Karl Knutson          <karl@athena.chicago.il.us>
     19 *    Jon Grimm             <jgrimm@us.ibm.com>
     20 *    Daisy Chang           <daisyc@us.ibm.com>
     21 */
     22
     23#include <linux/types.h>
     24#include <linux/slab.h>
     25#include <linux/in.h>
     26#include <net/sock.h>
     27#include <net/ipv6.h>
     28#include <net/if_inet6.h>
     29#include <net/sctp/sctp.h>
     30#include <net/sctp/sm.h>
     31
     32/* Forward declarations for internal helpers. */
     33static int sctp_copy_one_addr(struct net *net, struct sctp_bind_addr *dest,
     34			      union sctp_addr *addr, enum sctp_scope scope,
     35			      gfp_t gfp, int flags);
     36static void sctp_bind_addr_clean(struct sctp_bind_addr *);
     37
     38/* First Level Abstractions. */
     39
     40/* Copy 'src' to 'dest' taking 'scope' into account.  Omit addresses
     41 * in 'src' which have a broader scope than 'scope'.
     42 */
     43int sctp_bind_addr_copy(struct net *net, struct sctp_bind_addr *dest,
     44			const struct sctp_bind_addr *src,
     45			enum sctp_scope scope, gfp_t gfp,
     46			int flags)
     47{
     48	struct sctp_sockaddr_entry *addr;
     49	int error = 0;
     50
     51	/* All addresses share the same port.  */
     52	dest->port = src->port;
     53
     54	/* Extract the addresses which are relevant for this scope.  */
     55	list_for_each_entry(addr, &src->address_list, list) {
     56		error = sctp_copy_one_addr(net, dest, &addr->a, scope,
     57					   gfp, flags);
     58		if (error < 0)
     59			goto out;
     60	}
     61
     62	/* If there are no addresses matching the scope and
     63	 * this is global scope, try to get a link scope address, with
     64	 * the assumption that we must be sitting behind a NAT.
     65	 */
     66	if (list_empty(&dest->address_list) && (SCTP_SCOPE_GLOBAL == scope)) {
     67		list_for_each_entry(addr, &src->address_list, list) {
     68			error = sctp_copy_one_addr(net, dest, &addr->a,
     69						   SCTP_SCOPE_LINK, gfp,
     70						   flags);
     71			if (error < 0)
     72				goto out;
     73		}
     74	}
     75
     76out:
     77	if (error)
     78		sctp_bind_addr_clean(dest);
     79
     80	return error;
     81}
     82
     83/* Exactly duplicate the address lists.  This is necessary when doing
     84 * peer-offs and accepts.  We don't want to put all the current system
     85 * addresses into the endpoint.  That's useless.  But we do want duplicat
     86 * the list of bound addresses that the older endpoint used.
     87 */
     88int sctp_bind_addr_dup(struct sctp_bind_addr *dest,
     89			const struct sctp_bind_addr *src,
     90			gfp_t gfp)
     91{
     92	struct sctp_sockaddr_entry *addr;
     93	int error = 0;
     94
     95	/* All addresses share the same port.  */
     96	dest->port = src->port;
     97
     98	list_for_each_entry(addr, &src->address_list, list) {
     99		error = sctp_add_bind_addr(dest, &addr->a, sizeof(addr->a),
    100					   1, gfp);
    101		if (error < 0)
    102			break;
    103	}
    104
    105	return error;
    106}
    107
    108/* Initialize the SCTP_bind_addr structure for either an endpoint or
    109 * an association.
    110 */
    111void sctp_bind_addr_init(struct sctp_bind_addr *bp, __u16 port)
    112{
    113	INIT_LIST_HEAD(&bp->address_list);
    114	bp->port = port;
    115}
    116
    117/* Dispose of the address list. */
    118static void sctp_bind_addr_clean(struct sctp_bind_addr *bp)
    119{
    120	struct sctp_sockaddr_entry *addr, *temp;
    121
    122	/* Empty the bind address list. */
    123	list_for_each_entry_safe(addr, temp, &bp->address_list, list) {
    124		list_del_rcu(&addr->list);
    125		kfree_rcu(addr, rcu);
    126		SCTP_DBG_OBJCNT_DEC(addr);
    127	}
    128}
    129
    130/* Dispose of an SCTP_bind_addr structure  */
    131void sctp_bind_addr_free(struct sctp_bind_addr *bp)
    132{
    133	/* Empty the bind address list. */
    134	sctp_bind_addr_clean(bp);
    135}
    136
    137/* Add an address to the bind address list in the SCTP_bind_addr structure. */
    138int sctp_add_bind_addr(struct sctp_bind_addr *bp, union sctp_addr *new,
    139		       int new_size, __u8 addr_state, gfp_t gfp)
    140{
    141	struct sctp_sockaddr_entry *addr;
    142
    143	/* Add the address to the bind address list.  */
    144	addr = kzalloc(sizeof(*addr), gfp);
    145	if (!addr)
    146		return -ENOMEM;
    147
    148	memcpy(&addr->a, new, min_t(size_t, sizeof(*new), new_size));
    149
    150	/* Fix up the port if it has not yet been set.
    151	 * Both v4 and v6 have the port at the same offset.
    152	 */
    153	if (!addr->a.v4.sin_port)
    154		addr->a.v4.sin_port = htons(bp->port);
    155
    156	addr->state = addr_state;
    157	addr->valid = 1;
    158
    159	INIT_LIST_HEAD(&addr->list);
    160
    161	/* We always hold a socket lock when calling this function,
    162	 * and that acts as a writer synchronizing lock.
    163	 */
    164	list_add_tail_rcu(&addr->list, &bp->address_list);
    165	SCTP_DBG_OBJCNT_INC(addr);
    166
    167	return 0;
    168}
    169
    170/* Delete an address from the bind address list in the SCTP_bind_addr
    171 * structure.
    172 */
    173int sctp_del_bind_addr(struct sctp_bind_addr *bp, union sctp_addr *del_addr)
    174{
    175	struct sctp_sockaddr_entry *addr, *temp;
    176	int found = 0;
    177
    178	/* We hold the socket lock when calling this function,
    179	 * and that acts as a writer synchronizing lock.
    180	 */
    181	list_for_each_entry_safe(addr, temp, &bp->address_list, list) {
    182		if (sctp_cmp_addr_exact(&addr->a, del_addr)) {
    183			/* Found the exact match. */
    184			found = 1;
    185			addr->valid = 0;
    186			list_del_rcu(&addr->list);
    187			break;
    188		}
    189	}
    190
    191	if (found) {
    192		kfree_rcu(addr, rcu);
    193		SCTP_DBG_OBJCNT_DEC(addr);
    194		return 0;
    195	}
    196
    197	return -EINVAL;
    198}
    199
    200/* Create a network byte-order representation of all the addresses
    201 * formated as SCTP parameters.
    202 *
    203 * The second argument is the return value for the length.
    204 */
    205union sctp_params sctp_bind_addrs_to_raw(const struct sctp_bind_addr *bp,
    206					 int *addrs_len,
    207					 gfp_t gfp)
    208{
    209	union sctp_params addrparms;
    210	union sctp_params retval;
    211	int addrparms_len;
    212	union sctp_addr_param rawaddr;
    213	int len;
    214	struct sctp_sockaddr_entry *addr;
    215	struct list_head *pos;
    216	struct sctp_af *af;
    217
    218	addrparms_len = 0;
    219	len = 0;
    220
    221	/* Allocate enough memory at once. */
    222	list_for_each(pos, &bp->address_list) {
    223		len += sizeof(union sctp_addr_param);
    224	}
    225
    226	/* Don't even bother embedding an address if there
    227	 * is only one.
    228	 */
    229	if (len == sizeof(union sctp_addr_param)) {
    230		retval.v = NULL;
    231		goto end_raw;
    232	}
    233
    234	retval.v = kmalloc(len, gfp);
    235	if (!retval.v)
    236		goto end_raw;
    237
    238	addrparms = retval;
    239
    240	list_for_each_entry(addr, &bp->address_list, list) {
    241		af = sctp_get_af_specific(addr->a.v4.sin_family);
    242		len = af->to_addr_param(&addr->a, &rawaddr);
    243		memcpy(addrparms.v, &rawaddr, len);
    244		addrparms.v += len;
    245		addrparms_len += len;
    246	}
    247
    248end_raw:
    249	*addrs_len = addrparms_len;
    250	return retval;
    251}
    252
    253/*
    254 * Create an address list out of the raw address list format (IPv4 and IPv6
    255 * address parameters).
    256 */
    257int sctp_raw_to_bind_addrs(struct sctp_bind_addr *bp, __u8 *raw_addr_list,
    258			   int addrs_len, __u16 port, gfp_t gfp)
    259{
    260	union sctp_addr_param *rawaddr;
    261	struct sctp_paramhdr *param;
    262	union sctp_addr addr;
    263	int retval = 0;
    264	int len;
    265	struct sctp_af *af;
    266
    267	/* Convert the raw address to standard address format */
    268	while (addrs_len) {
    269		param = (struct sctp_paramhdr *)raw_addr_list;
    270		rawaddr = (union sctp_addr_param *)raw_addr_list;
    271
    272		af = sctp_get_af_specific(param_type2af(param->type));
    273		if (unlikely(!af) ||
    274		    !af->from_addr_param(&addr, rawaddr, htons(port), 0)) {
    275			retval = -EINVAL;
    276			goto out_err;
    277		}
    278
    279		if (sctp_bind_addr_state(bp, &addr) != -1)
    280			goto next;
    281		retval = sctp_add_bind_addr(bp, &addr, sizeof(addr),
    282					    SCTP_ADDR_SRC, gfp);
    283		if (retval)
    284			/* Can't finish building the list, clean up. */
    285			goto out_err;
    286
    287next:
    288		len = ntohs(param->length);
    289		addrs_len -= len;
    290		raw_addr_list += len;
    291	}
    292
    293	return retval;
    294
    295out_err:
    296	if (retval)
    297		sctp_bind_addr_clean(bp);
    298
    299	return retval;
    300}
    301
    302/********************************************************************
    303 * 2nd Level Abstractions
    304 ********************************************************************/
    305
    306/* Does this contain a specified address?  Allow wildcarding. */
    307int sctp_bind_addr_match(struct sctp_bind_addr *bp,
    308			 const union sctp_addr *addr,
    309			 struct sctp_sock *opt)
    310{
    311	struct sctp_sockaddr_entry *laddr;
    312	int match = 0;
    313
    314	rcu_read_lock();
    315	list_for_each_entry_rcu(laddr, &bp->address_list, list) {
    316		if (!laddr->valid)
    317			continue;
    318		if (opt->pf->cmp_addr(&laddr->a, addr, opt)) {
    319			match = 1;
    320			break;
    321		}
    322	}
    323	rcu_read_unlock();
    324
    325	return match;
    326}
    327
    328int sctp_bind_addrs_check(struct sctp_sock *sp,
    329			  struct sctp_sock *sp2, int cnt2)
    330{
    331	struct sctp_bind_addr *bp2 = &sp2->ep->base.bind_addr;
    332	struct sctp_bind_addr *bp = &sp->ep->base.bind_addr;
    333	struct sctp_sockaddr_entry *laddr, *laddr2;
    334	bool exist = false;
    335	int cnt = 0;
    336
    337	rcu_read_lock();
    338	list_for_each_entry_rcu(laddr, &bp->address_list, list) {
    339		list_for_each_entry_rcu(laddr2, &bp2->address_list, list) {
    340			if (sp->pf->af->cmp_addr(&laddr->a, &laddr2->a) &&
    341			    laddr->valid && laddr2->valid) {
    342				exist = true;
    343				goto next;
    344			}
    345		}
    346		cnt = 0;
    347		break;
    348next:
    349		cnt++;
    350	}
    351	rcu_read_unlock();
    352
    353	return (cnt == cnt2) ? 0 : (exist ? -EEXIST : 1);
    354}
    355
    356/* Does the address 'addr' conflict with any addresses in
    357 * the bp.
    358 */
    359int sctp_bind_addr_conflict(struct sctp_bind_addr *bp,
    360			    const union sctp_addr *addr,
    361			    struct sctp_sock *bp_sp,
    362			    struct sctp_sock *addr_sp)
    363{
    364	struct sctp_sockaddr_entry *laddr;
    365	int conflict = 0;
    366	struct sctp_sock *sp;
    367
    368	/* Pick the IPv6 socket as the basis of comparison
    369	 * since it's usually a superset of the IPv4.
    370	 * If there is no IPv6 socket, then default to bind_addr.
    371	 */
    372	if (sctp_opt2sk(bp_sp)->sk_family == AF_INET6)
    373		sp = bp_sp;
    374	else if (sctp_opt2sk(addr_sp)->sk_family == AF_INET6)
    375		sp = addr_sp;
    376	else
    377		sp = bp_sp;
    378
    379	rcu_read_lock();
    380	list_for_each_entry_rcu(laddr, &bp->address_list, list) {
    381		if (!laddr->valid)
    382			continue;
    383
    384		conflict = sp->pf->cmp_addr(&laddr->a, addr, sp);
    385		if (conflict)
    386			break;
    387	}
    388	rcu_read_unlock();
    389
    390	return conflict;
    391}
    392
    393/* Get the state of the entry in the bind_addr_list */
    394int sctp_bind_addr_state(const struct sctp_bind_addr *bp,
    395			 const union sctp_addr *addr)
    396{
    397	struct sctp_sockaddr_entry *laddr;
    398	struct sctp_af *af;
    399
    400	af = sctp_get_af_specific(addr->sa.sa_family);
    401	if (unlikely(!af))
    402		return -1;
    403
    404	list_for_each_entry_rcu(laddr, &bp->address_list, list) {
    405		if (!laddr->valid)
    406			continue;
    407		if (af->cmp_addr(&laddr->a, addr))
    408			return laddr->state;
    409	}
    410
    411	return -1;
    412}
    413
    414/* Find the first address in the bind address list that is not present in
    415 * the addrs packed array.
    416 */
    417union sctp_addr *sctp_find_unmatch_addr(struct sctp_bind_addr	*bp,
    418					const union sctp_addr	*addrs,
    419					int			addrcnt,
    420					struct sctp_sock	*opt)
    421{
    422	struct sctp_sockaddr_entry	*laddr;
    423	union sctp_addr			*addr;
    424	void 				*addr_buf;
    425	struct sctp_af			*af;
    426	int				i;
    427
    428	/* This is only called sctp_send_asconf_del_ip() and we hold
    429	 * the socket lock in that code patch, so that address list
    430	 * can't change.
    431	 */
    432	list_for_each_entry(laddr, &bp->address_list, list) {
    433		addr_buf = (union sctp_addr *)addrs;
    434		for (i = 0; i < addrcnt; i++) {
    435			addr = addr_buf;
    436			af = sctp_get_af_specific(addr->v4.sin_family);
    437			if (!af)
    438				break;
    439
    440			if (opt->pf->cmp_addr(&laddr->a, addr, opt))
    441				break;
    442
    443			addr_buf += af->sockaddr_len;
    444		}
    445		if (i == addrcnt)
    446			return &laddr->a;
    447	}
    448
    449	return NULL;
    450}
    451
    452/* Copy out addresses from the global local address list. */
    453static int sctp_copy_one_addr(struct net *net, struct sctp_bind_addr *dest,
    454			      union sctp_addr *addr, enum sctp_scope scope,
    455			      gfp_t gfp, int flags)
    456{
    457	int error = 0;
    458
    459	if (sctp_is_any(NULL, addr)) {
    460		error = sctp_copy_local_addr_list(net, dest, scope, gfp, flags);
    461	} else if (sctp_in_scope(net, addr, scope)) {
    462		/* Now that the address is in scope, check to see if
    463		 * the address type is supported by local sock as
    464		 * well as the remote peer.
    465		 */
    466		if ((((AF_INET == addr->sa.sa_family) &&
    467		      (flags & SCTP_ADDR4_ALLOWED) &&
    468		      (flags & SCTP_ADDR4_PEERSUPP))) ||
    469		    (((AF_INET6 == addr->sa.sa_family) &&
    470		      (flags & SCTP_ADDR6_ALLOWED) &&
    471		      (flags & SCTP_ADDR6_PEERSUPP))))
    472			error = sctp_add_bind_addr(dest, addr, sizeof(*addr),
    473						   SCTP_ADDR_SRC, gfp);
    474	}
    475
    476	return error;
    477}
    478
    479/* Is this a wildcard address?  */
    480int sctp_is_any(struct sock *sk, const union sctp_addr *addr)
    481{
    482	unsigned short fam = 0;
    483	struct sctp_af *af;
    484
    485	/* Try to get the right address family */
    486	if (addr->sa.sa_family != AF_UNSPEC)
    487		fam = addr->sa.sa_family;
    488	else if (sk)
    489		fam = sk->sk_family;
    490
    491	af = sctp_get_af_specific(fam);
    492	if (!af)
    493		return 0;
    494
    495	return af->is_any(addr);
    496}
    497
    498/* Is 'addr' valid for 'scope'?  */
    499int sctp_in_scope(struct net *net, const union sctp_addr *addr,
    500		  enum sctp_scope scope)
    501{
    502	enum sctp_scope addr_scope = sctp_scope(addr);
    503
    504	/* The unusable SCTP addresses will not be considered with
    505	 * any defined scopes.
    506	 */
    507	if (SCTP_SCOPE_UNUSABLE == addr_scope)
    508		return 0;
    509	/*
    510	 * For INIT and INIT-ACK address list, let L be the level of
    511	 * requested destination address, sender and receiver
    512	 * SHOULD include all of its addresses with level greater
    513	 * than or equal to L.
    514	 *
    515	 * Address scoping can be selectively controlled via sysctl
    516	 * option
    517	 */
    518	switch (net->sctp.scope_policy) {
    519	case SCTP_SCOPE_POLICY_DISABLE:
    520		return 1;
    521	case SCTP_SCOPE_POLICY_ENABLE:
    522		if (addr_scope <= scope)
    523			return 1;
    524		break;
    525	case SCTP_SCOPE_POLICY_PRIVATE:
    526		if (addr_scope <= scope || SCTP_SCOPE_PRIVATE == addr_scope)
    527			return 1;
    528		break;
    529	case SCTP_SCOPE_POLICY_LINK:
    530		if (addr_scope <= scope || SCTP_SCOPE_LINK == addr_scope)
    531			return 1;
    532		break;
    533	default:
    534		break;
    535	}
    536
    537	return 0;
    538}
    539
    540int sctp_is_ep_boundall(struct sock *sk)
    541{
    542	struct sctp_bind_addr *bp;
    543	struct sctp_sockaddr_entry *addr;
    544
    545	bp = &sctp_sk(sk)->ep->base.bind_addr;
    546	if (sctp_list_single_entry(&bp->address_list)) {
    547		addr = list_entry(bp->address_list.next,
    548				  struct sctp_sockaddr_entry, list);
    549		if (sctp_is_any(sk, &addr->a))
    550			return 1;
    551	}
    552	return 0;
    553}
    554
    555/********************************************************************
    556 * 3rd Level Abstractions
    557 ********************************************************************/
    558
    559/* What is the scope of 'addr'?  */
    560enum sctp_scope sctp_scope(const union sctp_addr *addr)
    561{
    562	struct sctp_af *af;
    563
    564	af = sctp_get_af_specific(addr->sa.sa_family);
    565	if (!af)
    566		return SCTP_SCOPE_UNUSABLE;
    567
    568	return af->scope((union sctp_addr *)addr);
    569}