3.4.95-stable review
Greg Kroah-Hartman
maintainercover 3.4.95-stable review
This is the start of the stable review cycle for the 3.4.95 release. There are 26 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu Jun 26 15:46:05 UTC 2014. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.4.95-rc1.gz
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 3.4.95-rc1
Greg Kroah-Hartman <[email protected]>
lzo: properly check for overruns
Markus F.X.J. Oberhumer <[email protected]>
lib/lzo: Update LZO compression to current upstream version
Markus F.X.J. Oberhumer <[email protected]>
lib/lzo: Rename lzo1x_decompress.c to lzo1x_decompress_safe.c
Lars-Peter Clausen <[email protected]>
ALSA: control: Make sure that id->index does not overflow
Lars-Peter Clausen <[email protected]>
ALSA: control: Handle numid overflow
Lars-Peter Clausen <[email protected]>
ALSA: control: Don't access controls outside of protected regions
Lars-Peter Clausen <[email protected]>
ALSA: control: Fix replacing user controls
Lars-Peter Clausen <[email protected]>
ALSA: control: Protect user controls against concurrent access
Kailang Yang <[email protected]>
ALSA: hda/realtek - Add support of ALC891 codec
Thomas Gleixner <[email protected]>
nohz: Fix another inconsistency between CONFIG_NO_HZ=n and nohz=off
Johan Hovold <[email protected]>
USB: cdc-acm: fix runtime PM imbalance at shutdown
Johan Hovold <[email protected]>
USB: cdc-acm: fix I/O after failed open
Johan Hovold <[email protected]>
USB: cdc-acm: fix shutdown and suspend race
Johan Hovold <[email protected]>
USB: cdc-acm: fix runtime PM for control messages
Johan Hovold <[email protected]>
USB: cdc-acm: fix broken runtime suspend
Johan Hovold <[email protected]>
USB: cdc-acm: fix write and resume race
Johan Hovold <[email protected]>
USB: cdc-acm: fix write and suspend race
Michal Schmidt <[email protected]>
netlink: rate-limit leftover bytes warning and print process name
Wei Yang <[email protected]>
net/mlx4_core: Preserve pci_dev_data after __mlx4_remove_one()
Wei Yang <[email protected]>
mlx4_core: Stash PCI ID driver_data in mlx4_priv structure
Xufeng Zhang <[email protected]>
sctp: Fix sk_ack_backlog wrap-around problem
Jiri Pirko <[email protected]>
team: fix mtu setting
Eric Dumazet <[email protected]>
net: fix inet_getid() and ipv6_select_ident() bugs
Tom Gundersen <[email protected]>
net: tunnels - enable module autoloading
Mimi Zohar <[email protected]>
evm: prohibit userspace writing 'security.evm' HMAC value
Nicholas Bellinger <[email protected]>
iscsi-target: Reject mutual authentication with reflected CHAP_C
-------------
Diffstat:
Makefile | 4 +- drivers/net/ethernet/mellanox/mlx4/main.c | 172 ++++++++------- drivers/net/ethernet/mellanox/mlx4/mlx4.h | 7 + drivers/net/team/team.c | 7 +- drivers/target/iscsi/iscsi_target_auth.c | 10 + drivers/usb/class/cdc-acm.c | 96 +++++---- drivers/usb/class/cdc-acm.h | 2 +- include/linux/if_team.h | 1 + include/linux/lzo.h | 15 +- include/net/inetpeer.h | 9 +- include/sound/core.h | 2 + kernel/time/tick-sched.c | 4 +- lib/decompress_unlzo.c | 2 +- lib/lzo/Makefile | 2 +- lib/lzo/lzo1x_compress.c | 335 +++++++++++++++++------------- lib/lzo/lzo1x_decompress.c | 255 ----------------------- lib/lzo/lzo1x_decompress_safe.c | 257 +++++++++++++++++++++++ lib/lzo/lzodefs.h | 38 +++- lib/nlattr.c | 5 +- net/ipv4/ipip.c | 1 + net/ipv6/ip6_output.c | 11 +- net/ipv6/ip6_tunnel.c | 1 + net/ipv6/sit.c | 1 + net/sctp/associola.c | 2 +- security/integrity/evm/evm_main.c | 12 +- sound/core/control.c | 78 ++++--- sound/core/init.c | 1 + sound/pci/hda/patch_realtek.c | 1 + 28 files changed, 748 insertions(+), 583 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/26 iscsi-target: Reject mutual authentication with reflected CHAP_C
3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicholas Bellinger <[email protected]>
commit 1d2b60a5545942b1376cb48c1d55843d71e3a08f upstream.
This patch adds an explicit check in chap_server_compute_md5() to ensure the CHAP_C value received from the initiator during mutual authentication does not match the original CHAP_C provided by the target.
This is in line with RFC-3720, section 8.2.1:
Originators MUST NOT reuse the CHAP challenge sent by the Responder for the other direction of a bidirectional authentication. Responders MUST check for this condition and close the iSCSI TCP connection if it occurs.
--- drivers/target/iscsi/iscsi_target_auth.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/target/iscsi/iscsi_target_auth.c +10 -0
@@ -342,6 +342,16 @@ static int chap_server_compute_md5( goto out; }/* +* During mutual authentication, the CHAP_C generated by the +* initiator must not match the original CHAP_C generated by +* the target. +*/ +if (!memcmp (challenge_binhex, chap->challenge,CHAP_CHALLENGE_LENGTH )) { +pr_err ("initiator CHAP_C matches target CHAP_C, failing" +" login attempt\n" ); + goto out; + } +/* * Generate CHAP_N and CHAP_R for mutual authentication. */ tfm =crypto_alloc_hash ("md5" ,0 ,CRYPTO_ALG_ASYNC );
Greg Kroah-Hartman
maintainerPATCH 2/26 evm: prohibit userspace writing security.evm HMAC value
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mimi Zohar <[email protected]>
commit 2fb1c9a4f2dbc2f0bd2431c7fa64d0b5483864e4 upstream.
Calculating the 'security.evm' HMAC value requires access to the EVM encrypted key. Only the kernel should have access to it. This patch prevents userspace tools(eg. setfattr, cp --preserve=xattr) from setting/modifying the 'security.evm' HMAC value directly.
--- security/integrity/evm/evm_main.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
security/integrity/evm/evm_main.c +10 -2
@@ -271,12 +271,20 @@ static int evm_protect_xattr(struct dent* @xattr_value: pointer to the new extended attribute value * @xattr_value_len: pointer to the new extended attribute value length * -* Updating 'security.evm' requires CAP_SYS_ADMIN privileges and that -* the current value is valid. +* Before allowing the 'security.evm' protected xattr to be updated, +* verify the existing value is valid. As only the kernel should have +* access to the EVM encrypted key needed to calculate the HMAC, prevent +* userspace from writing HMAC value. Writing 'security.evm' requires +* requires CAP_SYS_ADMIN privileges. */ int evm_inode_setxattr (struct dentry *dentry,const char *xattr_name,const void *xattr_value,size_t xattr_value_len) { +const struct evm_ima_xattr_data *xattr_data = xattr_value; + +if ((strcmp (xattr_name,XATTR_NAME_EVM ) ==0 ) + && (xattr_data->type ==EVM_XATTR_HMAC )) +return -EPERM ;return evm_protect_xattr (dentry, xattr_name, xattr_value, xattr_value_len); }
Greg Kroah-Hartman
maintainerPATCH 3/26 net: tunnels - enable module autoloading
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tom Gundersen <[email protected]>
[ Upstream commit f98f89a0104454f35a62d681683c844f6dbf4043 ]
Enable the module alias hookup to allow tunnel modules to be autoloaded on demand.
This is in line with how most other netdev kinds work, and will allow userspace to create tunnels without having CAP_SYS_MODULE.
--- net/ipv4/ipip.c | 1 + net/ipv6/ip6_tunnel.c | 1 + net/ipv6/sit.c | 1 + 3 files changed, 3 insertions(+)
net/ipv4/ipip.c +1 -0
@@ -908,4 +908,5 @@ static void __exit ipip_fini(void)module_init (ipip_init);module_exit (ipip_fini);MODULE_LICENSE ("GPL" ); +MODULE_ALIAS_RTNL_LINK ("ipip" );MODULE_ALIAS_NETDEV ("tunl0" );
net/ipv6/ip6_tunnel.c +1 -0
@@ -57,6 +57,7 @@MODULE_AUTHOR ("Ville Nuorvala" );MODULE_DESCRIPTION ("IPv6 tunneling device" );MODULE_LICENSE ("GPL" ); +MODULE_ALIAS_RTNL_LINK ("ip6tnl" );MODULE_ALIAS_NETDEV ("ip6tnl0" );#ifdef IP6_TNL_DEBUG
net/ipv6/sit.c +1 -0
@@ -1303,4 +1303,5 @@ static int __init sit_init(void)module_init (sit_init);module_exit (sit_cleanup);MODULE_LICENSE ("GPL" ); +MODULE_ALIAS_RTNL_LINK ("sit" );MODULE_ALIAS_NETDEV ("sit0" );
Greg Kroah-Hartman
maintainerPATCH 4/26 net: fix inet_getid() and ipv6_select_ident() bugs
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 39c36094d78c39e038c1e499b2364e13bce36f54 ]
I noticed we were sending wrong IPv4 ID in TCP flows when MTU discovery is disabled.
Note how GSO/TSO packets do not have monotonically incrementing ID.
06:37:41.575531 IP (id 14227, proto: TCP (6), length: 4396) 06:37:41.575534 IP (id 14272, proto: TCP (6), length: 65212) 06:37:41.575544 IP (id 14312, proto: TCP (6), length: 57972) 06:37:41.575678 IP (id 14317, proto: TCP (6), length: 7292) 06:37:41.575683 IP (id 14361, proto: TCP (6), length: 63764)
It appears I introduced this bug in linux-3.1.
inet_getid() must return the old value of peer->ip_id_count, not the new one.
Lets revert this part, and remove the prevention of a null identification field in IPv6 Fragment Extension Header, which is dubious and not even done properly.
--- include/net/inetpeer.h | 9 +-------- net/ipv6/ip6_output.c | 11 +++-------- 2 files changed, 4 insertions(+), 16 deletions(-)
include/net/inetpeer.h +1 -8
@@ -114,16 +114,9 @@ static inline void inet_peer_refcheck(co/* can be called with or without local BH being disabled */ static inline int inet_getid (struct inet_peer *p,int more) { -int old, new; more++;inet_peer_refcheck (p); -do { - old =atomic_read (&p->ip_id_count); - new = old + more; -if (!new) - new =1 ; - }while (atomic_cmpxchg (&p->ip_id_count, old, new) != old); -return new; +return atomic_add_return (more, &p->ip_id_count) - more; }#endif /* _NET_INETPEER_H */
net/ipv6/ip6_output.c +3 -8
@@ -611,7 +611,7 @@ int ip6_find_1stfragopt(struct sk_buff *void ipv6_select_ident (struct frag_hdr *fhdr,struct rt6_info *rt) {static atomic_t ipv6_fragmentation_id; -int old, new; +int ident;if (rt && !(rt->dst.flags &DST_NOPEER )) {struct inet_peer *peer;
@@ -624,13 +624,8 @@ void ipv6_select_ident(struct frag_hdr *return ; } } -do { - old =atomic_read (&ipv6_fragmentation_id); - new = old +1 ; -if (!new) - new =1 ; - }while (atomic_cmpxchg (&ipv6_fragmentation_id, old, new) != old); - fhdr->identification =htonl (new); + ident =atomic_inc_return (&ipv6_fragmentation_id); + fhdr->identification =htonl (ident); }int ip6_fragment (struct sk_buff *skb,int (*output)(struct sk_buff *))
Greg Kroah-Hartman
maintainerPATCH 5/26 team: fix mtu setting
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiri Pirko <[email protected]>
[ Upstream commit 9d0d68faea6962d62dd501cd6e71ce5cc8ed262b ]
Now it is not possible to set mtu to team device which has a port enslaved to it. The reason is that when team_change_mtu() calls dev_set_mtu() for port device, notificator for NETDEV_PRECHANGEMTU event is called and team_device_event() returns NOTIFY_BAD forbidding the change. So fix this by returning NOTIFY_DONE here in case team is changing mtu in team_change_mtu().
--- drivers/net/team/team.c | 7 ++++++- include/linux/if_team.h | 1 + 2 files changed, 7 insertions(+), 1 deletion(-)
drivers/net/team/team.c +6 -1
@@ -889,6 +889,7 @@ static int team_change_mtu(struct net_de* to traverse list in reverse under rcu_read_lock */ mutex_lock (&team->lock); + team->port_mtu_change_allowed = true;list_for_each_entry (port, &team->port_list, list) { err =dev_set_mtu (port->dev, new_mtu);if (err) {
@@ -897,6 +898,7 @@ static int team_change_mtu(struct net_de goto unwind; } } + team->port_mtu_change_allowed = false;mutex_unlock (&team->lock); dev->mtu = new_mtu;
@@ -906,6 +908,7 @@ static int team_change_mtu(struct net_de unwind:list_for_each_entry_continue_reverse (port, &team->port_list, list)dev_set_mtu (port->dev, dev->mtu); + team->port_mtu_change_allowed = false;mutex_unlock (&team->lock);return err;
@@ -1671,7 +1674,9 @@ static int team_device_event(struct notibreak ;case NETDEV_CHANGEMTU :/* Forbid to change mtu of underlaying device */ -return NOTIFY_BAD ; +if (!port->team->port_mtu_change_allowed) +return NOTIFY_BAD ; +break ;case NETDEV_PRE_TYPE_CHANGE :/* Forbid to change type of underlaying device */ return NOTIFY_BAD ;
include/linux/if_team.h +1 -0
@@ -113,6 +113,7 @@ struct team {const struct team_mode *mode;struct team_mode_ops ops; +bool port_mtu_change_allowed;long mode_priv[TEAM_MODE_PRIV_LONGS ]; };
Greg Kroah-Hartman
maintainerPATCH 6/26 sctp: Fix sk_ack_backlog wrap-around problem
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xufeng Zhang <[email protected]>
[ Upstream commit d3217b15a19a4779c39b212358a5c71d725822ee ]
Consider the scenario:
For a TCP-style socket, while processing the COOKIE_ECHO chunk in sctp_sf_do_5_1D_ce(), after it has passed a series of sanity check, a new association would be created in sctp_unpack_cookie(), but afterwards, some processing maybe failed, and sctp_association_free() will be called to free the previously allocated association, in sctp_association_free(), sk_ack_backlog value is decremented for this socket, since the initial value for sk_ack_backlog is 0, after the decrement, it will be 65535, a wrap-around problem happens, and if we want to establish new associations afterward in the same socket, ABORT would be triggered since sctp deem the accept queue as full.
Fix this issue by only decrementing sk_ack_backlog for associations in the endpoint's list.
--- net/sctp/associola.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/sctp/associola.c +1 -1
@@ -389,7 +389,7 @@ void sctp_association_free(struct sctp_a/* Only real associations count against the endpoint, so * don't bother for if this is a temporary association. */ -if (!asoc->temp) { +if (!list_empty (&asoc->asocs)) {list_del (&asoc->asocs);/* Decrement the backlog value for a TCP-style listening
Greg Kroah-Hartman
maintainerPATCH 7/26 mlx4_core: Stash PCI ID driver_data in mlx4_priv structure
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Yang <[email protected]>
[ No upstream commit, this is a cherry picked backport enabler. ]
From: Roland Dreier <[email protected]>
That way we can check flags later on, when we've finished with the pci_device_id structure. Also convert the "is VF" flag to an enum:
"Never do in the preprocessor what can be done in C."
--- drivers/net/ethernet/mellanox/mlx4/main.c | 27 +++++++++++++++------------ drivers/net/ethernet/mellanox/mlx4/mlx4.h | 6 ++++++ 2 files changed, 21 insertions(+), 12 deletions(-)
drivers/net/ethernet/mellanox/mlx4/main.c +15 -12
@@ -92,8 +92,6 @@ MODULE_PARM_DESC(log_num_mgm_entry_size," 10 gives 248.range: 9<=" " log_num_mgm_entry_size <= 12"); -#define MLX4_VF (1 << 0) -#define HCA_GLOBAL_CAP_MASK 0#define PF_CONTEXT_BEHAVIOUR_MASK 0
@@ -1731,7 +1729,7 @@ static void mlx4_free_ownership(struct miounmap (owner); } -static int __mlx4_init_one (struct pci_dev *pdev,const struct pci_device_id *id) +static int __mlx4_init_one (struct pci_dev *pdev,int pci_dev_data) {struct mlx4_priv *priv;struct mlx4_dev *dev;
@@ -1754,12 +1752,11 @@ static int __mlx4_init_one(struct pci_de/* * Check for BARs. */ -if (((id ==NULL ) || !(id->driver_data &MLX4_VF )) && +if (!(pci_dev_data &MLX4_PCI_DEV_IS_VF ) && !(pci_resource_flags (pdev,0 ) &IORESOURCE_MEM )) {dev_err (&pdev->dev,"Missing DCS, aborting." -"(id == 0X%p, id->driver_data: 0x%lx," -" pci_resource_flags(pdev, 0):0x%lx)\n" , id, - id ? id->driver_data :0 ,pci_resource_flags (pdev,0 )); +"(driver_data: 0x%x, pci_resource_flags(pdev, 0):0x%lx)\n" , + pci_dev_data,pci_resource_flags (pdev,0 )); err = -ENODEV ; goto err_disable_pdev; }
@@ -1824,7 +1821,7 @@ static int __mlx4_init_one(struct pci_de dev->rev_id = pdev->revision;/* Detect if this device is a virtual function */ -if (id && id->driver_data &MLX4_VF ) { +if (pci_dev_data &MLX4_PCI_DEV_IS_VF ) {/* When acting as pf, we normally skip vfs unless explicitly * requested to probe them. */ if (num_vfs &&extended_func_num (pdev) > probe_vf) {
@@ -1970,6 +1967,7 @@ slave_start:mlx4_sense_init (dev);mlx4_start_sense (dev); + priv->pci_dev_data = pci_dev_data;pci_set_drvdata (pdev, dev);return 0 ;
@@ -2039,7 +2037,7 @@ static int __devinit mlx4_init_one(struc {printk_once (KERN_INFO "%s" , mlx4_version); -return __mlx4_init_one (pdev, id); +return __mlx4_init_one (pdev, id->driver_data); }static void mlx4_remove_one (struct pci_dev *pdev)
@@ -2108,8 +2106,13 @@ static void mlx4_remove_one(struct pci_dint mlx4_restart_one (struct pci_dev *pdev) { +struct mlx4_dev *dev =pci_get_drvdata (pdev); +struct mlx4_priv *priv =mlx4_priv (dev); +int pci_dev_data; + + pci_dev_data = priv->pci_dev_data;mlx4_remove_one (pdev); -return __mlx4_init_one (pdev,NULL ); +return __mlx4_init_one (pdev, pci_dev_data); }static DEFINE_PCI_DEVICE_TABLE (mlx4_pci_table) = {
@@ -2138,11 +2141,11 @@ static DEFINE_PCI_DEVICE_TABLE(mlx4_pci_/* MT26478 ConnectX2 40GigE PCIe gen2 */ { PCI_VDEVICE(MELLANOX, 0x676e), 0 },/* MT25400 Family [ConnectX-2 Virtual Function] */ - { PCI_VDEVICE(MELLANOX, 0x1002), MLX4_VF }, + { PCI_VDEVICE(MELLANOX, 0x1002), MLX4_PCI_DEV_IS_VF },/* MT27500 Family [ConnectX-3] */ { PCI_VDEVICE(MELLANOX, 0x1003), 0 },/* MT27500 Family [ConnectX-3 Virtual Function] */ - { PCI_VDEVICE(MELLANOX, 0x1004), MLX4_VF }, + { PCI_VDEVICE(MELLANOX, 0x1004), MLX4_PCI_DEV_IS_VF }, { PCI_VDEVICE(MELLANOX, 0x1005), 0 }, /* MT27510 Family */ { PCI_VDEVICE(MELLANOX, 0x1006), 0 }, /* MT27511 Family */ { PCI_VDEVICE(MELLANOX, 0x1007), 0 }, /* MT27520 Family */
drivers/net/ethernet/mellanox/mlx4/mlx4.h +6 -0
@@ -711,6 +711,10 @@ struct mlx4_steer {struct list_head steer_entries[MLX4_NUM_STEERS ]; }; +enum { +MLX4_PCI_DEV_IS_VF =1 <<0 , +}; +struct mlx4_priv {struct mlx4_dev dev;
@@ -718,6 +722,8 @@ struct mlx4_priv {struct list_head ctx_list;spinlock_t ctx_lock; +int pci_dev_data; +struct list_head pgdir_list;struct mutex pgdir_mutex;
Greg Kroah-Hartman
maintainerPATCH 8/26 net/mlx4_core: Preserve pci_dev_data after __mlx4_remove_one()
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Yang <[email protected]>
[ Upstream commit befdf8978accecac2e0739e6b5075afc62db37fe ]
This patch wrap up a helper function __mlx4_remove_one() which does the tear down function but preserve the drv_data. Functions like mlx4_pci_err_detected() and mlx4_restart_one() will call this one with out releasing drvdata.
--- drivers/net/ethernet/mellanox/mlx4/main.c | 145 ++++++++++++++++-------------- drivers/net/ethernet/mellanox/mlx4/mlx4.h | 1 2 files changed, 83 insertions(+), 63 deletions(-)
drivers/net/ethernet/mellanox/mlx4/main.c +82 -63
@@ -1798,15 +1798,8 @@ static int __mlx4_init_one(struct pci_de/* Allow large DMA segments, up to the firmware limit of 1 GB */ dma_set_max_seg_size (&pdev->dev,1024 *1024 *1024 ); - priv =kzalloc (sizeof *priv,GFP_KERNEL ); -if (!priv) { -dev_err (&pdev->dev,"Device struct alloc failed, " -"aborting.\n" ); - err = -ENOMEM ; - goto err_release_regions; - } - - dev = &priv->dev; + dev =pci_get_drvdata (pdev); + priv =mlx4_priv (dev); dev->pdev = pdev;INIT_LIST_HEAD (&priv->ctx_list);spin_lock_init (&priv->ctx_lock);
@@ -1967,8 +1960,7 @@ slave_start:mlx4_sense_init (dev);mlx4_start_sense (dev); - priv->pci_dev_data = pci_dev_data; -pci_set_drvdata (pdev, dev); + priv->removed =0 ;return 0 ;
@@ -2035,73 +2027,100 @@ err_disable_pdev:static int __devinit mlx4_init_one (struct pci_dev *pdev,const struct pci_device_id *id) { +struct mlx4_priv *priv; +struct mlx4_dev *dev; +printk_once (KERN_INFO "%s" , mlx4_version); + priv =kzalloc (sizeof (*priv),GFP_KERNEL ); +if (!priv) +return -ENOMEM ; + + dev = &priv->dev; +pci_set_drvdata (pdev, dev); + priv->pci_dev_data = id->driver_data; +return __mlx4_init_one (pdev, id->driver_data); } -static void mlx4_remove_one (struct pci_dev *pdev) +static void __mlx4_remove_one (struct pci_dev *pdev) {struct mlx4_dev *dev =pci_get_drvdata (pdev);struct mlx4_priv *priv =mlx4_priv (dev); +int pci_dev_data;int p; -if (dev) { -/* in SRIOV it is not allowed to unload the pf's -* driver while there are alive vf's */ -if (mlx4_is_master (dev)) { -if (mlx4_how_many_lives_vf (dev)) -printk (KERN_ERR "Removing PF when there are assigned VF's !!!\n" ); - } -mlx4_stop_sense (dev); -mlx4_unregister_device (dev); +if (priv->removed) +return ; -for (p =1 ; p <= dev->caps.num_ports; p++) { -mlx4_cleanup_port_info (&priv->port[p]); -mlx4_CLOSE_PORT (dev, p); - } + pci_dev_data = priv->pci_dev_data; -mlx4_cleanup_counters_table (dev); -mlx4_cleanup_mcg_table (dev); -mlx4_cleanup_qp_table (dev); -mlx4_cleanup_srq_table (dev); -mlx4_cleanup_cq_table (dev); -mlx4_cmd_use_polling (dev); -mlx4_cleanup_eq_table (dev); -mlx4_cleanup_mr_table (dev); -mlx4_cleanup_xrcd_table (dev); -mlx4_cleanup_pd_table (dev); +/* in SRIOV it is not allowed to unload the pf's +* driver while there are alive vf's */ +if (mlx4_is_master (dev)) { +if (mlx4_how_many_lives_vf (dev)) +printk (KERN_ERR "Removing PF when there are assigned VF's !!!\n" ); + } +mlx4_stop_sense (dev); +mlx4_unregister_device (dev); -if (mlx4_is_master (dev)) -mlx4_free_resource_tracker (dev); +for (p =1 ; p <= dev->caps.num_ports; p++) { +mlx4_cleanup_port_info (&priv->port[p]); +mlx4_CLOSE_PORT (dev, p); + } -iounmap (priv->kar); -mlx4_uar_free (dev, &priv->driver_uar); -mlx4_cleanup_uar_table (dev); -if (!mlx4_is_slave (dev)) -mlx4_clear_steering (dev); -mlx4_free_eq_table (dev); -if (mlx4_is_master (dev)) -mlx4_multi_func_cleanup (dev); -mlx4_close_hca (dev); -if (mlx4_is_slave (dev)) -mlx4_multi_func_cleanup (dev); -mlx4_cmd_cleanup (dev); - -if (dev->flags &MLX4_FLAG_MSI_X ) -pci_disable_msix (pdev); -if (num_vfs && (dev->flags &MLX4_FLAG_SRIOV )) { -mlx4_warn (dev,"Disabling sriov\n" ); -pci_disable_sriov (pdev); - } +mlx4_cleanup_counters_table (dev); +mlx4_cleanup_mcg_table (dev); +mlx4_cleanup_qp_table (dev); +mlx4_cleanup_srq_table (dev); +mlx4_cleanup_cq_table (dev); +mlx4_cmd_use_polling (dev); +mlx4_cleanup_eq_table (dev); +mlx4_cleanup_mr_table (dev); +mlx4_cleanup_xrcd_table (dev); +mlx4_cleanup_pd_table (dev); + +if (mlx4_is_master (dev)) +mlx4_free_resource_tracker (dev); + +iounmap (priv->kar); +mlx4_uar_free (dev, &priv->driver_uar); +mlx4_cleanup_uar_table (dev); +if (!mlx4_is_slave (dev)) +mlx4_clear_steering (dev); +mlx4_free_eq_table (dev); +if (mlx4_is_master (dev)) +mlx4_multi_func_cleanup (dev); +mlx4_close_hca (dev); +if (mlx4_is_slave (dev)) +mlx4_multi_func_cleanup (dev); +mlx4_cmd_cleanup (dev); -if (!mlx4_is_slave (dev)) -mlx4_free_ownership (dev); -kfree (priv); -pci_release_regions (pdev); -pci_disable_device (pdev); -pci_set_drvdata (pdev,NULL ); +if (dev->flags &MLX4_FLAG_MSI_X ) +pci_disable_msix (pdev); +if (num_vfs && (dev->flags &MLX4_FLAG_SRIOV )) { +mlx4_warn (dev,"Disabling sriov\n" ); +pci_disable_sriov (pdev); } + +if (!mlx4_is_slave (dev)) +mlx4_free_ownership (dev); + +pci_release_regions (pdev); +pci_disable_device (pdev); +memset (priv,0 ,sizeof (*priv)); + priv->pci_dev_data = pci_dev_data; + priv->removed =1 ; +} + +static void mlx4_remove_one (struct pci_dev *pdev) +{ +struct mlx4_dev *dev =pci_get_drvdata (pdev); +struct mlx4_priv *priv =mlx4_priv (dev); + +__mlx4_remove_one (pdev); +kfree (priv); +pci_set_drvdata (pdev,NULL ); }int mlx4_restart_one (struct pci_dev *pdev)
@@ -2111,7 +2130,7 @@ int mlx4_restart_one(struct pci_dev *pdeint pci_dev_data; pci_dev_data = priv->pci_dev_data; -mlx4_remove_one (pdev); +__mlx4_remove_one (pdev);return __mlx4_init_one (pdev, pci_dev_data); }
drivers/net/ethernet/mellanox/mlx4/mlx4.h +1 -0
@@ -723,6 +723,7 @@ struct mlx4_priv {spinlock_t ctx_lock;int pci_dev_data; +int removed;struct list_head pgdir_list;struct mutex pgdir_mutex;
Greg Kroah-Hartman
maintainerPATCH 9/26 netlink: rate-limit leftover bytes warning and print process name
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Schmidt <[email protected]>
[ Upstream commit bfc5184b69cf9eeb286137640351c650c27f118a ]
Any process is able to send netlink messages with leftover bytes. Make the warning rate-limited to prevent too much log spam.
The warning is supposed to help find userspace bugs, so print the triggering command name to implicate the buggy program.
[v2: Use pr_warn_ratelimited instead of printk_ratelimited.]
--- lib/nlattr.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
lib/nlattr.c +3 -2
@@ -13,6 +13,7 @@#include <linux/skbuff.h> #include <linux/string.h> #include <linux/types.h> +#include <linux/ratelimit.h> #include <net/netlink.h> static const u16 nla_attr_minlen[NLA_TYPE_MAX +1 ] = {
@@ -197,8 +198,8 @@ int nla_parse(struct nlattr **tb, int ma }if (unlikely (rem >0 )) -printk (KERN_WARNING "netlink: %d bytes leftover after parsing " -"attributes.\n" , rem); +pr_warn_ratelimited ("netlink: %d bytes leftover after parsing attributes in process `%s'.\n" , + rem, current->comm); err =0 ; errout:
Greg Kroah-Hartman
maintainerPATCH 10/26 USB: cdc-acm: fix write and suspend race
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 5a345c20c17d87099224a4be12e69e5bd7023dca upstream.
Fix race between write() and suspend() which could lead to writes being dropped (or I/O while suspended) if the device is runtime suspended while a write request is being processed.
Specifically, suspend() releases the write_lock after determining the device is idle but before incrementing the susp_count, thus leaving a window where a concurrent write() can submit an urb.
that support remote wakeup")
--- drivers/usb/class/cdc-acm.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-)
drivers/usb/class/cdc-acm.c +6 -9
@@ -1441,18 +1441,15 @@ static int acm_suspend(struct usb_interfstruct acm *acm =usb_get_intfdata (intf);int cnt; +spin_lock_irq (&acm->read_lock); +spin_lock (&acm->write_lock);if (PMSG_IS_AUTO (message)) { -int b; - -spin_lock_irq (&acm->write_lock); - b = acm->transmitting; -spin_unlock_irq (&acm->write_lock); -if (b) +if (acm->transmitting) { +spin_unlock (&acm->write_lock); +spin_unlock_irq (&acm->read_lock);return -EBUSY ; + } } - -spin_lock_irq (&acm->read_lock); -spin_lock (&acm->write_lock); cnt = acm->susp_count++;spin_unlock (&acm->write_lock);spin_unlock_irq (&acm->read_lock);
Greg Kroah-Hartman
maintainerPATCH 11/26 USB: cdc-acm: fix write and resume race
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit e144ed28bed10684f9aaec6325ed974d53f76110 upstream.
Fix race between write() and resume() due to improper locking that could lead to writes being reordered.
Resume must be done atomically and susp_count be protected by the write_lock in order to prevent racing with write(). This could otherwise lead to writes being reordered if write() grabs the write_lock after susp_count is decremented, but before the delayed urb is submitted.
that support remote wakeup")
--- drivers/usb/class/cdc-acm.c | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-)
drivers/usb/class/cdc-acm.c +9 -14
@@ -1468,27 +1468,20 @@ static int acm_resume(struct usb_interfastruct acm *acm =usb_get_intfdata (intf);struct acm_wb *wb;int rv =0 ; -int cnt;spin_lock_irq (&acm->read_lock); - acm->susp_count -=1 ; - cnt = acm->susp_count; -spin_unlock_irq (&acm->read_lock); +spin_lock (&acm->write_lock); -if (cnt) -return 0 ; +if (--acm->susp_count) + goto out;if (test_bit (ASYNCB_INITIALIZED , &acm->port.flags)) { - rv =usb_submit_urb (acm->ctrlurb,GFP_NOIO ); + rv =usb_submit_urb (acm->ctrlurb,GFP_ATOMIC ); -spin_lock_irq (&acm->write_lock);if (acm->delayed_wb) { wb = acm->delayed_wb; acm->delayed_wb =NULL ; -spin_unlock_irq (&acm->write_lock);acm_start_wb (acm, wb); - }else { -spin_unlock_irq (&acm->write_lock); }/*
@@ -1496,12 +1489,14 @@ static int acm_resume(struct usb_interfa* do the write path at all cost */ if (rv <0 ) - goto err_out; + goto out; - rv =acm_submit_read_urbs (acm,GFP_NOIO ); + rv =acm_submit_read_urbs (acm,GFP_ATOMIC ); } +out: +spin_unlock (&acm->write_lock); +spin_unlock_irq (&acm->read_lock); -err_out:return rv; }
Greg Kroah-Hartman
maintainerPATCH 12/26 USB: cdc-acm: fix broken runtime suspend
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 140cb81ac8c625942a1d695875932c615767a526 upstream.
The current ACM runtime-suspend implementation is broken in several ways:
Firstly, it buffers only the first write request being made while suspended -- any further writes are silently dropped.
Secondly, writes being dropped also leak write urbs, which are never reclaimed (until the device is unbound).
Thirdly, even the single buffered write is not cleared at shutdown (which may happen before the device is resumed), something which can lead to another urb leak as well as a PM usage-counter leak.
Fix this by implementing a delayed-write queue using urb anchors and making sure to discard the queue properly at shutdown.
that support remote wakeup")
--- drivers/usb/class/cdc-acm.c | 32 ++++++++++++++++++++++---------- drivers/usb/class/cdc-acm.h | 2 +- 2 files changed, 23 insertions(+), 11 deletions(-)
drivers/usb/class/cdc-acm.c +22 -10
@@ -234,12 +234,9 @@ static int acm_write_start(struct acm *a acm->susp_count);usb_autopm_get_interface_async (acm->control);if (acm->susp_count) { -if (!acm->delayed_wb) - acm->delayed_wb = wb; -else -usb_autopm_put_interface_async (acm->control); +usb_anchor_urb (wb->urb, &acm->delayed);spin_unlock_irqrestore (&acm->write_lock, flags); -return 0 ;/* A white lie */ +return 0 ; }usb_mark_last_busy (acm->dev);
@@ -610,6 +607,8 @@ static void acm_port_destruct(struct ttystatic void acm_port_shutdown (struct tty_port *port) { struct acm *acm = container_of(port, struct acm, port); +struct urb *urb; +struct acm_wb *wb;int i;dev_dbg (&acm->control->dev,"%s\n" , __func__);
@@ -618,6 +617,16 @@ static void acm_port_shutdown(struct ttyif (!acm->disconnected) {usb_autopm_get_interface (acm->control);acm_set_control (acm, acm->ctrlout =0 ); + +for (;;) { + urb =usb_get_from_anchor (&acm->delayed); +if (!urb) +break ; + wb = urb->context; + wb->use =0 ; +usb_autopm_put_interface_async (acm->control); + } +usb_kill_urb (acm->ctrlurb);for (i =0 ; i <ACM_NW ; i++)usb_kill_urb (acm->wb[i].urb);
@@ -1211,6 +1220,7 @@ made_compressed_probe: acm->bInterval = epread->bInterval;tty_port_init (&acm->port); acm->port.ops = &acm_port_ops; +init_usb_anchor (&acm->delayed); buf =usb_alloc_coherent (usb_dev, ctrlsize,GFP_KERNEL , &acm->ctrl_dma);if (!buf) {
@@ -1466,7 +1476,7 @@ static int acm_suspend(struct usb_interfstatic int acm_resume (struct usb_interface *intf) {struct acm *acm =usb_get_intfdata (intf); -struct acm_wb *wb; +struct urb *urb;int rv =0 ;spin_lock_irq (&acm->read_lock);
@@ -1478,10 +1488,12 @@ static int acm_resume(struct usb_interfaif (test_bit (ASYNCB_INITIALIZED , &acm->port.flags)) { rv =usb_submit_urb (acm->ctrlurb,GFP_ATOMIC ); -if (acm->delayed_wb) { - wb = acm->delayed_wb; - acm->delayed_wb =NULL ; -acm_start_wb (acm, wb); +for (;;) { + urb =usb_get_from_anchor (&acm->delayed); +if (!urb) +break ; + +acm_start_wb (acm, urb->context); }/*
drivers/usb/class/cdc-acm.h +1 -1
@@ -117,7 +117,7 @@ struct acm { unsigned int throttled:1; /* actually throttled */ unsigned int throttle_req:1; /* throttle requested */u8 bInterval; -struct acm_wb *delayed_wb;/* write queued for a device about to be woken */ +struct usb_anchor delayed;/* writes queued for a device about to be woken */ };#define CDC_DATA_INTERFACE_TYPE 0x0a
Greg Kroah-Hartman
maintainerPATCH 13/26 USB: cdc-acm: fix runtime PM for control messages
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit bae3f4c53585e9a170da9436e0f06919874bda9a upstream.
Fix runtime PM handling of control messages by adding the required PM counter operations.
that support remote wakeup")
--- drivers/usb/class/cdc-acm.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-)
drivers/usb/class/cdc-acm.c +11 -1
@@ -123,13 +123,23 @@ static void acm_release_minor(struct acmstatic int acm_ctrl_msg (struct acm *acm,int request,int value,void *buf,int len) { -int retval =usb_control_msg (acm->dev,usb_sndctrlpipe (acm->dev,0 ), +int retval; + + retval =usb_autopm_get_interface (acm->control); +if (retval) +return retval; + + retval =usb_control_msg (acm->dev,usb_sndctrlpipe (acm->dev,0 ), request,USB_RT_ACM , value, acm->control->altsetting[0 ].desc.bInterfaceNumber, buf, len,5000 ); +dev_dbg (&acm->control->dev,"%s - rq 0x%02x, val %#x, len %#x, result %d\n" , __func__, request, value, len, retval); + +usb_autopm_put_interface (acm->control); +return retval <0 ? retval :0 ; }
Greg Kroah-Hartman
maintainerPATCH 14/26 USB: cdc-acm: fix shutdown and suspend race
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit ed797074031a37bb9bf4a70952fffc606b77274d upstream.
We should stop I/O unconditionally at suspend rather than rely on the tty-port initialised flag (which is set prior to stopping I/O during shutdown) in order to prevent suspend returning with URBs still active.
that support remote wakeup")
--- drivers/usb/class/cdc-acm.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/usb/class/cdc-acm.c +1 -2
@@ -1477,8 +1477,7 @@ static int acm_suspend(struct usb_interfif (cnt)return 0 ; -if (test_bit (ASYNCB_INITIALIZED , &acm->port.flags)) -stop_data_traffic (acm); +stop_data_traffic (acm);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 15/26 USB: cdc-acm: fix I/O after failed open
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit e4c36076c2a6195ec62c35b03c3fde84d0087dc8 upstream.
Make sure to kill any already submitted read urbs on read-urb submission failures in open in order to prevent doing I/O for a closed port.
--- drivers/usb/class/cdc-acm.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/usb/class/cdc-acm.c +3 -0
@@ -542,6 +542,7 @@ static int acm_port_activate(struct tty_ { struct acm *acm = container_of(port, struct acm, port);int retval = -ENODEV ; +int i;dev_dbg (&acm->control->dev,"%s\n" , __func__);
@@ -590,6 +591,8 @@ static int acm_port_activate(struct tty_return 0 ; error_submit_read_urbs: +for (i =0 ; i < acm->rx_buflimit; i++) +usb_kill_urb (acm->read_urbs[i]); acm->ctrlout =0 ;acm_set_control (acm, acm->ctrlout); error_set_control:
Greg Kroah-Hartman
maintainerPATCH 16/26 USB: cdc-acm: fix runtime PM imbalance at shutdown
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 5292afa657d0e790b7479ad8eef9450c1e040b3d upstream.
Make sure only to decrement the PM counters if they were actually incremented.
Note that the USB PM counter, but not necessarily the driver core PM counter, is reset when the interface is unbound.
that support remote wakeup")
--- drivers/usb/class/cdc-acm.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/usb/class/cdc-acm.c +4 -2
@@ -623,12 +623,13 @@ static void acm_port_shutdown(struct ttystruct urb *urb;struct acm_wb *wb;int i; +int pm_err;dev_dbg (&acm->control->dev,"%s\n" , __func__);mutex_lock (&acm->mutex);if (!acm->disconnected) { -usb_autopm_get_interface (acm->control); + pm_err =usb_autopm_get_interface (acm->control);acm_set_control (acm, acm->ctrlout =0 );for (;;) {
@@ -646,7 +647,8 @@ static void acm_port_shutdown(struct ttyfor (i =0 ; i < acm->rx_buflimit; i++)usb_kill_urb (acm->read_urbs[i]); acm->control->needs_remote_wakeup =0 ; -usb_autopm_put_interface (acm->control); +if (!pm_err) +usb_autopm_put_interface (acm->control); }mutex_unlock (&acm->mutex); }
Greg Kroah-Hartman
maintainerPATCH 17/26 nohz: Fix another inconsistency between CONFIG_NO_HZ=n and nohz=off
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Gleixner <[email protected]>
commit 0e576acbc1d9600cf2d9b4a141a2554639959d50 upstream.
If CONFIG_NO_HZ=n tick_nohz_get_sleep_length() returns NSEC_PER_SEC/HZ.
If CONFIG_NO_HZ=y and the nohz functionality is disabled via the command line option "nohz=off" or not enabled due to missing hardware support, then tick_nohz_get_sleep_length() returns 0. That happens because ts->sleep_length is never set in that case.
Set it to NSEC_PER_SEC/HZ when the NOHZ mode is inactive.
--- kernel/time/tick-sched.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
kernel/time/tick-sched.c +3 -1
@@ -296,8 +296,10 @@ static void tick_nohz_stop_sched_tick(st tick_do_timer_cpu =TICK_DO_TIMER_NONE ; } -if (unlikely (ts->nohz_mode ==NOHZ_MODE_INACTIVE )) +if (unlikely (ts->nohz_mode ==NOHZ_MODE_INACTIVE )) { + ts->sleep_length = (ktime_t ) { .tv64 =NSEC_PER_SEC /HZ };return ; + }if (need_resched ())return ;
Greg Kroah-Hartman
maintainerPATCH 18/26 ALSA: hda/realtek - Add support of ALC891 codec
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kailang Yang <[email protected]>
commit b6c5fbad16aa5026f508093a8d651c25e1cb6179 upstream.
New codec support for ALC891.
--- sound/pci/hda/patch_realtek.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/patch_realtek.c +1 -0
@@ -7062,6 +7062,7 @@ static const struct hda_codec_preset snd { .id = 0x10ec0670, .name = "ALC670", .patch = patch_alc662 }, { .id = 0x10ec0671, .name = "ALC671", .patch = patch_alc662 }, { .id = 0x10ec0680, .name = "ALC680", .patch = patch_alc680 }, + { .id = 0x10ec0867, .name = "ALC891", .patch = patch_alc882 }, { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 }, { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 }, { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc882 },
Greg Kroah-Hartman
maintainerPATCH 19/26 ALSA: control: Protect user controls against concurrent access
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lars-Peter Clausen <[email protected]>
commit 07f4d9d74a04aa7c72c5dae0ef97565f28f17b92 upstream.
The user-control put and get handlers as well as the tlv do not protect against concurrent access from multiple threads. Since the state of the control is not updated atomically it is possible that either two write operations or a write and a read operation race against each other. Both can lead to arbitrary memory disclosure. This patch introduces a new lock that protects user-controls from concurrent access. Since applications typically access controls sequentially than in parallel a single lock per card should be fine.
--- include/sound/core.h | 2 ++ sound/core/control.c | 31 +++++++++++++++++++++++++------ sound/core/init.c | 1 + 3 files changed, 28 insertions(+), 6 deletions(-)
include/sound/core.h +2 -0
@@ -120,6 +120,8 @@ struct snd_card {int user_ctl_count;/* count of all user controls */ struct list_head controls;/* all controls for this card */ struct list_head ctl_files;/* active control files */ +struct mutex user_ctl_lock;/* protects user controls against +concurrent access */ struct snd_info_entry *proc_root;/* root for soundcard specific files */ struct snd_info_entry *proc_id;/* the card id */
sound/core/control.c +25 -6
@@ -988,6 +988,7 @@ static int snd_ctl_elem_unlock(struct snstruct user_element {struct snd_ctl_elem_info info; +struct snd_card *card;void *elem_data;/* element data */ unsigned long elem_data_size;/* size of element data in bytes */ void *tlv_data;/* TLV data */
@@ -1031,7 +1032,9 @@ static int snd_ctl_elem_user_get(struct {struct user_element *ue = kcontrol->private_data; +mutex_lock (&ue->card->user_ctl_lock);memcpy (&ucontrol->value, ue->elem_data, ue->elem_data_size); +mutex_unlock (&ue->card->user_ctl_lock);return 0 ; }
@@ -1040,10 +1043,12 @@ static int snd_ctl_elem_user_put(struct {int change;struct user_element *ue = kcontrol->private_data; - + +mutex_lock (&ue->card->user_ctl_lock); change =memcmp (&ucontrol->value, ue->elem_data, ue->elem_data_size) !=0 ;if (change)memcpy (ue->elem_data, &ucontrol->value, ue->elem_data_size); +mutex_unlock (&ue->card->user_ctl_lock);return change; }
@@ -1063,19 +1068,32 @@ static int snd_ctl_elem_user_tlv(struct new_data =memdup_user (tlv, size);if (IS_ERR (new_data))return PTR_ERR (new_data); +mutex_lock (&ue->card->user_ctl_lock); change = ue->tlv_data_size != size;if (!change) change =memcmp (ue->tlv_data, new_data, size);kfree (ue->tlv_data); ue->tlv_data = new_data; ue->tlv_data_size = size; +mutex_unlock (&ue->card->user_ctl_lock); }else { -if (! ue->tlv_data_size || ! ue->tlv_data) -return -ENXIO ; -if (size < ue->tlv_data_size) -return -ENOSPC ; +int ret =0 ; + +mutex_lock (&ue->card->user_ctl_lock); +if (!ue->tlv_data_size || !ue->tlv_data) { + ret = -ENXIO ; + goto err_unlock; + } +if (size < ue->tlv_data_size) { + ret = -ENOSPC ; + goto err_unlock; + }if (copy_to_user (tlv, ue->tlv_data, ue->tlv_data_size)) -return -EFAULT ; + ret = -EFAULT ; +err_unlock: +mutex_unlock (&ue->card->user_ctl_lock); +if (ret) +return ret; }return change; }
@@ -1207,6 +1225,7 @@ static int snd_ctl_elem_add(struct snd_c ue =kzalloc (sizeof (struct user_element ) + private_size,GFP_KERNEL );if (ue ==NULL )return -ENOMEM ; + ue->card = card; ue->info = *info; ue->info.access =0 ; ue->elem_data = (char *)ue +sizeof (*ue);
sound/core/init.c +1 -0
@@ -208,6 +208,7 @@ int snd_card_create(int idx, const charINIT_LIST_HEAD (&card->devices);init_rwsem (&card->controls_rwsem);rwlock_init (&card->ctl_files_rwlock); +mutex_init (&card->user_ctl_lock);INIT_LIST_HEAD (&card->controls);INIT_LIST_HEAD (&card->ctl_files);spin_lock_init (&card->files_lock);
Greg Kroah-Hartman
maintainerPATCH 20/26 ALSA: control: Fix replacing user controls
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lars-Peter Clausen <[email protected]>
commit 82262a46627bebb0febcc26664746c25cef08563 upstream.
There are two issues with the current implementation for replacing user controls. The first is that the code does not check if the control is actually a user control and neither does it check if the control is owned by the process that tries to remove it. That allows userspace applications to remove arbitrary controls, which can cause a user after free if a for example a driver does not expect a control to be removed from under its feed.
The second issue is that on one hand when a control is replaced the user_ctl_count limit is not checked and on the other hand the user_ctl_count is increased (even though the number of user controls does not change). This allows userspace, once the user_ctl_count limit as been reached, to repeatedly replace a control until user_ctl_count overflows. Once that happens new controls can be added effectively bypassing the user_ctl_count limit.
Both issues can be fixed by instead of open-coding the removal of the control that is to be replaced to use snd_ctl_remove_user_ctl(). This function does proper permission checks as well as decrements user_ctl_count after the control has been removed.
Note that by using snd_ctl_remove_user_ctl() the check which returns -EBUSY at beginning of the function if the control already exists is removed. This is not a problem though since the check is quite useless, because the lock that is protecting the control list is released between the check and before adding the new control to the list, which means that it is possible that a different control with the same settings is added to the list after the check. Luckily there is another check that is done while holding the lock in snd_ctl_add(), so we'll rely on that to make sure that the same control is not added twice.
--- sound/core/control.c | 25 +++++++++---------------- 1 file changed, 9 insertions(+), 16 deletions(-)
sound/core/control.c +9 -16
@@ -1151,8 +1151,6 @@ static int snd_ctl_elem_add(struct snd_cstruct user_element *ue;int idx, err; -if (!replace && card->user_ctl_count >=MAX_USER_CONTROLS ) -return -ENOMEM ;if (info->count <1 )return -EINVAL ; access = info->access == 0 ? SNDRV_CTL_ELEM_ACCESS_READWRITE :
@@ -1161,21 +1159,16 @@ static int snd_ctl_elem_add(struct snd_c SNDRV_CTL_ELEM_ACCESS_TLV_READWRITE)); info->id.numid =0 ;memset (&kctl,0 ,sizeof (kctl)); -down_write (&card->controls_rwsem); - _kctl =snd_ctl_find_id (card, &info->id); - err =0 ; -if (_kctl) { -if (replace) - err =snd_ctl_remove (card, _kctl); -else - err = -EBUSY ; - }else { -if (replace) - err = -ENOENT ; + +if (replace) { + err =snd_ctl_remove_user_ctl (file, &info->id); +if (err) +return err; } -up_write (&card->controls_rwsem); -if (err <0 ) -return err; + +if (card->user_ctl_count >=MAX_USER_CONTROLS ) +return -ENOMEM ; +memcpy (&kctl.id, &info->id,sizeof (info->id)); kctl.count = info->owner ? info->owner :1 ; access |=SNDRV_CTL_ELEM_ACCESS_USER ;
Greg Kroah-Hartman
maintainerPATCH 21/26 ALSA: control: Dont access controls outside of protected regions
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lars-Peter Clausen <[email protected]>
commit fd9f26e4eca5d08a27d12c0933fceef76ed9663d upstream.
A control that is visible on the card->controls list can be freed at any time. This means we must not access any of its memory while not holding the controls_rw_lock. Otherwise we risk a use after free access.
--- sound/core/control.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
sound/core/control.c +10 -5
@@ -329,6 +329,7 @@ int snd_ctl_add(struct snd_card *card, s {struct snd_ctl_elem_id id;unsigned int idx; +unsigned int count;int err = -EINVAL ;if (! kcontrol)
@@ -357,8 +358,9 @@ int snd_ctl_add(struct snd_card *card, s card->controls_count += kcontrol->count; kcontrol->id.numid = card->last_numid +1 ; card->last_numid += kcontrol->count; + count = kcontrol->count;up_write (&card->controls_rwsem); -for (idx =0 ; idx < kcontrol->count; idx++, id.index++, id.numid++) +for (idx =0 ; idx < count; idx++, id.index++, id.numid++)snd_ctl_notify (card,SNDRV_CTL_EVENT_MASK_ADD , &id);return 0 ;
@@ -387,6 +389,7 @@ int snd_ctl_replace(struct snd_card *car bool add_on_replace) {struct snd_ctl_elem_id id; +unsigned int count;unsigned int idx;struct snd_kcontrol *old;int ret;
@@ -422,8 +425,9 @@ add: card->controls_count += kcontrol->count; kcontrol->id.numid = card->last_numid +1 ; card->last_numid += kcontrol->count; + count = kcontrol->count;up_write (&card->controls_rwsem); -for (idx =0 ; idx < kcontrol->count; idx++, id.index++, id.numid++) +for (idx =0 ; idx < count; idx++, id.index++, id.numid++)snd_ctl_notify (card,SNDRV_CTL_EVENT_MASK_ADD , &id);return 0 ;
@@ -894,9 +898,9 @@ static int snd_ctl_elem_write(struct snd result = kctl->put (kctl, control); }if (result >0 ) { +struct snd_ctl_elem_id id = control->id;up_read (&card->controls_rwsem); -snd_ctl_notify (card,SNDRV_CTL_EVENT_MASK_VALUE , - &control->id); +snd_ctl_notify (card,SNDRV_CTL_EVENT_MASK_VALUE , &id);return 0 ; } }
@@ -1330,8 +1334,9 @@ static int snd_ctl_tlv_ioctl(struct snd_ } err = kctl->tlv.c (kctl, op_flag, tlv.length, _tlv->tlv);if (err >0 ) { +struct snd_ctl_elem_id id = kctl->id;up_read (&card->controls_rwsem); -snd_ctl_notify (card,SNDRV_CTL_EVENT_MASK_TLV , &kctl->id); +snd_ctl_notify (card,SNDRV_CTL_EVENT_MASK_TLV , &id);return 0 ; } }else {
Greg Kroah-Hartman
maintainerPATCH 22/26 ALSA: control: Handle numid overflow
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lars-Peter Clausen <[email protected]>
commit ac902c112d90a89e59916f751c2745f4dbdbb4bd upstream.
Each control gets automatically assigned its numids when the control is created. The allocation is done by incrementing the numid by the amount of allocated numids per allocation. This means that excessive creation and destruction of controls (e.g. via SNDRV_CTL_IOCTL_ELEM_ADD/REMOVE) can cause the id to eventually overflow. Currently when this happens for the control that caused the overflow kctl->id.numid + kctl->count will also over flow causing it to be smaller than kctl->id.numid. Most of the code assumes that this is something that can not happen, so we need to make sure that it won't happen
--- sound/core/control.c | 4 ++++ 1 file changed, 4 insertions(+)
sound/core/control.c +4 -0
@@ -288,6 +288,10 @@ static bool snd_ctl_remove_numid_conflic {struct snd_kcontrol *kctl; +/* Make sure that the ids assigned to the control do not wrap around */ +if (card->last_numid >=UINT_MAX - count) + card->last_numid =0 ; +list_for_each_entry (kctl, &card->controls, list) {if (kctl->id.numid < card->last_numid +1 + count && kctl->id.numid + kctl->count > card->last_numid +1 ) {
Greg Kroah-Hartman
maintainerPATCH 23/26 ALSA: control: Make sure that id->index does not overflow
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lars-Peter Clausen <[email protected]>
commit 883a1d49f0d77d30012f114b2e19fc141beb3e8e upstream.
The ALSA control code expects that the range of assigned indices to a control is continuous and does not overflow. Currently there are no checks to enforce this. If a control with a overflowing index range is created that control becomes effectively inaccessible and unremovable since snd_ctl_find_id() will not be able to find it. This patch adds a check that makes sure that controls with a overflowing index range can not be created.
--- sound/core/control.c | 3 +++ 1 file changed, 3 insertions(+)
sound/core/control.c +3 -0
@@ -341,6 +341,9 @@ int snd_ctl_add(struct snd_card *card, sif (snd_BUG_ON (!card || !kcontrol->info)) goto error; id = kcontrol->id; +if (id.index >UINT_MAX - kcontrol->count) + goto error; +down_write (&card->controls_rwsem);if (snd_ctl_find_id (card, &id)) {up_write (&card->controls_rwsem);
Greg Kroah-Hartman
maintainerPATCH 24/26 lib/lzo: Rename lzo1x_decompress.c to lzo1x_decompress_safe.c
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Markus F.X.J. Oberhumer" <[email protected]>
commit b6bec26cea948148a9420e7a0ac337f925de49e7 upstream.
Rename the source file to match the function name and thereby also make room for a possible future even slightly faster "non-safe" decompressor version.
--- lib/decompress_unlzo.c | 2 lib/lzo/Makefile | 2 lib/lzo/lzo1x_decompress.c | 255 ---------------------------------------- lib/lzo/lzo1x_decompress_safe.c | 255 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 257 insertions(+), 257 deletions(-)
lib/decompress_unlzo.c +1 -1
@@ -31,7 +31,7 @@*/ #ifdef STATIC -#include "lzo/lzo1x_decompress.c" +#include "lzo/lzo1x_decompress_safe.c" #else #include <linux/decompress/unlzo.h> #endif
lib/lzo/Makefile +1 -1
@@ -1,5 +1,5 @@ lzo_compress-objs := lzo1x_compress.o -lzo_decompress-objs := lzo1x_decompress.o +lzo_decompress-objs := lzo1x_decompress_safe.o obj-$(CONFIG_LZO_COMPRESS) += lzo_compress.o obj-$(CONFIG_LZO_DECOMPRESS) += lzo_decompress.o
lib/lzo/lzo1x_decompress.c deleted +0 -255
255 lines not on this page · raw message
lib/lzo/lzo1x_decompress_safe.c new file +255 -0
255 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 25/26 lib/lzo: Update LZO compression to current upstream version
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Markus F.X.J. Oberhumer" <[email protected]>
commit 8b975bd3f9089f8ee5d7bbfd798537b992bbc7e7 upstream.
This commit updates the kernel LZO code to the current upsteam version which features a significant speed improvement - benchmarking the Calgary and Silesia test corpora typically shows a doubled performance in both compression and decompression on modern i386/x86_64/powerpc machines.
--- include/linux/lzo.h | 15 - lib/lzo/lzo1x_compress.c | 335 ++++++++++++++++++++++---------------- lib/lzo/lzo1x_decompress_safe.c | 350 ++++++++++++++++++---------------------- lib/lzo/lzodefs.h | 38 +++- 4 files changed, 395 insertions(+), 343 deletions(-)
include/linux/lzo.h +8 -7
@@ -4,28 +4,28 @@* LZO Public Kernel Interface * A mini subset of the LZO real-time data compression library * -* Copyright (C) 1996-2005 Markus F.X.J. Oberhumer <[email protected]> +* Copyright (C) 1996-2012 Markus F.X.J. Oberhumer <[email protected]> * * The full LZO package can be found at: * http://www.oberhumer.com/opensource/lzo/ * -* Changed for kernel use by: +* Changed for Linux kernel use by: * Nitin Gupta <[email protected]> * Richard Purdie <[email protected]> */ -#define LZO1X_MEM_COMPRESS (16384 * sizeof(unsigned char *)) -#define LZO1X_1_MEM_COMPRESS LZO1X_MEM_COMPRESS +#define LZO1X_1_MEM_COMPRESS (8192 * sizeof(unsigned short)) +#define LZO1X_MEM_COMPRESS LZO1X_1_MEM_COMPRESS#define lzo1x_worst_compress (x) ((x) + ((x) / 16) + 64 + 3) -/* This requires 'workmem' of size LZO1X_1_MEM_COMPRESS */ +/* This requires 'wrkmem' of size LZO1X_1_MEM_COMPRESS */ int lzo1x_1_compress (const unsigned char *src,size_t src_len, -unsigned char *dst,size_t *dst_len,void *wrkmem); +unsigned char *dst,size_t *dst_len,void *wrkmem);/* safe decompression with overrun testing */ int lzo1x_decompress_safe (const unsigned char *src,size_t src_len, -unsigned char *dst,size_t *dst_len); +unsigned char *dst,size_t *dst_len);/* * Return values (< 0 = Error)
@@ -40,5 +40,6 @@ int lzo1x_decompress_safe(const unsigned#define LZO_E_EOF_NOT_FOUND (-7)#define LZO_E_INPUT_NOT_CONSUMED (-8)#define LZO_E_NOT_YET_IMPLEMENTED (-9) +#define LZO_E_INVALID_ARGUMENT (-10)#endif
lib/lzo/lzo1x_compress.c +194 -141
408 lines not on this page · raw message
lib/lzo/lzo1x_decompress_safe.c +166 -184
403 lines not on this page · raw message
lib/lzo/lzodefs.h +27 -11
@@ -1,19 +1,37 @@/* * lzodefs.h -- architecture, OS and compiler specific defines * -* Copyright (C) 1996-2005 Markus F.X.J. Oberhumer <[email protected]> +* Copyright (C) 1996-2012 Markus F.X.J. Oberhumer <[email protected]> * * The full LZO package can be found at: * http://www.oberhumer.com/opensource/lzo/ * -* Changed for kernel use by: +* Changed for Linux kernel use by: * Nitin Gupta <[email protected]> * Richard Purdie <[email protected]> */ -#define LZO_VERSION 0x2020 -#define LZO_VERSION_STRING "2.02" -#define LZO_VERSION_DATE "Oct 17 2005" + +#define COPY4 (dst, src) \ + put_unaligned(get_unaligned((const u32 *)(src)), (u32 *)(dst)) +#if defined(__x86_64__) +#define COPY8 (dst, src) \ + put_unaligned(get_unaligned((const u64 *)(src)), (u64 *)(dst)) +#else +#define COPY8 (dst, src) \ + COPY4(dst, src); COPY4((dst) + 4, (src) + 4) +#endif + +#if defined(__BIG_ENDIAN) && defined(__LITTLE_ENDIAN) +#error "conflicting endian definitions" +#elif defined(__x86_64__) +#define LZO_USE_CTZ64 1 +#define LZO_USE_CTZ32 1 +#elif defined(__i386__) || defined(__powerpc__) +#define LZO_USE_CTZ32 1 +#elif defined(__arm__) && (__LINUX_ARM_ARCH__ >=5 ) +#define LZO_USE_CTZ32 1 +#endif #define M1_MAX_OFFSET 0x0400#define M2_MAX_OFFSET 0x0800
@@ -34,10 +52,8 @@#define M3_MARKER 32#define M4_MARKER 16 -#define D_BITS 14 -#define D_MASK ((1u << D_BITS) - 1) +#define lzo_dict_t unsigned short +#define D_BITS 13 +#define D_SIZE (1u << D_BITS) +#define D_MASK (D_SIZE - 1)#define D_HIGH ((D_MASK >> 1) + 1) - -#define DX2 (p, s1, s2) (((((size_t)((p)[2]) << (s2)) ^ (p)[1]) \ - << (s1)) ^ (p)[0]) -#define DX3 (p, s1, s2, s3) ((DX2((p)+1, s2, s3) << (s1)) ^ (p)[0])
Greg Kroah-Hartman
maintainerPATCH 26/26 lzo: properly check for overruns
In reply to Greg Kroah-Hartman3.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Greg Kroah-Hartman <[email protected]>
commit 206a81c18401c0cde6e579164f752c4b147324ce upstream.
The lzo decompressor can, if given some really crazy data, possibly overrun some variable types. Modify the checking logic to properly detect overruns before they happen.
--- lib/lzo/lzo1x_decompress_safe.c | 62 ++++++++++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 21 deletions(-)
lib/lzo/lzo1x_decompress_safe.c +41 -21
@@ -19,11 +19,31 @@#include <linux/lzo.h> #include "lzodefs.h" -#define HAVE_IP (x) ((size_t)(ip_end - ip) >= (size_t)(x)) -#define HAVE_OP (x) ((size_t)(op_end - op) >= (size_t)(x)) -#define NEED_IP (x) if (!HAVE_IP(x)) goto input_overrun -#define NEED_OP (x) if (!HAVE_OP(x)) goto output_overrun -#define TEST_LB (m_pos) if ((m_pos) < out) goto lookbehind_overrun +#define HAVE_IP (t, x) \ + (((size_t)(ip_end - ip) >= (size_t)(t + x)) && \ + (((t + x) >= t) && ((t + x) >= x))) + +#define HAVE_OP (t, x) \ + (((size_t)(op_end - op) >= (size_t)(t + x)) && \ + (((t + x) >= t) && ((t + x) >= x))) + +#define NEED_IP (t, x) \ + do { \ + if (!HAVE_IP(t, x)) \ + goto input_overrun; \ + } while (0) + +#define NEED_OP (t, x) \ + do { \ + if (!HAVE_OP(t, x)) \ + goto output_overrun; \ + } while (0) + +#define TEST_LB (m_pos) \ + do { \ + if ((m_pos) < out) \ + goto lookbehind_overrun; \ + } while (0)int lzo1x_decompress_safe (const unsigned char *in,size_t in_len,unsigned char *out,size_t *out_len)
@@ -58,14 +78,14 @@ int lzo1x_decompress_safe(const unsignedwhile (unlikely (*ip ==0 )) { t +=255 ; ip++; -NEED_IP (1 ); +NEED_IP (1 ,0 ); } t +=15 + *ip++; } t +=3 ; copy_literal_run:#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS ) -if (likely (HAVE_IP (t +15 ) &&HAVE_OP (t +15 ))) { +if (likely (HAVE_IP (t,15 ) &&HAVE_OP (t,15 ))) {const unsigned char *ie = ip + t;unsigned char *oe = op + t; do {
@@ -81,8 +101,8 @@ copy_literal_run: } else#endif { -NEED_OP (t); -NEED_IP (t +3 ); +NEED_OP (t,0 ); +NEED_IP (t,3 );do { *op++ = *ip++; }while (--t >0 );
@@ -95,7 +115,7 @@ copy_literal_run: m_pos -= t >>2 ; m_pos -= *ip++ <<2 ;TEST_LB (m_pos); -NEED_OP (2 ); +NEED_OP (2 ,0 ); op[0 ] = m_pos[0 ]; op[1 ] = m_pos[1 ]; op +=2 ;
@@ -119,10 +139,10 @@ copy_literal_run:while (unlikely (*ip ==0 )) { t +=255 ; ip++; -NEED_IP (1 ); +NEED_IP (1 ,0 ); } t +=31 + *ip++; -NEED_IP (2 ); +NEED_IP (2 ,0 ); } m_pos = op -1 ; next =get_unaligned_le16 (ip);
@@ -137,10 +157,10 @@ copy_literal_run:while (unlikely (*ip ==0 )) { t +=255 ; ip++; -NEED_IP (1 ); +NEED_IP (1 ,0 ); } t +=7 + *ip++; -NEED_IP (2 ); +NEED_IP (2 ,0 ); } next =get_unaligned_le16 (ip); ip +=2 ;
@@ -154,7 +174,7 @@ copy_literal_run:#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS )if (op - m_pos >=8 ) {unsigned char *oe = op + t; -if (likely (HAVE_OP (t +15 ))) { +if (likely (HAVE_OP (t,15 ))) { do { COPY8(op, m_pos); op += 8;
@@ -164,7 +184,7 @@ copy_literal_run: m_pos +=8 ; }while (op < oe); op = oe; -if (HAVE_IP (6 )) { +if (HAVE_IP (6 ,0 )) { state = next;COPY4 (op, ip); op += next;
@@ -172,7 +192,7 @@ copy_literal_run:continue ; } }else { -NEED_OP (t); +NEED_OP (t,0 );do { *op++ = *m_pos++; }while (op < oe);
@@ -181,7 +201,7 @@ copy_literal_run:#endif {unsigned char *oe = op + t; -NEED_OP (t); +NEED_OP (t,0 ); op[0 ] = m_pos[0 ]; op[1 ] = m_pos[1 ]; op +=2 ;
@@ -194,15 +214,15 @@ match_next: state = next; t = next;#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS ) -if (likely (HAVE_IP (6 ) &&HAVE_OP (4 ))) { +if (likely (HAVE_IP (6 ,0 ) &&HAVE_OP (4 ,0 ))) {COPY4 (op, ip); op += t; ip += t; } else#endif { -NEED_IP (t +3 ); -NEED_OP (t); +NEED_IP (t,3 ); +NEED_OP (t,0 );while (t >0 ) { *op++ = *ip++; t--;
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.4.95 release. There are 26 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu Jun 26 15:46:05 UTC 2014. Anything received after that time might be too late.
Quoted 8 lines
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v3.0/stable-review/patch-3.4.95-rc1.gzand the diffstat can be found below.
thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
-- Shuah
Signature · 4 lines
Shuah Khan Senior Linux Kernel Developer - Open Source Group Samsung Research America(Silicon Valley) [email protected] | (970) 672-0658
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.4.95 release. There are 26 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu Jun 26 15:46:05 UTC 2014. Anything received after that time might be too late.
Build results:
total: 137 pass: 111 skipped: 20 fail: 6
Failed builds:
alpha:allmodconfig
arm:spear6xx_defconfig
score:defconfig
sparc64:allmodconfig
unicore32:defconfig
xtensa:allmodconfig
Qemu tests all passed.
Results are as expected. score:defconfig is new in the list. It passes from 3.12, and the fixes are isolated, so it should be possible to backport the necessary patches to 3.4 if desired. unicore32:defconfig passes with 3.16-rc2. Again, it should be straightforward to backport the necessary patches to 3.4 if so desired.
Details are available at http://server.roeck-us.net:8010/builders.
Guenter