Linux 4.14.42
Greg KH
maintainerI'm announcing the release of the 4.14.42 kernel.
All users of the 4.14 kernel series must upgrade.
The updated 4.14.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-4.14.y
and can be browsed at the normal kernel.org git web browser:
http://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Makefile | 2 drivers/net/bonding/bond_alb.c | 15 +- drivers/net/bonding/bond_main.c | 2 drivers/net/ethernet/broadcom/tg3.c | 9 - drivers/net/ethernet/mellanox/mlx4/en_ethtool.c | 16 ++ drivers/net/ethernet/mellanox/mlx4/en_netdev.c | 8 - drivers/net/ethernet/mellanox/mlx4/mlx4_en.h | 7 - drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 7 + drivers/net/ethernet/mellanox/mlx5/core/en_tx.c | 20 +-- drivers/net/ethernet/mellanox/mlx5/core/eswitch.c | 11 +- drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 23 ++-- drivers/net/ethernet/realtek/8139too.c | 2 drivers/net/ethernet/realtek/r8169.c | 3 drivers/net/ethernet/sun/niu.c | 5 drivers/net/ethernet/ti/cpsw.c | 2 drivers/net/hyperv/netvsc_drv.c | 3 drivers/net/usb/qmi_wwan.c | 12 ++ drivers/scsi/aacraid/commsup.c | 8 - fs/btrfs/extent-tree.c | 7 + fs/proc/base.c | 8 - include/linux/mm.h | 1 include/net/bonding.h | 1 include/net/tls.h | 1 mm/gup.c | 3 net/bridge/br_if.c | 4 net/compat.c | 6 - net/dccp/ccids/ccid2.c | 14 ++ net/dccp/timer.c | 2 net/ipv4/ping.c | 7 - net/ipv4/route.c | 118 +++++++++------------- net/ipv4/tcp.c | 3 net/ipv4/tcp_bbr.c | 4 net/ipv4/udp.c | 11 +- net/ipv6/route.c | 7 + net/ipv6/udp.c | 4 net/l2tp/l2tp_netlink.c | 2 net/llc/af_llc.c | 3 net/nsh/nsh.c | 2 net/openvswitch/flow_netlink.c | 9 - net/rds/recv.c | 1 net/sched/act_skbmod.c | 5 net/sched/cls_api.c | 2 net/sched/sch_fq.c | 37 ++++-- net/sctp/associola.c | 30 +++++ net/sctp/inqueue.c | 2 net/sctp/ipv6.c | 3 net/sctp/sm_statefuns.c | 88 ++++++++-------- net/sctp/ulpevent.c | 1 net/tls/tls_main.c | 8 + net/xfrm/xfrm_input.c | 2 net/xfrm/xfrm_state.c | 1 51 files changed, 348 insertions(+), 204 deletions(-)
Adi Nissim (1):
net/mlx5: E-Switch, Include VF RDMA stats in vport statistics
Andre Tomt (1):
net/tls: Fix connection stall on partial tls record
Andrey Ignatov (1):
ipv4: fix memory leaks in udp_sendmsg, ping_v4_sendmsg
Antony Antony (1):
xfrm: fix xfrm_do_migrate() with AEAD e.g(AES-GCM)
Bjørn Mork (1):
qmi_wwan: do not steal interfaces from class drivers
Christophe JAILLET (1):
net/mlx4_en: Fix an error handling path in 'mlx4_en_init_netdev()'
Dave Carroll (1):
scsi: aacraid: Correct hba_send to include iu_type
Dave Watson (1):
net/tls: Don't recursively call push_record during tls_write_space callbacks
Debabrata Banerjee (2):
bonding: do not allow rlb updates to invalid mac
bonding: send learning packets for vlans on slave
Eric Dumazet (6):
dccp: fix tasklet usage
llc: better deal with too small mtu
net_sched: fq: take care of throttled flows before reuse
rds: do not leak kernel memory to user land
ipv6: fix uninit-value in ip6_multipath_l3_keys()
nsh: fix infinite loop
Greg Kroah-Hartman (1):
Linux 4.14.42
Grygorii Strashko (1):
net: ethernet: ti: cpsw: fix packet leaking in dual_mac mode
Hangbin Liu (1):
bridge: check iface upper dev when setting master via ioctl
Heiner Kallweit (1):
r8169: fix powering up RTL8168h
Herbert Xu (1):
xfrm: Use __skb_queue_tail in xfrm_trans_queue
Ingo Molnar (1):
8139too: Use disable_irq_nosync() in rtl8139_poll_controller()
James Chapman (1):
l2tp: revert "l2tp: fix missing print session offset info"
Jianbo Liu (1):
net/mlx5e: Allow offloading ipv4 header re-write for icmp
Jiri Pirko (1):
net: sched: fix error path in tcf_proto_create() when modules are not configured
Julian Anastasov (1):
ipv4: fix fnhe usage by non-cached routes
Lance Richardson (1):
net: support compat 64-bit time in {s,g}etsockopt
Michael Chan (1):
tg3: Fix vunmap() BUG_ON() triggered from tg3_free_consistent().
Moshe Shemesh (1):
net/mlx4_en: Verify coalescing parameters are in range
Neal Cardwell (1):
tcp_bbr: fix to zero idle_restart only upon S/ACKed data
Paolo Abeni (1):
udp: fix SO_BINDTODEVICE
Rob Taglang (1):
net: ethernet: sun: niu set correct packet size in skb
Roi Dayan (1):
net/mlx5e: Err if asked to offload TC match on frag being first
Roman Mashak (1):
net sched actions: fix refcnt leak in skbmod
Stefano Brivio (1):
openvswitch: Don't swap table in nlattr_set() after OVS_ATTR_NESTED is found
Stephen Hemminger (1):
hv_netvsc: set master device
Talat Batheesh (1):
net/mlx5: Avoid cleaning flow steering table twice during error flow
Tariq Toukan (1):
net/mlx5e: TX, Use correct counter in dma_map error flow
Willy Tarreau (1):
proc: do not access cmdline nor environ from file-backed areas
Xin Long (5):
sctp: delay the authentication for the duplicated cookie-echo chunk
sctp: fix the issue that the cookie-ack with auth can't get processed
sctp: handle two v4 addrs comparison in sctp_inet6_cmp_addr
sctp: remove sctp_chunk_put from fail_mark err path in sctp_ulpevent_make_rcvmsg
sctp: use the old asoc when making the cookie-ack chunk in dupcook_d
Yuchung Cheng (1):
tcp: ignore Fast Open on repair mode
ethanwu (1):
btrfs: Take trans lock before access running trans in check_delayed_ref
Greg KH
maintainerMakefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 4 PATCHLEVEL = 14 -SUBLEVEL = 41 +SUBLEVEL = 42 EXTRAVERSION = NAME = Petit Gorille
drivers/net/bonding/bond_alb.c +9 -6
@@ -450,7 +450,7 @@ static void rlb_update_client(struct rlb_client_info *client_info) {int i; -if (!client_info->slave) +if (!client_info->slave || !is_valid_ether_addr (client_info->mac_dst))return ;for (i =0 ; i <RLB_ARP_BURST_SIZE ; i++) {
@@ -943,6 +943,10 @@ static void alb_send_lp_vid(struct slave *slave, u8 mac_addr[], skb->priority =TC_PRIO_CONTROL ; skb->dev = slave->dev; +netdev_dbg (slave->bond->dev, +"Send learning packet: dev %s mac %pM vlan %d\n" , + slave->dev->name, mac_addr, vid); +if (vid)__vlan_hwaccel_put_tag (skb, vlan_proto, vid);
@@ -965,14 +969,13 @@ static int alb_upper_dev_walk(struct net_device *upper, void *_data)u8 *mac_addr = data->mac_addr;struct bond_vlan_tag *tags; -if (is_vlan_dev (upper) &&vlan_get_encap_level (upper) ==0 ) { -if (strict_match && -ether_addr_equal_64bits (mac_addr, - upper->dev_addr)) { +if (is_vlan_dev (upper) && + bond->nest_level ==vlan_get_encap_level (upper) -1 ) { +if (upper->addr_assign_type ==NET_ADDR_STOLEN ) {alb_send_lp_vid (slave, mac_addr,vlan_dev_vlan_proto (upper),vlan_dev_vlan_id (upper)); - }else if (!strict_match) { + }else {alb_send_lp_vid (slave, upper->dev_addr,vlan_dev_vlan_proto (upper),vlan_dev_vlan_id (upper));
drivers/net/bonding/bond_main.c +2 -0
@@ -1734,6 +1734,8 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)if (bond_mode_uses_xmit_hash (bond))bond_update_slave_arr (bond,NULL ); + bond->nest_level =dev_get_nest_level (bond_dev); + netdev_info(bond_dev, "Enslaving %s as %s interface with %s link\n", slave_dev->name, bond_is_active_slave(new_slave) ? "an active" : "a backup",
drivers/net/ethernet/broadcom/tg3.c +5 -4
@@ -8723,14 +8723,15 @@ static void tg3_free_consistent(struct tg3 *tp)tg3_mem_rx_release (tp);tg3_mem_tx_release (tp); -/* Protect tg3_get_stats64() from reading freed tp->hw_stats. */ -tg3_full_lock (tp,0 ); +/* tp->hw_stats can be referenced safely: +* 1. under rtnl_lock +* 2. or under tp->lock if TG3_FLAG_INIT_COMPLETE is set. +*/ if (tp->hw_stats) {dma_free_coherent (&tp->pdev->dev,sizeof (struct tg3_hw_stats ), tp->hw_stats, tp->stats_mapping); tp->hw_stats =NULL ; } -tg3_full_unlock (tp); }/*
@@ -14167,7 +14168,7 @@ static void tg3_get_stats64(struct net_device *dev,struct tg3 *tp =netdev_priv (dev);spin_lock_bh (&tp->lock); -if (!tp->hw_stats) { +if (!tp->hw_stats || !tg3_flag (tp,INIT_COMPLETE )) { *stats = tp->net_stats_prev;spin_unlock_bh (&tp->lock);return ;
drivers/net/ethernet/mellanox/mlx4/en_ethtool.c +16 -0
@@ -1013,6 +1013,22 @@ static int mlx4_en_set_coalesce(struct net_device *dev,if (!coal->tx_max_coalesced_frames_irq)return -EINVAL ; +if (coal->tx_coalesce_usecs >MLX4_EN_MAX_COAL_TIME || + coal->rx_coalesce_usecs >MLX4_EN_MAX_COAL_TIME || + coal->rx_coalesce_usecs_low >MLX4_EN_MAX_COAL_TIME || + coal->rx_coalesce_usecs_high >MLX4_EN_MAX_COAL_TIME ) { +netdev_info (dev,"%s: maximum coalesce time supported is %d usecs\n" , + __func__,MLX4_EN_MAX_COAL_TIME ); +return -ERANGE ; + } + +if (coal->tx_max_coalesced_frames >MLX4_EN_MAX_COAL_PKTS || + coal->rx_max_coalesced_frames >MLX4_EN_MAX_COAL_PKTS ) { +netdev_info (dev,"%s: maximum coalesced frames supported is %d\n" , + __func__,MLX4_EN_MAX_COAL_PKTS ); +return -ERANGE ; + } + priv->rx_frames = (coal->rx_max_coalesced_frames ==MLX4_EN_AUTO_CONF ) ? MLX4_EN_RX_COAL_TARGET :
drivers/net/ethernet/mellanox/mlx4/en_netdev.c +1 -7
@@ -3318,12 +3318,11 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port, MAX_TX_RINGS, GFP_KERNEL);if (!priv->tx_ring[t]) { err = -ENOMEM ; - goto err_free_tx; + goto out; } priv->tx_cq[t] =kzalloc (sizeof (struct mlx4_en_cq *) *MAX_TX_RINGS ,GFP_KERNEL );if (!priv->tx_cq[t]) { -kfree (priv->tx_ring[t]); err = -ENOMEM ; goto out; }
@@ -3576,11 +3575,6 @@ int mlx4_en_init_netdev(struct mlx4_en_dev *mdev, int port,return 0 ; -err_free_tx: -while (t--) { -kfree (priv->tx_ring[t]); -kfree (priv->tx_cq[t]); - } out:mlx4_en_destroy_netdev (dev);return err;
drivers/net/ethernet/mellanox/mlx4/mlx4_en.h +5 -2
@@ -131,6 +131,9 @@#define MLX4_EN_TX_COAL_PKTS 16#define MLX4_EN_TX_COAL_TIME 0x10 +#define MLX4_EN_MAX_COAL_PKTS U16_MAX +#define MLX4_EN_MAX_COAL_TIME U16_MAX +#define MLX4_EN_RX_RATE_LOW 400000#define MLX4_EN_RX_COAL_TIME_LOW 0#define MLX4_EN_RX_RATE_HIGH 450000
@@ -547,8 +550,8 @@ struct mlx4_en_priv {u16 rx_usecs_low;u32 pkt_rate_high;u16 rx_usecs_high; -u16 sample_interval; -u16 adaptive_rx_coal; +u32 sample_interval; +u32 adaptive_rx_coal;u32 msg_enable;u32 loopback_ok;u32 validate_loopback;
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +6 -1
@@ -780,6 +780,10 @@ static int __parse_cls_flower(struct mlx5e_priv *priv, f->mask); addr_type = key->addr_type; +/* the HW doesn't support frag first/later */ +if (mask->flags &FLOW_DIS_FIRST_FRAG ) +return -EOPNOTSUPP ; +if (mask->flags &FLOW_DIS_IS_FRAGMENT ) {MLX5_SET (fte_match_set_lyr_2_4, headers_c, frag,1 ); MLX5_SET(fte_match_set_lyr_2_4, headers_v, frag,
@@ -1383,7 +1387,8 @@ static bool modify_header_match_supported(struct mlx5_flow_spec *spec, } ip_proto =MLX5_GET (fte_match_set_lyr_2_4, headers_v, ip_protocol); -if (modify_ip_header && ip_proto !=IPPROTO_TCP && ip_proto !=IPPROTO_UDP ) { +if (modify_ip_header && ip_proto !=IPPROTO_TCP && + ip_proto !=IPPROTO_UDP && ip_proto !=IPPROTO_ICMP ) {pr_info ("can't offload re-write of ip proto %d\n" , ip_proto);return false; }
drivers/net/ethernet/mellanox/mlx5/core/en_tx.c +10 -10
@@ -234,7 +234,7 @@ mlx5e_txwqe_build_dsegs(struct mlx5e_txqsq *sq, struct sk_buff *skb, dma_addr =dma_map_single (sq->pdev, skb_data, headlen,DMA_TO_DEVICE );if (unlikely (dma_mapping_error (sq->pdev, dma_addr))) -return -ENOMEM ; + goto dma_unmap_wqe_err; dseg->addr =cpu_to_be64 (dma_addr); dseg->lkey = sq->mkey_be;
@@ -252,7 +252,7 @@ mlx5e_txwqe_build_dsegs(struct mlx5e_txqsq *sq, struct sk_buff *skb, dma_addr =skb_frag_dma_map (sq->pdev, frag,0 , fsz,DMA_TO_DEVICE );if (unlikely (dma_mapping_error (sq->pdev, dma_addr))) -return -ENOMEM ; + goto dma_unmap_wqe_err; dseg->addr =cpu_to_be64 (dma_addr); dseg->lkey = sq->mkey_be;
@@ -264,6 +264,10 @@ mlx5e_txwqe_build_dsegs(struct mlx5e_txqsq *sq, struct sk_buff *skb, }return num_dma; + +dma_unmap_wqe_err: +mlx5e_dma_unmap_wqe_err (sq, num_dma); +return -ENOMEM ; } static inline void
@@ -355,17 +359,15 @@ static netdev_tx_t mlx5e_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb, num_dma =mlx5e_txwqe_build_dsegs (sq, skb, skb_data, headlen, (struct mlx5_wqe_data_seg *)cseg + ds_cnt);if (unlikely (num_dma <0 )) - goto dma_unmap_wqe_err; + goto err_drop;mlx5e_txwqe_complete (sq, skb, opcode, ds_cnt + num_dma, num_bytes, num_dma, wi, cseg);return NETDEV_TX_OK ; -dma_unmap_wqe_err: +err_drop: sq->stats.dropped++; -mlx5e_dma_unmap_wqe_err (sq, wi->num_dma); -dev_kfree_skb_any (skb);return NETDEV_TX_OK ;
@@ -594,17 +596,15 @@ netdev_tx_t mlx5i_sq_xmit(struct mlx5e_txqsq *sq, struct sk_buff *skb, num_dma =mlx5e_txwqe_build_dsegs (sq, skb, skb_data, headlen, (struct mlx5_wqe_data_seg *)cseg + ds_cnt);if (unlikely (num_dma <0 )) - goto dma_unmap_wqe_err; + goto err_drop;mlx5e_txwqe_complete (sq, skb, opcode, ds_cnt + num_dma, num_bytes, num_dma, wi, cseg);return NETDEV_TX_OK ; -dma_unmap_wqe_err: +err_drop: sq->stats.dropped++; -mlx5e_dma_unmap_wqe_err (sq, wi->num_dma); -dev_kfree_skb_any (skb);return NETDEV_TX_OK ;
drivers/net/ethernet/mellanox/mlx5/core/eswitch.c +10 -1
@@ -2054,26 +2054,35 @@ int mlx5_eswitch_get_vport_stats(struct mlx5_eswitch *esw,memset (vf_stats,0 ,sizeof (*vf_stats)); vf_stats->rx_packets =MLX5_GET_CTR (out, received_eth_unicast.packets) + +MLX5_GET_CTR (out, received_ib_unicast.packets) +MLX5_GET_CTR (out, received_eth_multicast.packets) + +MLX5_GET_CTR (out, received_ib_multicast.packets) +MLX5_GET_CTR (out, received_eth_broadcast.packets); vf_stats->rx_bytes =MLX5_GET_CTR (out, received_eth_unicast.octets) + +MLX5_GET_CTR (out, received_ib_unicast.octets) +MLX5_GET_CTR (out, received_eth_multicast.octets) + +MLX5_GET_CTR (out, received_ib_multicast.octets) +MLX5_GET_CTR (out, received_eth_broadcast.octets); vf_stats->tx_packets =MLX5_GET_CTR (out, transmitted_eth_unicast.packets) + +MLX5_GET_CTR (out, transmitted_ib_unicast.packets) +MLX5_GET_CTR (out, transmitted_eth_multicast.packets) + +MLX5_GET_CTR (out, transmitted_ib_multicast.packets) +MLX5_GET_CTR (out, transmitted_eth_broadcast.packets); vf_stats->tx_bytes =MLX5_GET_CTR (out, transmitted_eth_unicast.octets) + +MLX5_GET_CTR (out, transmitted_ib_unicast.octets) +MLX5_GET_CTR (out, transmitted_eth_multicast.octets) + +MLX5_GET_CTR (out, transmitted_ib_multicast.octets) +MLX5_GET_CTR (out, transmitted_eth_broadcast.octets); vf_stats->multicast = -MLX5_GET_CTR (out, received_eth_multicast.packets); +MLX5_GET_CTR (out, received_eth_multicast.packets) + +MLX5_GET_CTR (out, received_ib_multicast.packets); vf_stats->broadcast =MLX5_GET_CTR (out, received_eth_broadcast.packets);
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c +14 -9
@@ -174,6 +174,7 @@ static void del_flow_group(struct fs_node *node);static void del_fte (struct fs_node *node);static bool mlx5_flow_dests_cmp (struct mlx5_flow_destination *d1,struct mlx5_flow_destination *d2); +static void cleanup_root_ns (struct mlx5_flow_root_namespace *root_ns);static struct mlx5_flow_rule *find_flow_rule (struct fs_fte *fte,struct mlx5_flow_destination *dest);
@@ -2041,23 +2042,27 @@ static int create_anchor_flow_table(struct mlx5_flow_steering *steering)static int init_root_ns (struct mlx5_flow_steering *steering) { +int err; + steering->root_ns =create_root_ns (steering,FS_FT_NIC_RX );if (!steering->root_ns) - goto cleanup; +return -ENOMEM ; -if (init_root_tree (steering, &root_fs, &steering->root_ns->ns.node)) - goto cleanup; + err =init_root_tree (steering, &root_fs, &steering->root_ns->ns.node); +if (err) + goto out_err;set_prio_attrs (steering->root_ns); - -if (create_anchor_flow_table (steering)) - goto cleanup; + err =create_anchor_flow_table (steering); +if (err) + goto out_err;return 0 ; -cleanup: -mlx5_cleanup_fs (steering->dev); -return -ENOMEM ; +out_err: +cleanup_root_ns (steering->root_ns); + steering->root_ns =NULL ; +return err; }static void clean_tree (struct fs_node *node)
drivers/net/ethernet/realtek/8139too.c +1 -1
@@ -2224,7 +2224,7 @@ static void rtl8139_poll_controller(struct net_device *dev)struct rtl8139_private *tp =netdev_priv (dev);const int irq = tp->pci_dev->irq; -disable_irq (irq); +disable_irq_nosync (irq);rtl8139_interrupt (irq, dev);enable_irq (irq); }
drivers/net/ethernet/realtek/r8169.c +3 -0
@@ -4886,6 +4886,9 @@ static void rtl_pll_power_down(struct rtl8169_private *tp)static void rtl_pll_power_up (struct rtl8169_private *tp) {rtl_generic_op (tp, tp->pll_power_ops.up); + +/* give MAC/PHY some time to resume */ +msleep (20 ); }static void rtl_init_pll_power_ops (struct rtl8169_private *tp)
drivers/net/ethernet/sun/niu.c +2 -3
@@ -3442,7 +3442,7 @@ static int niu_process_rx_pkt(struct napi_struct *napi, struct niu *np, len = (val &RCR_ENTRY_L2_LEN ) >>RCR_ENTRY_L2_LEN_SHIFT ; - len -=ETH_FCS_LEN ; + append_size = len +ETH_HLEN +ETH_FCS_LEN ; addr = (val &RCR_ENTRY_PKT_BUF_ADDR ) <<RCR_ENTRY_PKT_BUF_ADDR_SHIFT ;
@@ -3452,7 +3452,6 @@ static int niu_process_rx_pkt(struct napi_struct *napi, struct niu *np, RCR_ENTRY_PKTBUFSZ_SHIFT]; off = addr & ~PAGE_MASK ; - append_size = rcr_size;if (num_rcr ==1 ) {int ptype;
@@ -3465,7 +3464,7 @@ static int niu_process_rx_pkt(struct napi_struct *napi, struct niu *np,else skb_checksum_none_assert (skb); }else if (!(val &RCR_ENTRY_MULTI )) - append_size = len - skb->len; + append_size = append_size - skb->len;niu_rx_skb_append (skb, page, off, append_size, rcr_size);if ((page->index + rp->rbr_block_size) - rcr_size == addr) {
drivers/net/ethernet/ti/cpsw.c +2 -0
@@ -1260,6 +1260,8 @@ static inline void cpsw_add_dual_emac_def_ale_entries(cpsw_ale_add_ucast (cpsw->ale, priv->mac_addr,HOST_PORT_NUM ,ALE_VLAN |ALE_SECURE , slave->port_vlan); +cpsw_ale_control_set (cpsw->ale, slave_port, +ALE_PORT_DROP_UNKNOWN_VLAN ,1 ); }static void soft_reset_slave (struct cpsw_slave *slave)
drivers/net/hyperv/netvsc_drv.c +2 -1
@@ -1742,7 +1742,8 @@ static int netvsc_vf_join(struct net_device *vf_netdev, goto rx_handler_failed; } - ret =netdev_upper_dev_link (vf_netdev, ndev); + ret =netdev_master_upper_dev_link (vf_netdev, ndev, +NULL ,NULL );if (ret !=0 ) { netdev_err(vf_netdev, "can not set master device %s (err = %d)\n",
drivers/net/usb/qmi_wwan.c +12 -0
@@ -1338,6 +1338,18 @@ static int qmi_wwan_probe(struct usb_interface *intf, id->driver_info = (unsigned long )&qmi_wwan_info; } +/* There are devices where the same interface number can be +* configured as different functions. We should only bind to +* vendor specific functions when matching on interface number +*/ +if (id->match_flags &USB_DEVICE_ID_MATCH_INT_NUMBER && + desc->bInterfaceClass !=USB_CLASS_VENDOR_SPEC ) { +dev_dbg (&intf->dev, +"Rejecting interface number match for class %02x\n" , + desc->bInterfaceClass); +return -ENODEV ; + } +/* Quectel EC20 quirk where we've QMI on interface 4 instead of 0 */ if (quectel_ec20_detected (intf) && desc->bInterfaceNumber ==0 ) {dev_dbg (&intf->dev,"Quectel EC20 quirk, skipping interface 0\n" );
drivers/scsi/aacraid/commsup.c +4 -4
@@ -752,6 +752,8 @@ int aac_hba_send(u8 command, struct fib *fibptr, fib_callback callback,int wait;unsigned long flags =0 ;unsigned long mflags =0 ; +struct aac_hba_cmd_req *hbacmd = (struct aac_hba_cmd_req *) + fibptr->hw_fib_va; fibptr->flags = (FIB_CONTEXT_FLAG |FIB_CONTEXT_FLAG_NATIVE_HBA );if (callback) {
@@ -762,11 +764,9 @@ int aac_hba_send(u8 command, struct fib *fibptr, fib_callback callback, wait =1 ; -if (command ==HBA_IU_TYPE_SCSI_CMD_REQ ) { -struct aac_hba_cmd_req *hbacmd = - (struct aac_hba_cmd_req *)fibptr->hw_fib_va; + hbacmd->iu_type = command; - hbacmd->iu_type = command; +if (command ==HBA_IU_TYPE_SCSI_CMD_REQ ) {/* bit1 of request_id must be 0 */ hbacmd->request_id =cpu_to_le32 ((((u32)(fibptr - dev->fibs)) <<2 ) +1 );
fs/btrfs/extent-tree.c +7 -0
@@ -3171,7 +3171,11 @@ static noinline int check_delayed_ref(struct btrfs_root *root,struct btrfs_transaction *cur_trans;int ret =0 ; +spin_lock (&root->fs_info->trans_lock); cur_trans = root->fs_info->running_transaction; +if (cur_trans) +refcount_inc (&cur_trans->use_count); +spin_unlock (&root->fs_info->trans_lock);if (!cur_trans)return 0 ;
@@ -3180,6 +3184,7 @@ static noinline int check_delayed_ref(struct btrfs_root *root, head =btrfs_find_delayed_ref_head (delayed_refs, bytenr);if (!head) {spin_unlock (&delayed_refs->lock); +btrfs_put_transaction (cur_trans);return 0 ; }
@@ -3196,6 +3201,7 @@ static noinline int check_delayed_ref(struct btrfs_root *root,mutex_lock (&head->mutex);mutex_unlock (&head->mutex);btrfs_put_delayed_ref (&head->node); +btrfs_put_transaction (cur_trans);return -EAGAIN ; }spin_unlock (&delayed_refs->lock);
@@ -3223,6 +3229,7 @@ static noinline int check_delayed_ref(struct btrfs_root *root, }spin_unlock (&head->lock);mutex_unlock (&head->mutex); +btrfs_put_transaction (cur_trans);return ret; }
fs/proc/base.c +4 -4
@@ -263,7 +263,7 @@ static ssize_t proc_pid_cmdline_read(struct file *file, char __user *buf,* Inherently racy -- command line shares address space * with code and data. */ - rv =access_remote_vm (mm, arg_end -1 , &c,1 ,0 ); + rv =access_remote_vm (mm, arg_end -1 , &c,1 ,FOLL_ANON );if (rv <=0 ) goto out_free_page;
@@ -281,7 +281,7 @@ static ssize_t proc_pid_cmdline_read(struct file *file, char __user *buf,int nr_read; _count =min3 (count, len,PAGE_SIZE ); - nr_read =access_remote_vm (mm, p, page, _count,0 ); + nr_read =access_remote_vm (mm, p, page, _count,FOLL_ANON );if (nr_read <0 ) rv = nr_read;if (nr_read <=0 )
@@ -327,7 +327,7 @@ static ssize_t proc_pid_cmdline_read(struct file *file, char __user *buf,bool final; _count =min3 (count, len,PAGE_SIZE ); - nr_read =access_remote_vm (mm, p, page, _count,0 ); + nr_read =access_remote_vm (mm, p, page, _count,FOLL_ANON );if (nr_read <0 ) rv = nr_read;if (nr_read <=0 )
@@ -946,7 +946,7 @@ static ssize_t environ_read(struct file *file, char __user *buf, max_len =min_t (size_t,PAGE_SIZE , count); this_len =min (max_len, this_len); - retval =access_remote_vm (mm, (env_start + src), page, this_len,0 ); + retval =access_remote_vm (mm, (env_start + src), page, this_len,FOLL_ANON );if (retval <=0 ) { ret = retval;
include/linux/mm.h +1 -0
@@ -2383,6 +2383,7 @@ static inline struct page *follow_page(struct vm_area_struct *vma,#define FOLL_MLOCK 0x1000/* lock present pages */ #define FOLL_REMOTE 0x2000/* we are working on non-current tsk/mm */ #define FOLL_COW 0x4000/* internal GUP flag */ +#define FOLL_ANON 0x8000/* don't do file mappings */ static inline int vm_fault_to_errno (int vm_fault,int foll_flags) {
include/net/bonding.h +1 -0
@@ -198,6 +198,7 @@ struct bonding {struct slave __rcu *primary_slave;struct bond_up_slave __rcu *slave_arr;/* Array of usable slaves */ bool force_primary; +u32 nest_level;s32 slave_cnt;/* never change this value outside the attach/detach wrappers */ int (*recv_probe)(const struct sk_buff *,struct bonding *,struct slave *);
include/net/tls.h +1 -0
@@ -98,6 +98,7 @@ struct tls_context {struct scatterlist *partially_sent_record;u16 partially_sent_offset;unsigned long flags; +bool in_tcp_sendpages;u16 pending_open_record_frags;int (*push_pending_record)(struct sock *sk,int flags);
mm/gup.c +3 -0
@@ -544,6 +544,9 @@ static int check_vma_flags(struct vm_area_struct *vma, unsigned long gup_flags)if (vm_flags & (VM_IO |VM_PFNMAP ))return -EFAULT ; +if (gup_flags &FOLL_ANON && !vma_is_anonymous (vma)) +return -EFAULT ; +if (write) {if (!(vm_flags &VM_WRITE )) {if (!(gup_flags &FOLL_FORCE ))
net/bridge/br_if.c +2 -2
@@ -503,8 +503,8 @@ int br_add_if(struct net_bridge *br, struct net_device *dev)if (dev->netdev_ops->ndo_start_xmit == br_dev_xmit)return -ELOOP ; -/* Device is already being bridged */ -if (br_port_exists (dev)) +/* Device has master upper dev */ +if (netdev_master_upper_dev_get (dev))return -EBUSY ;/* No bridging devices that dislike that (e.g. wireless) */
net/compat.c +4 -2
@@ -377,7 +377,8 @@ static int compat_sock_setsockopt(struct socket *sock, int level, int optname, optname == SO_ATTACH_REUSEPORT_CBPF)return do_set_attach_filter (sock, level, optname, optval, optlen); -if (optname ==SO_RCVTIMEO || optname ==SO_SNDTIMEO ) +if (!COMPAT_USE_64BIT_TIME && + (optname ==SO_RCVTIMEO || optname ==SO_SNDTIMEO ))return do_set_sock_timeout (sock, level, optname, optval, optlen);return sock_setsockopt (sock, level, optname, optval, optlen);
@@ -442,7 +443,8 @@ static int do_get_sock_timeout(struct socket *sock, int level, int optname,static int compat_sock_getsockopt (struct socket *sock,int level,int optname,char __user *optval,int __user *optlen) { -if (optname ==SO_RCVTIMEO || optname ==SO_SNDTIMEO ) +if (!COMPAT_USE_64BIT_TIME && + (optname ==SO_RCVTIMEO || optname ==SO_SNDTIMEO ))return do_get_sock_timeout (sock, level, optname, optval, optlen);return sock_getsockopt (sock, level, optname, optval, optlen); }
net/dccp/ccids/ccid2.c +12 -2
@@ -126,6 +126,16 @@ static void ccid2_change_l_seq_window(struct sock *sk, u64 val) DCCPF_SEQ_WMAX)); } +static void dccp_tasklet_schedule (struct sock *sk) +{ +struct tasklet_struct *t = &dccp_sk (sk)->dccps_xmitlet; + +if (!test_and_set_bit (TASKLET_STATE_SCHED , &t->state)) { +sock_hold (sk); +__tasklet_schedule (t); + } +} +static void ccid2_hc_tx_rto_expire (unsigned long data) {struct sock *sk = (struct sock *)data;
@@ -166,7 +176,7 @@ static void ccid2_hc_tx_rto_expire(unsigned long data)/* if we were blocked before, we may now send cwnd=1 packet */ if (sender_was_blocked) -tasklet_schedule (&dccp_sk (sk)->dccps_xmitlet); +dccp_tasklet_schedule (sk);/* restart backed-off timer */ sk_reset_timer (sk, &hc->tx_rtotimer, jiffies + hc->tx_rto); out:
@@ -706,7 +716,7 @@ static void ccid2_hc_tx_packet_recv(struct sock *sk, struct sk_buff *skb) done:/* check if incoming Acks allow pending packets to be sent */ if (sender_was_blocked && !ccid2_cwnd_network_limited (hc)) -tasklet_schedule (&dccp_sk (sk)->dccps_xmitlet); +dccp_tasklet_schedule (sk);dccp_ackvec_parsed_cleanup (&hc->tx_av_chunks); }
net/dccp/timer.c +1 -1
@@ -230,12 +230,12 @@ static void dccp_write_xmitlet(unsigned long data)else dccp_write_xmit (sk);bh_unlock_sock (sk); +sock_put (sk); }static void dccp_write_xmit_timer (unsigned long data) {dccp_write_xmitlet (data); -sock_put ((struct sock *)data); }void dccp_init_xmit_timers (struct sock *sk)
net/ipv4/ping.c +5 -2
@@ -775,8 +775,10 @@ static int ping_v4_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) ipc.addr = faddr = daddr;if (ipc.opt && ipc.opt->opt.srr) { -if (!daddr) -return -EINVAL ; +if (!daddr) { + err = -EINVAL ; + goto out_free; + } faddr = ipc.opt->opt.faddr; } tos =get_rttos (&ipc, inet);
@@ -842,6 +844,7 @@ static int ping_v4_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) out:ip_rt_put (rt); +out_free:if (free)kfree (ipc.opt);if (!err) {
net/ipv4/route.c +53 -65
169 lines not on this page · raw message
net/ipv4/tcp.c +2 -1
@@ -1194,7 +1194,8 @@ int tcp_sendmsg_locked(struct sock *sk, struct msghdr *msg, size_t size) uarg->zerocopy =0 ; } -if (unlikely (flags &MSG_FASTOPEN ||inet_sk (sk)->defer_connect)) { +if (unlikely (flags &MSG_FASTOPEN ||inet_sk (sk)->defer_connect) && + !tp->repair) { err =tcp_sendmsg_fastopen (sk, msg, &copied_syn, size);if (err == -EINPROGRESS && copied_syn >0 ) goto out;
net/ipv4/tcp_bbr.c +3 -1
@@ -802,7 +802,9 @@ static void bbr_update_min_rtt(struct sock *sk, const struct rate_sample *rs) } } } - bbr->idle_restart =0 ; +/* Restart after idle ends only once we process a new S/ACK for data */ +if (rs->delivered >0 ) + bbr->idle_restart =0 ; }static void bbr_update_model (struct sock *sk,const struct rate_sample *rs)
net/ipv4/udp.c +7 -4
@@ -413,9 +413,9 @@ static int compute_score(struct sock *sk, struct net *net,bool dev_match = (sk->sk_bound_dev_if == dif || sk->sk_bound_dev_if == sdif); -if (exact_dif && !dev_match) +if (!dev_match)return -1 ; -if (sk->sk_bound_dev_if && dev_match) +if (sk->sk_bound_dev_if) score +=4 ; }
@@ -978,8 +978,10 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)sock_tx_timestamp (sk, ipc.sockc.tsflags, &ipc.tx_flags);if (ipc.opt && ipc.opt->opt.srr) { -if (!daddr) -return -EINVAL ; +if (!daddr) { + err = -EINVAL ; + goto out_free; + } faddr = ipc.opt->opt.faddr; connected =0 ; }
@@ -1087,6 +1089,7 @@ int udp_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) out:ip_rt_put (rt); +out_free:if (free)kfree (ipc.opt);if (!err)
net/ipv6/route.c +6 -1
@@ -1222,11 +1222,16 @@ static void ip6_multipath_l3_keys(const struct sk_buff *skb,const struct ipv6hdr *inner_iph;const struct icmp6hdr *icmph;struct ipv6hdr _inner_iph; +struct icmp6hdr _icmph;if (likely (outer_iph->nexthdr !=IPPROTO_ICMPV6 )) goto out; - icmph =icmp6_hdr (skb); + icmph =skb_header_pointer (skb,skb_transport_offset (skb), +sizeof (_icmph), &_icmph); +if (!icmph) + goto out; + if (icmph->icmp6_type != ICMPV6_DEST_UNREACH && icmph->icmp6_type != ICMPV6_PKT_TOOBIG && icmph->icmp6_type != ICMPV6_TIME_EXCEED &&
net/ipv6/udp.c +2 -2
@@ -164,9 +164,9 @@ static int compute_score(struct sock *sk, struct net *net,bool dev_match = (sk->sk_bound_dev_if == dif || sk->sk_bound_dev_if == sdif); -if (exact_dif && !dev_match) +if (!dev_match)return -1 ; -if (sk->sk_bound_dev_if && dev_match) +if (sk->sk_bound_dev_if) score++; }
net/l2tp/l2tp_netlink.c +0 -2
@@ -765,8 +765,6 @@ static int l2tp_nl_session_send(struct sk_buff *skb, u32 portid, u32 seq, int fl if ((session->ifname[0] && nla_put_string(skb, L2TP_ATTR_IFNAME, session->ifname)) || - (session->offset && - nla_put_u16(skb, L2TP_ATTR_OFFSET, session->offset)) || (session->cookie_len && nla_put(skb, L2TP_ATTR_COOKIE, session->cookie_len, &session->cookie[0])) ||
net/llc/af_llc.c +3 -0
@@ -930,6 +930,9 @@ static int llc_ui_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)if (size > llc->dev->mtu) size = llc->dev->mtu; copied = size - hdrlen; + rc = -EINVAL ; +if (copied <0 ) + goto release;release_sock (sk); skb =sock_alloc_send_skb (sk, size, noblock, &rc);lock_sock (sk);
net/nsh/nsh.c +2 -0
@@ -30,6 +30,8 @@ static struct sk_buff *nsh_gso_segment(struct sk_buff *skb,if (unlikely (!pskb_may_pull (skb,NSH_BASE_HDR_LEN ))) goto out; nsh_len =nsh_hdr_len (nsh_hdr (skb)); +if (nsh_len <NSH_BASE_HDR_LEN ) + goto out;if (unlikely (!pskb_may_pull (skb, nsh_len))) goto out;
net/openvswitch/flow_netlink.c +3 -6
@@ -1404,13 +1404,10 @@ static void nlattr_set(struct nlattr *attr, u8 val,/* The nlattr stream should already have been validated */ nla_for_each_nested (nla, attr, rem) { -if (tbl[nla_type (nla)].len ==OVS_ATTR_NESTED ) { -if (tbl[nla_type (nla)].next) - tbl = tbl[nla_type (nla)].next; -nlattr_set (nla, val, tbl); - }else { +if (tbl[nla_type (nla)].len ==OVS_ATTR_NESTED ) +nlattr_set (nla, val, tbl[nla_type (nla)].next ? : tbl); +else memset (nla_data (nla), val,nla_len (nla)); - }if (nla_type (nla) ==OVS_KEY_ATTR_CT_STATE ) *(u32 *)nla_data (nla) &=CT_SUPPORTED_MASK ;
net/rds/recv.c +1 -0
@@ -558,6 +558,7 @@ static int rds_cmsg_recv(struct rds_incoming *inc, struct msghdr *msg,struct rds_cmsg_rx_trace t;int i, j; +memset (&t,0 ,sizeof (t)); inc->i_rx_lat_trace[RDS_MSG_RX_CMSG ] =local_clock (); t.rx_traces = rs->rs_rx_traces;for (i =0 ; i < rs->rs_rx_traces; i++) {
net/sched/act_skbmod.c +4 -1
@@ -131,8 +131,11 @@ static int tcf_skbmod_init(struct net *net, struct nlattr *nla,if (exists && bind)return 0 ; -if (!lflags) +if (!lflags) { +if (exists) +tcf_idr_release (*a, bind);return -EINVAL ; + }if (!exists) { ret = tcf_idr_create(tn, parm->index, est, a,
net/sched/cls_api.c +1 -1
@@ -151,8 +151,8 @@ static struct tcf_proto *tcf_proto_create(const char *kind, u32 protocol, } else { err = -ENOENT ; } - goto errout;#endif + goto errout; } tp->classify = tp->ops->classify; tp->protocol = protocol;
net/sched/sch_fq.c +25 -12
@@ -128,6 +128,28 @@ static bool fq_flow_is_detached(const struct fq_flow *f)return f->next == &detached; } +static bool fq_flow_is_throttled (const struct fq_flow *f) +{ +return f->next == &throttled; +} + +static void fq_flow_add_tail (struct fq_flow_head *head,struct fq_flow *flow) +{ +if (head->first) + head->last->next = flow; +else + head->first = flow; + head->last = flow; + flow->next =NULL ; +} + +static void fq_flow_unset_throttled (struct fq_sched_data *q,struct fq_flow *f) +{ +rb_erase (&f->rate_node, &q->delayed); + q->throttled_flows--; +fq_flow_add_tail (&q->old_flows, f); +} +static void fq_flow_set_throttled (struct fq_sched_data *q,struct fq_flow *f) {struct rb_node **p = &q->delayed.rb_node, *parent =NULL ;
@@ -155,15 +177,6 @@ static void fq_flow_set_throttled(struct fq_sched_data *q, struct fq_flow *f)static struct kmem_cache *fq_flow_cachep__read_mostly ; -static void fq_flow_add_tail (struct fq_flow_head *head,struct fq_flow *flow) -{ -if (head->first) - head->last->next = flow; -else - head->first = flow; - head->last = flow; - flow->next =NULL ; -}/* limit number of collected flows per round */ #define FQ_GC_MAX 8
@@ -267,6 +280,8 @@ static struct fq_flow *fq_classify(struct sk_buff *skb, struct fq_sched_data *q) f->socket_hash != sk->sk_hash)) { f->credit = q->initial_quantum; f->socket_hash = sk->sk_hash; +if (fq_flow_is_throttled (f)) +fq_flow_unset_throttled (q, f); f->time_next_packet =0ULL ; }return f;
@@ -438,9 +453,7 @@ static void fq_check_throttled(struct fq_sched_data *q, u64 now) q->time_next_delayed_flow = f->time_next_packet;break ; } -rb_erase (p, &q->delayed); - q->throttled_flows--; -fq_flow_add_tail (&q->old_flows, f); +fq_flow_unset_throttled (q, f); } }
net/sctp/associola.c +29 -1
@@ -1025,8 +1025,9 @@ static void sctp_assoc_bh_rcv(struct work_struct *work)struct sctp_endpoint *ep;struct sctp_chunk *chunk;struct sctp_inq *inqueue; -int state; +int first_time =1 ;/* is this the first time through the loop */ int error =0 ; +int state;/* The association should be held so we should be safe. */ ep = asoc->ep;
@@ -1037,6 +1038,30 @@ static void sctp_assoc_bh_rcv(struct work_struct *work) state = asoc->state; subtype =SCTP_ST_CHUNK (chunk->chunk_hdr->type); +/* If the first chunk in the packet is AUTH, do special +* processing specified in Section 6.3 of SCTP-AUTH spec +*/ +if (first_time && subtype.chunk ==SCTP_CID_AUTH ) { +struct sctp_chunkhdr *next_hdr; + + next_hdr =sctp_inq_peek (inqueue); +if (!next_hdr) + goto normal; + +/* If the next chunk is COOKIE-ECHO, skip the AUTH +* chunk while saving a pointer to it so we can do +* Authentication later (during cookie-echo +* processing). +*/ +if (next_hdr->type ==SCTP_CID_COOKIE_ECHO ) { + chunk->auth_chunk =skb_clone (chunk->skb, +GFP_ATOMIC ); + chunk->auth =1 ; +continue ; + } + } + +normal:/* SCTP-AUTH, Section 6.3: * The receiver has a list of chunk types which it expects * to be received only after an AUTH-chunk. This list has
@@ -1075,6 +1100,9 @@ static void sctp_assoc_bh_rcv(struct work_struct *work)/* If there is an error on chunk, discard this packet. */ if (error && chunk) chunk->pdiscard =1 ; + +if (first_time) + first_time =0 ; }sctp_association_put (asoc); }
net/sctp/inqueue.c +1 -1
@@ -217,7 +217,7 @@ struct sctp_chunk *sctp_inq_pop(struct sctp_inq *queue)skb_pull (chunk->skb,sizeof (*ch)); chunk->subh.v =NULL ;/* Subheader is no longer valid. */ -if (chunk->chunk_end +sizeof (*ch) <skb_tail_pointer (chunk->skb)) { +if (chunk->chunk_end +sizeof (*ch) <=skb_tail_pointer (chunk->skb)) {/* This is not a singleton */ chunk->singleton =0 ; }else if (chunk->chunk_end >skb_tail_pointer (chunk->skb)) {
net/sctp/ipv6.c +3 -0
@@ -865,6 +865,9 @@ static int sctp_inet6_cmp_addr(const union sctp_addr *addr1,if (sctp_is_any (sk, addr1) ||sctp_is_any (sk, addr2))return 1 ; +if (addr1->sa.sa_family ==AF_INET && addr2->sa.sa_family ==AF_INET ) +return addr1->v4.sin_addr.s_addr == addr2->v4.sin_addr.s_addr; +return __sctp_v6_cmp_addr (addr1, addr2); }
net/sctp/sm_statefuns.c +47 -41
149 lines not on this page · raw message
net/sctp/ulpevent.c +0 -1
@@ -717,7 +717,6 @@ struct sctp_ulpevent *sctp_ulpevent_make_rcvmsg(struct sctp_association *asoc,return event; fail_mark: -sctp_chunk_put (chunk);kfree_skb (skb); fail:return NULL ;
net/tls/tls_main.c +8 -0
@@ -87,6 +87,7 @@ int tls_push_sg(struct sock *sk, size = sg->length - offset; offset += sg->offset; + ctx->in_tcp_sendpages = true;while (1 ) {if (sg_is_last (sg)) sendpage_flags = flags;
@@ -107,6 +108,7 @@ int tls_push_sg(struct sock *sk, offset -= sg->offset; ctx->partially_sent_offset = offset; ctx->partially_sent_record = (void *)sg; + ctx->in_tcp_sendpages = false;return ret; }
@@ -121,6 +123,8 @@ int tls_push_sg(struct sock *sk, }clear_bit (TLS_PENDING_CLOSED_RECORD , &ctx->flags); + ctx->in_tcp_sendpages = false; + ctx->sk_write_space (sk);return 0 ; }
@@ -190,6 +194,10 @@ static void tls_write_space(struct sock *sk) {struct tls_context *ctx =tls_get_ctx (sk); +/* We are already sending pages, ignore notification */ +if (ctx->in_tcp_sendpages) +return ; +if (!sk->sk_write_pending &&tls_is_pending_closed_record (ctx)) {gfp_t sk_allocation = sk->sk_allocation;int rc;
net/xfrm/xfrm_input.c +1 -1
@@ -518,7 +518,7 @@ int xfrm_trans_queue(struct sk_buff *skb,return -ENOBUFS ;XFRM_TRANS_SKB_CB (skb)->finish = finish; -skb_queue_tail (&trans->queue, skb); +__skb_queue_tail (&trans->queue, skb);tasklet_schedule (&trans->tasklet);return 0 ; }
net/xfrm/xfrm_state.c +1 -0
@@ -1345,6 +1345,7 @@ static struct xfrm_state *xfrm_state_clone(struct xfrm_state *orig,if (orig->aead) { x->aead =xfrm_algo_aead_clone (orig->aead); + x->geniv = orig->geniv;if (!x->aead) goto error; }