3.14.9-stable review
Subsystems (3)
Greg Kroah-Hartman
maintainercover 3.14.9-stable review
This is the start of the stable review cycle for the 3.14.9 release. There are 68 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:47:04 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.14.9-rc1.gz
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 3.14.9-rc1
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
David Henningsson <[email protected]>
ALSA: hda - Add quirk for external mic on Lifebook U904
Kailang Yang <[email protected]>
ALSA: hda/realtek - Add more entry for enable HP mute led
Kailang Yang <[email protected]>
ALSA: hda/realtek - Add support of ALC891 codec
Wang, Xiaoming <[email protected]>
ALSA: compress: Cancel the optimization of compiler and fix the size of struct for all platform.
Greg Kroah-Hartman <[email protected]>
lz4: ensure length does not wrap
Greg Kroah-Hartman <[email protected]>
lzo: properly check for overruns
Peter Meerwald <[email protected]>
iio: Fix two mpl3115 issues in measurement conversion
Peter Meerwald <[email protected]>
iio: Fix endianness issue in ak8975_read_axis()
Dan Carpenter <[email protected]>
iio: adc: at91: signedness bug in at91_adc_get_trigger_value_by_name()
Robert Hodaszi <[email protected]>
iio: mxs-lradc: fix divider
Mario Schuknecht <[email protected]>
staging: iio: tsl2x7x_core: fix proximity treshold
Jonathan Cameron <[email protected]>
iio:adc:max1363 incorrect resolutions for max11604, max11605, max11610 and max11611.
Peter Ujfalusi <[email protected]>
ASoC: tlv320aci3x: Fix custom snd_soc_dapm_put_volsw_aic3x() function
Liam Girdwood <[email protected]>
ASoC: max98090: Fix reset at resume time
Lars-Peter Clausen <[email protected]>
ASoC: dapm: Make sure to always update the DAPM graph in _put_volsw()
Radim Krčmář <[email protected]>
hv: use correct order when freeing monitor_pages
K. Y. Srinivasan <[email protected]>
Drivers: hv: balloon: Ensure pressure reports are posted regularly
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 potential urb leak and PM imbalance in write
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
James Hogan <[email protected]>
MIPS: KVM: Allocate at least 16KB for exception handlers
Boris BREZILLON <[email protected]>
ARM: at91: fix at91_sysirq_mask_rtc for sam9x5 SoCs
Paolo Bonzini <[email protected]>
KVM: lapic: sync highest ISR to hardware apic on EOI
Wei Yang <[email protected]>
net/mlx4_core: Keep only one driver entry release mlx4_priv
Wei Yang <[email protected]>
net/mlx4_core: Preserve pci_dev_data after __mlx4_remove_one()
Eric Dumazet <[email protected]>
udp: ipv4: do not waste time in __udp4_lib_mcast_demux_lookup
Cong Wang <[email protected]>
vxlan: use dev->needed_headroom instead of dev->hard_header_len
Michal Schmidt <[email protected]>
rtnetlink: fix userspace API breakage for iproute2 < v3.9.0
Xufeng Zhang <[email protected]>
sctp: Fix sk_ack_backlog wrap-around problem
Eric Dumazet <[email protected]>
ipv4: fix a race in ip4_datagram_release_cb()
Jon Cooper <[email protected]>
sfc: PIO:Restrict to 64bit arch and use 64-bit writes.
Dmitry Popov <[email protected]>
ipip, sit: fix ipv4_{update_pmtu,redirect} calls
Eric Dumazet <[email protected]>
net: force a list_del() in unregister_netdevice_many()
Bjørn Mork <[email protected]>
net: qmi_wwan: add Olivetti Olicard modems
Alexei Starovoitov <[email protected]>
net: filter: fix sparc32 typo
Alexei Starovoitov <[email protected]>
net: filter: fix typo in sparc BPF JIT
Sergei Shtylyov <[email protected]>
sh_eth: fix SH7619/771x support
Ben Dooks <[email protected]>
sh_eth: use RNC mode for packet reception
Yuchung Cheng <[email protected]>
tcp: fix cwnd undo on DSACK in F-RTO
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
Toshiaki Makita <[email protected]>
bridge: Prevent insertion of FDB entry with disallowed vlan
Michal Schmidt <[email protected]>
netlink: rate-limit leftover bytes warning and print process name
Sven Wegener <[email protected]>
ipv6: Fix regression caused by efe4208 in udp_v6_mcast_next()
Dan Carpenter <[email protected]>
qlcnic: info leak in qlcnic_dcb_peer_app_info()
Eric W. Biederman <[email protected]>
netlink: Only check file credentials for implicit destinations
Eric W. Biederman <[email protected]>
net: Use netlink_ns_capable to verify the permisions of netlink messages
Eric W. Biederman <[email protected]>
net: Add variants of capable for use on netlink messages
Eric W. Biederman <[email protected]>
net: Add variants of capable for use on on sockets
Eric W. Biederman <[email protected]>
net: Move the permission check in sock_diag_put_filterinfo to packet_diag_dump
Eric W. Biederman <[email protected]>
netlink: Rename netlink_capable netlink_allowed
Mimi Zohar <[email protected]>
evm: prohibit userspace writing 'security.evm' HMAC value
Dmitry Kasatkin <[email protected]>
ima: introduce ima_kernel_read()
Mimi Zohar <[email protected]>
ima: audit log files opened with O_DIRECT flag
Nicholas Bellinger <[email protected]>
iscsi-target: Reject mutual authentication with reflected CHAP_C
Nicholas Bellinger <[email protected]>
target: Fix NULL pointer dereference for XCOPY in target_put_sess_cmd
Boris BREZILLON <[email protected]>
rtc: rtc-at91rm9200: fix infinite wait for ACKUPD irq
-------------
Diffstat:
Documentation/ABI/testing/ima_policy | 2 +- Makefile | 4 +- arch/arm/mach-at91/sysirq_mask.c | 22 +-- arch/mips/kvm/kvm_mips.c | 2 +- arch/sparc/net/bpf_jit_comp.c | 8 +- arch/x86/kvm/lapic.c | 62 ++++++--- crypto/crypto_user.c | 2 +- drivers/connector/cn_proc.c | 2 +- drivers/hv/connection.c | 4 +- drivers/hv/hv_balloon.c | 29 +++- drivers/iio/adc/at91_adc.c | 16 +-- drivers/iio/adc/max1363.c | 16 +-- drivers/iio/magnetometer/ak8975.c | 9 +- drivers/iio/pressure/mpl3115.c | 6 +- drivers/net/ethernet/mellanox/mlx4/main.c | 172 +++++++++++++----------- drivers/net/ethernet/mellanox/mlx4/mlx4.h | 1 + drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c | 1 + drivers/net/ethernet/renesas/sh_eth.c | 32 +++-- drivers/net/ethernet/renesas/sh_eth.h | 2 - drivers/net/ethernet/sfc/io.h | 7 + drivers/net/ethernet/sfc/tx.c | 22 ++- drivers/net/macvlan.c | 1 - drivers/net/team/team.c | 7 +- drivers/net/usb/qmi_wwan.c | 7 +- drivers/net/vxlan.c | 7 +- drivers/rtc/rtc-at91rm9200.c | 16 ++- drivers/scsi/scsi_netlink.c | 2 +- drivers/staging/iio/adc/mxs-lradc.c | 12 +- drivers/staging/iio/light/tsl2x7x_core.c | 8 +- drivers/target/iscsi/iscsi_target_auth.c | 10 ++ drivers/target/target_core_transport.c | 4 + drivers/usb/class/cdc-acm.c | 104 ++++++++------ drivers/usb/class/cdc-acm.h | 2 +- include/linux/if_team.h | 1 + include/linux/netlink.h | 14 +- include/linux/sock_diag.h | 2 +- include/net/inetpeer.h | 9 +- include/net/sock.h | 5 + include/sound/core.h | 2 + include/uapi/sound/compress_offload.h | 2 +- kernel/audit.c | 4 +- lib/lz4/lz4_decompress.c | 2 + lib/lzo/lzo1x_decompress_safe.c | 62 ++++++--- lib/nlattr.c | 4 +- net/bridge/br_input.c | 4 +- net/bridge/br_private.h | 7 + net/bridge/br_vlan.c | 28 ++++ net/can/gw.c | 4 +- net/core/dev.c | 5 +- net/core/rtnetlink.c | 43 ++++-- net/core/sock.c | 49 +++++++ net/core/sock_diag.c | 4 +- net/dcb/dcbnl.c | 2 +- net/decnet/dn_dev.c | 4 +- net/decnet/dn_fib.c | 4 +- net/decnet/netfilter/dn_rtmsg.c | 2 +- net/ipv4/datagram.c | 20 ++- net/ipv4/ipip.c | 5 +- net/ipv4/tcp_input.c | 11 +- net/ipv4/udp.c | 4 + net/ipv6/ip6_tunnel.c | 1 + net/ipv6/output_core.c | 11 +- net/ipv6/sit.c | 5 +- net/ipv6/udp.c | 8 +- net/mac80211/iface.c | 1 - net/netfilter/nfnetlink.c | 2 +- net/netlink/af_netlink.c | 80 ++++++++++- net/netlink/genetlink.c | 2 +- net/packet/diag.c | 7 +- net/phonet/pn_netlink.c | 8 +- net/sched/act_api.c | 2 +- net/sched/cls_api.c | 2 +- net/sched/sch_api.c | 6 +- net/sctp/associola.c | 2 +- net/tipc/netlink.c | 2 +- net/xfrm/xfrm_user.c | 2 +- security/integrity/evm/evm_main.c | 12 +- security/integrity/ima/ima_api.c | 10 +- security/integrity/ima/ima_crypto.c | 32 ++++- security/integrity/ima/ima_main.c | 5 +- security/integrity/ima/ima_policy.c | 6 +- security/integrity/integrity.h | 1 + sound/core/control.c | 78 +++++++---- sound/core/init.c | 1 + sound/pci/hda/patch_realtek.c | 24 ++++ sound/soc/codecs/max98090.c | 3 + sound/soc/codecs/tlv320aic3x.c | 2 +- sound/soc/soc-dapm.c | 23 ++-- 88 files changed, 862 insertions(+), 380 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/68 rtc: rtc-at91rm9200: fix infinite wait for ACKUPD irq
3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Boris BREZILLON <[email protected]>
commit 2fe121e1f5aa3bf31b418a9790db6c400e922291 upstream.
The rtc user must wait at least 1 sec between each time/calandar update (see atmel's datasheet chapter "Updating Time/Calendar").
Use the 1Hz interrupt to update the at91_rtc_upd_rdy flag and wait for the at91_rtc_wait_upd_rdy event if the rtc is not ready.
This patch fixes a deadlock in an uninterruptible wait when the RTC is updated more than once every second. AFAICT the bug is here from the beginning, but I think we should at least backport this fix to 3.10 and the following longterm and stable releases.
--- drivers/rtc/rtc-at91rm9200.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
drivers/rtc/rtc-at91rm9200.c +14 -2
@@ -48,6 +48,7 @@ struct at91_rtc_config {static const struct at91_rtc_config *at91_rtc_config;static DECLARE_COMPLETION (at91_rtc_updated); +static DECLARE_COMPLETION (at91_rtc_upd_rdy);static unsigned int at91_alarm_year =AT91_RTC_EPOCH ;static void __iomem *at91_rtc_regs;static int irq;
@@ -161,6 +162,8 @@ static int at91_rtc_settime(struct devic1900 + tm->tm_year, tm->tm_mon, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); +wait_for_completion (&at91_rtc_upd_rdy); +/* Stop Time/Calendar from counting */ cr =at91_rtc_read (AT91_RTC_CR );at91_rtc_write (AT91_RTC_CR , cr |AT91_RTC_UPDCAL |AT91_RTC_UPDTIM );
@@ -183,7 +186,9 @@ static int at91_rtc_settime(struct devic/* Restart Time/Calendar */ cr =at91_rtc_read (AT91_RTC_CR ); +at91_rtc_write (AT91_RTC_SCCR ,AT91_RTC_SECEV );at91_rtc_write (AT91_RTC_CR , cr & ~(AT91_RTC_UPDCAL |AT91_RTC_UPDTIM )); +at91_rtc_write_ier (AT91_RTC_SECEV );return 0 ; }
@@ -290,8 +295,10 @@ static irqreturn_t at91_rtc_interrupt(inif (rtsr) {/* this interrupt is shared! Is it ours? */ if (rtsr &AT91_RTC_ALARM ) events |= (RTC_AF |RTC_IRQF ); -if (rtsr &AT91_RTC_SECEV ) - events |= (RTC_UF |RTC_IRQF ); +if (rtsr &AT91_RTC_SECEV ) { +complete (&at91_rtc_upd_rdy); +at91_rtc_write_idr (AT91_RTC_SECEV ); + }if (rtsr &AT91_RTC_ACKUPD )complete (&at91_rtc_updated);
@@ -413,6 +420,11 @@ static int __init at91_rtc_probe(structreturn PTR_ERR (rtc);platform_set_drvdata (pdev, rtc); +/* enable SECEV interrupt in order to initialize at91_rtc_upd_rdy +* completion. +*/ +at91_rtc_write_ier (AT91_RTC_SECEV ); +dev_info (&pdev->dev,"AT91 Real Time Clock driver.\n" );return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 2/68 target: Fix NULL pointer dereference for XCOPY in target_put_sess_cmd
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicholas Bellinger <[email protected]>
commit 0ed6e189e3f6ac3a25383ed5cc8b0ac24c9b97b7 upstream.
This patch fixes a NULL pointer dereference regression bug that was introduced with:
commit 1e1110c43b1cda9fe77fc4a04835e460550e6b3c
Author: Mikulas Patocka <[email protected]> Date: Sat May 17 06:49:22 2014 -0400
target: fix memory leak on XCOPY
Now that target_put_sess_cmd() -> kref_put_spinlock_irqsave() is called with a valid se_cmd->cmd_kref, a NULL pointer dereference is triggered because the XCOPY passthrough commands don't have an associated se_session pointer.
To address this bug, go ahead and checking for a NULL se_sess pointer within target_put_sess_cmd(), and call se_cmd->se_tfo->release_cmd() to release the XCOPY's xcopy_pt_cmd memory.
--- drivers/target/target_core_transport.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/target/target_core_transport.c +4 -0
@@ -2342,6 +2342,10 @@ static void target_release_cmd_kref(stru*/ int target_put_sess_cmd (struct se_session *se_sess,struct se_cmd *se_cmd) { +if (!se_sess) { + se_cmd->se_tfo->release_cmd (se_cmd); +return 1 ; + }return kref_put_spinlock_irqsave (&se_cmd->cmd_kref, target_release_cmd_kref, &se_sess->sess_cmd_lock); }
Greg Kroah-Hartman
maintainerPATCH 3/68 iscsi-target: Reject mutual authentication with reflected CHAP_C
In reply to Greg Kroah-Hartman3.14-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
@@ -314,6 +314,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 4/68 ima: audit log files opened with O_DIRECT flag
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mimi Zohar <[email protected]>
commit f9b2a735bdddf836214b5dca74f6ca7712e5a08c upstream.
Files are measured or appraised based on the IMA policy. When a file, in policy, is opened with the O_DIRECT flag, a deadlock occurs.
The first attempt at resolving this lockdep temporarily removed the O_DIRECT flag and restored it, after calculating the hash. The second attempt introduced the O_DIRECT_HAVELOCK flag. Based on this flag, do_blockdev_direct_IO() would skip taking the i_mutex a second time. The third attempt, by Dmitry Kasatkin, resolves the i_mutex locking issue, by re-introducing the IMA mutex, but uncovered another problem. Reading a file with O_DIRECT flag set, writes directly to userspace pages. A second patch allocates a user-space like memory. This works for all IMA hooks, except ima_file_free(), which is called on __fput() to recalculate the file hash.
Until this last issue is addressed, do not 'collect' the measurement for measuring, appraising, or auditing files opened with the O_DIRECT flag set. Based on policy, permit or deny file access. This patch defines a new IMA policy rule option named 'permit_directio'. Policy rules could be defined, based on LSM or other criteria, to permit specific applications to open files with the O_DIRECT flag set.
Changelog v1:
- permit or deny file access based IMA policy rules
--- Documentation/ABI/testing/ima_policy | 2 +- security/integrity/ima/ima_api.c | 10 +++++++++- security/integrity/ima/ima_main.c | 5 ++++- security/integrity/ima/ima_policy.c | 6 +++++- security/integrity/integrity.h | 1 + 5 files changed, 20 insertions(+), 4 deletions(-)
Documentation/ABI/testing/ima_policy +1 -1
@@ -23,7 +23,7 @@ Description: [fowner]] lsm: [[subj_user=] [subj_role=] [subj_type=] [obj_user=] [obj_role=] [obj_type=]] - option: [[appraise_type=]] + option: [[appraise_type=]] [permit_directio] base: func:= [BPRM_CHECK][MMAP_CHECK][FILE_CHECK][MODULE_CHECK] mask:= [MAY_READ] [MAY_WRITE] [MAY_APPEND] [MAY_EXEC]
security/integrity/ima/ima_api.c +9 -1
@@ -199,6 +199,7 @@ int ima_collect_measurement(struct integstruct evm_ima_xattr_data **xattr_value, int *xattr_len) { + const char *audit_cause = "failed";struct inode *inode =file_inode (file);const char *filename = file->f_dentry->d_name.name;int result =0 ;
@@ -213,6 +214,12 @@ int ima_collect_measurement(struct integif (!(iint->flags &IMA_COLLECTED )) {u64 i_version =file_inode (file)->i_version; +if (file->f_flags &O_DIRECT ) { + audit_cause ="failed(directio)" ; + result = -EACCES ; + goto out; + } +/* use default hash algorithm */ hash.hdr.algo = ima_hash_algo;
@@ -233,9 +240,10 @@ int ima_collect_measurement(struct integ result = -ENOMEM ; } } +out:if (result)integrity_audit_msg (AUDIT_INTEGRITY_DATA , inode, - filename,"collect_data" ,"failed" , + filename,"collect_data" , audit_cause, result,0 );return result; }
security/integrity/ima/ima_main.c +4 -1
@@ -217,8 +217,11 @@ static int process_measurement(struct fi xattr_ptr = &xattr_value; rc =ima_collect_measurement (iint, file, xattr_ptr, &xattr_len); -if (rc !=0 ) +if (rc !=0 ) { +if (file->f_flags &O_DIRECT ) + rc = (iint->flags &IMA_PERMIT_DIRECTIO ) ?0 : -EACCES ; goto out_digsig; + } pathname = !filename ?ima_d_path (&file->f_path, &pathbuf) : filename;if (!pathname)
security/integrity/ima/ima_policy.c +5 -1
@@ -351,7 +351,7 @@ enum { Opt_obj_user, Opt_obj_role, Opt_obj_type, Opt_subj_user, Opt_subj_role, Opt_subj_type, Opt_func, Opt_mask, Opt_fsmagic, Opt_uid, Opt_fowner, - Opt_appraise_type, Opt_fsuuid + Opt_appraise_type, Opt_fsuuid, Opt_permit_directio }; static match_table_t policy_tokens = {
@@ -373,6 +373,7 @@ static match_table_t policy_tokens = { {Opt_uid, "uid=%s"}, {Opt_fowner, "fowner=%s"}, {Opt_appraise_type, "appraise_type=%s"}, + {Opt_permit_directio, "permit_directio"}, {Opt_err, NULL} };
@@ -621,6 +622,9 @@ static int ima_parse_rule(char *rule, stelse result = -EINVAL ;break ; +case Opt_permit_directio: + entry->flags |=IMA_PERMIT_DIRECTIO ; +break ;case Opt_err:ima_log_string (ab,"UNKNOWN" , p); result = -EINVAL ;
security/integrity/integrity.h +1 -0
@@ -30,6 +30,7 @@#define IMA_ACTION_FLAGS 0xff000000#define IMA_DIGSIG 0x01000000#define IMA_DIGSIG_REQUIRED 0x02000000 +#define IMA_PERMIT_DIRECTIO 0x04000000#define IMA_DO_MASK (IMA_MEASURE | IMA_APPRAISE | IMA_AUDIT | \ IMA_APPRAISE_SUBMASK)
Greg Kroah-Hartman
maintainerPATCH 5/68 ima: introduce ima_kernel_read()
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Kasatkin <[email protected]>
commit 0430e49b6e7c6b5e076be8fefdee089958c9adad upstream.
Commit 8aac62706 "move exit_task_namespaces() outside of exit_notify" introduced the kernel opps since the kernel v3.10, which happens when Apparmor and IMA-appraisal are enabled at the same time.
----------------------------------------------------------------------
[ 106.750167] BUG: unable to handle kernel NULL pointer dereference at 0000000000000018 [ 106.750221] IP: [<ffffffff811ec7da>] our_mnt+0x1a/0x30 [ 106.750241] PGD 0 [ 106.750254] Oops: 0000 [#1] SMP [ 106.750272] Modules linked in: cuse parport_pc ppdev bnep rfcomm
bluetooth rpcsec_gss_krb5 nfsd auth_rpcgss nfs_acl nfs lockd sunrpc fscache dm_crypt intel_rapl x86_pkg_temp_thermal intel_powerclamp kvm_intel snd_hda_codec_hdmi kvm crct10dif_pclmul crc32_pclmul ghash_clmulni_intel aesni_intel aes_x86_64 glue_helper lrw gf128mul ablk_helper cryptd snd_hda_codec_realtek dcdbas snd_hda_intel snd_hda_codec snd_hwdep snd_pcm snd_page_alloc snd_seq_midi snd_seq_midi_event snd_rawmidi psmouse snd_seq microcode serio_raw snd_timer snd_seq_device snd soundcore video lpc_ich coretemp mac_hid lp parport mei_me mei nbd hid_generic e1000e usbhid ahci ptp hid libahci pps_core
[ 106.750658] CPU: 6 PID: 1394 Comm: mysqld Not tainted 3.13.0-rc7-kds+ #15 [ 106.750673] Hardware name: Dell Inc. OptiPlex 9010/0M9KCM, BIOS A08 09/19/2012 [ 106.750689] task: ffff8800de804920 ti: ffff880400fca000 task.ti: ffff880400fca000 [ 106.750704] RIP: 0010:[<ffffffff811ec7da>] [<ffffffff811ec7da>] our_mnt+0x1a/0x30 [ 106.750725] RSP: 0018:ffff880400fcba60 EFLAGS: 00010286 [ 106.750738] RAX: 0000000000000000 RBX: 0000000000000100 RCX: ffff8800d51523e7 [ 106.750764] RDX: ffffffffffffffea RSI: ffff880400fcba34 RDI: ffff880402d20020 [ 106.750791] RBP: ffff880400fcbae0 R08: 0000000000000000 R09: 0000000000000001 [ 106.750817] R10: 0000000000000000 R11: 0000000000000001 R12: ffff8800d5152300 [ 106.750844] R13: ffff8803eb8df510 R14: ffff880400fcbb28 R15: ffff8800d51523e7 [ 106.750871] FS: 0000000000000000(0000) GS:ffff88040d200000(0000) knlGS:0000000000000000 [ 106.750910] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 106.750935] CR2: 0000000000000018 CR3: 0000000001c0e000 CR4: 00000000001407e0 [ 106.750962] Stack: [ 106.750981] ffffffff813434eb ffff880400fcbb20 ffff880400fcbb18 0000000000000000 [ 106.751037] ffff8800de804920 ffffffff8101b9b9 0001800000000000 0000000000000100 [ 106.751093] 0000010000000000 0000000000000002 000000000000000e ffff8803eb8df500 [ 106.751149] Call Trace: [ 106.751172] [<ffffffff813434eb>] ? aa_path_name+0x2ab/0x430 [ 106.751199] [<ffffffff8101b9b9>] ? sched_clock+0x9/0x10 [ 106.751225] [<ffffffff8134a68d>] aa_path_perm+0x7d/0x170 [ 106.751250] [<ffffffff8101b945>] ? native_sched_clock+0x15/0x80 [ 106.751276] [<ffffffff8134aa73>] aa_file_perm+0x33/0x40 [ 106.751301] [<ffffffff81348c5e>] common_file_perm+0x8e/0xb0 [ 106.751327] [<ffffffff81348d78>] apparmor_file_permission+0x18/0x20 [ 106.751355] [<ffffffff8130c853>] security_file_permission+0x23/0xa0 [ 106.751382] [<ffffffff811c77a2>] rw_verify_area+0x52/0xe0 [ 106.751407] [<ffffffff811c789d>] vfs_read+0x6d/0x170 [ 106.751432] [<ffffffff811cda31>] kernel_read+0x41/0x60 [ 106.751457] [<ffffffff8134fd45>] ima_calc_file_hash+0x225/0x280 [ 106.751483] [<ffffffff8134fb52>] ? ima_calc_file_hash+0x32/0x280 [ 106.751509] [<ffffffff8135022d>] ima_collect_measurement+0x9d/0x160 [ 106.751536] [<ffffffff810b552d>] ? trace_hardirqs_on+0xd/0x10 [ 106.751562] [<ffffffff8134f07c>] ? ima_file_free+0x6c/0xd0 [ 106.751587] [<ffffffff81352824>] ima_update_xattr+0x34/0x60 [ 106.751612] [<ffffffff8134f0d0>] ima_file_free+0xc0/0xd0 [ 106.751637] [<ffffffff811c9635>] __fput+0xd5/0x300 [ 106.751662] [<ffffffff811c98ae>] ____fput+0xe/0x10 [ 106.751687] [<ffffffff81086774>] task_work_run+0xc4/0xe0 [ 106.751712] [<ffffffff81066fad>] do_exit+0x2bd/0xa90 [ 106.751738] [<ffffffff8173c958>] ? retint_swapgs+0x13/0x1b [ 106.751763] [<ffffffff8106780c>] do_group_exit+0x4c/0xc0 [ 106.751788] [<ffffffff81067894>] SyS_exit_group+0x14/0x20 [ 106.751814] [<ffffffff8174522d>] system_call_fastpath+0x1a/0x1f [ 106.751839] Code: c3 0f 1f 44 00 00 55 48 89 e5 e8 22 fe ff ff 5d c3 0f 1f 44 00 00 55 65 48 8b 04 25 c0 c9 00 00 48 8b 80 28 06 00 00 48 89 e5 5d <48> 8b 40 18 48 39 87 c0 00 00 00 0f 94 c0 c3 0f 1f 80 00 00 00 [ 106.752185] RIP [<ffffffff811ec7da>] our_mnt+0x1a/0x30 [ 106.752214] RSP <ffff880400fcba60> [ 106.752236] CR2: 0000000000000018 [ 106.752258] ---[ end trace 3c520748b4732721 ]---
----------------------------------------------------------------------
The reason for the oops is that IMA-appraisal uses "kernel_read()" when file is closed. kernel_read() honors LSM security hook which calls Apparmor handler, which uses current->nsproxy->mnt_ns. The 'guilty' commit changed the order of cleanup code so that nsproxy->mnt_ns was not already available for Apparmor.
Discussion about the issue with Al Viro and Eric W. Biederman suggested that kernel_read() is too high-level for IMA. Another issue, except security checking, that was identified is mandatory locking. kernel_read honors it as well and it might prevent IMA from calculating necessary hash. It was suggested to use simplified version of the function without security and locking checks.
This patch introduces special version ima_kernel_read(), which skips security and mandatory locking checking. It prevents the kernel oops to happen.
--- security/integrity/ima/ima_crypto.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-)
security/integrity/ima/ima_crypto.c +31 -1
@@ -25,6 +25,36 @@static struct crypto_shash *ima_shash_tfm; +/** +* ima_kernel_read - read file content +* +* This is a function for reading file content instead of kernel_read(). +* It does not perform locking checks to ensure it cannot be blocked. +* It does not perform security checks because it is irrelevant for IMA. +* +*/ +static int ima_kernel_read (struct file *file,loff_t offset, +char *addr,unsigned long count) +{ +mm_segment_t old_fs; +char __user *buf = addr; +ssize_t ret; + +if (!(file->f_mode &FMODE_READ )) +return -EBADF ; +if (!file->f_op->read && !file->f_op->aio_read) +return -EINVAL ; + + old_fs =get_fs (); +set_fs (get_ds ()); +if (file->f_op->read) + ret = file->f_op->read (file, buf, count, &offset); +else + ret =do_sync_read (file, buf, count, &offset); +set_fs (old_fs); +return ret; +} +int ima_init_crypto (void ) {long rc;
@@ -98,7 +128,7 @@ static int ima_calc_file_hash_tfm(structwhile (offset < i_size) {int rbuf_len; - rbuf_len =kernel_read (file, offset, rbuf,PAGE_SIZE ); + rbuf_len =ima_kernel_read (file, offset, rbuf,PAGE_SIZE );if (rbuf_len <0 ) { rc = rbuf_len;break ;
Greg Kroah-Hartman
maintainerPATCH 6/68 evm: prohibit userspace writing security.evm HMAC value
In reply to Greg Kroah-Hartman3.14-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
@@ -285,12 +285,20 @@ out:* @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 7/68 netlink: Rename netlink_capable netlink_allowed
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Eric W. Biederman" <[email protected]>
[ Upstream commit 5187cd055b6e81fc6526109456f8b20623148d5f ]
netlink_capable is a static internal function in af_netlink.c and we have better uses for the name netlink_capable.
--- net/netlink/af_netlink.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
net/netlink/af_netlink.c +5 -5
@@ -1360,7 +1360,7 @@ retry:return err; } -static inline int netlink_capable (const struct socket *sock,unsigned int flag) +static inline int netlink_allowed (const struct socket *sock,unsigned int flag) {return (nl_table[sock->sk->sk_protocol].flags & flag) ||ns_capable (sock_net (sock->sk)->user_ns,CAP_NET_ADMIN );
@@ -1428,7 +1428,7 @@ static int netlink_bind(struct socket *s/* Only superuser is allowed to listen multicasts */ if (nladdr->nl_groups) { -if (!netlink_capable (sock,NL_CFG_F_NONROOT_RECV )) +if (!netlink_allowed (sock,NL_CFG_F_NONROOT_RECV ))return -EPERM ; err =netlink_realloc_groups (sk);if (err)
@@ -1490,7 +1490,7 @@ static int netlink_connect(struct socketreturn -EINVAL ;if ((nladdr->nl_groups || nladdr->nl_pid) && - !netlink_capable (sock,NL_CFG_F_NONROOT_SEND )) + !netlink_allowed (sock,NL_CFG_F_NONROOT_SEND ))return -EPERM ;if (!nlk->portid)
@@ -2096,7 +2096,7 @@ static int netlink_setsockopt(struct socbreak ;case NETLINK_ADD_MEMBERSHIP :case NETLINK_DROP_MEMBERSHIP : { -if (!netlink_capable (sock,NL_CFG_F_NONROOT_RECV )) +if (!netlink_allowed (sock,NL_CFG_F_NONROOT_RECV ))return -EPERM ; err =netlink_realloc_groups (sk);if (err)
@@ -2247,7 +2247,7 @@ static int netlink_sendmsg(struct kiocb dst_group =ffs (addr->nl_groups); err = -EPERM ;if ((dst_group || dst_portid) && - !netlink_capable (sock,NL_CFG_F_NONROOT_SEND )) + !netlink_allowed (sock,NL_CFG_F_NONROOT_SEND )) goto out; }else { dst_portid = nlk->dst_portid;
Greg Kroah-Hartman
maintainerPATCH 8/68 net: Move the permission check in sock_diag_put_filterinfo to packet_diag_dump
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Eric W. Biederman" <[email protected]>
[ Upstream commit a53b72c83a4216f2eb883ed45a0cbce014b8e62d ]
The permission check in sock_diag_put_filterinfo is wrong, and it is so removed from it's sources it is not clear why it is wrong. Move the computation into packet_diag_dump and pass a bool of the result into sock_diag_filterinfo.
This does not yet correct the capability check but instead simply moves it to make it clear what is going on.
--- include/linux/sock_diag.h | 2 +- net/core/sock_diag.c | 4 ++-- net/packet/diag.c | 7 ++++++- 3 files changed, 9 insertions(+), 4 deletions(-)
include/linux/sock_diag.h +1 -1
@@ -23,7 +23,7 @@ int sock_diag_check_cookie(void *sk, __uvoid sock_diag_save_cookie (void *sk,__u32 *cookie);int sock_diag_put_meminfo (struct sock *sk,struct sk_buff *skb,int attr); -int sock_diag_put_filterinfo (struct sock *sk, +int sock_diag_put_filterinfo (bool may_report_filterinfo,struct sock *sk,struct sk_buff *skb,int attrtype);#endif
net/core/sock_diag.c +2 -2
@@ -49,7 +49,7 @@ int sock_diag_put_meminfo(struct sock *s }EXPORT_SYMBOL_GPL (sock_diag_put_meminfo); -int sock_diag_put_filterinfo (struct sock *sk, +int sock_diag_put_filterinfo (bool may_report_filterinfo,struct sock *sk,struct sk_buff *skb,int attrtype) {struct nlattr *attr;
@@ -57,7 +57,7 @@ int sock_diag_put_filterinfo(struct sockunsigned int len;int err =0 ; -if (!ns_capable (sock_net (sk)->user_ns,CAP_NET_ADMIN )) { +if (!may_report_filterinfo) {nla_reserve (skb, attrtype,0 );return 0 ; }
net/packet/diag.c +6 -1
@@ -128,6 +128,7 @@ static int pdiag_put_fanout(struct packestatic int sk_diag_fill (struct sock *sk,struct sk_buff *skb,struct packet_diag_req *req, +bool may_report_filterinfo,struct user_namespace *user_ns,u32 portid,u32 seq,u32 flags,int sk_ino) {
@@ -172,7 +173,8 @@ static int sk_diag_fill(struct sock *sk, goto out_nlmsg_trim;if ((req->pdiag_show &PACKET_SHOW_FILTER ) && -sock_diag_put_filterinfo (sk, skb,PACKET_DIAG_FILTER )) +sock_diag_put_filterinfo (may_report_filterinfo, sk, skb, +PACKET_DIAG_FILTER )) goto out_nlmsg_trim;return nlmsg_end (skb, nlh);
@@ -188,9 +190,11 @@ static int packet_diag_dump(struct sk_bustruct packet_diag_req *req;struct net *net;struct sock *sk; +bool may_report_filterinfo; net =sock_net (skb->sk); req =nlmsg_data (cb->nlh); + may_report_filterinfo =ns_capable (net->user_ns,CAP_NET_ADMIN );mutex_lock (&net->packet.sklist_lock);sk_for_each (sk, &net->packet.sklist) {
@@ -200,6 +204,7 @@ static int packet_diag_dump(struct sk_bu goto next; if (sk_diag_fill(sk, skb, req, + may_report_filterinfo, sk_user_ns(NETLINK_CB(cb->skb).sk), NETLINK_CB(cb->skb).portid, cb->nlh->nlmsg_seq, NLM_F_MULTI,
Greg Kroah-Hartman
maintainerPATCH 9/68 net: Add variants of capable for use on on sockets
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Eric W. Biederman" <[email protected]>
[ Upstream commit a3b299da869d6e78cf42ae0b1b41797bcb8c5e4b ]
sk_net_capable - The common case, operations that are safe in a network namespace. sk_capable - Operations that are not known to be safe in a network namespace sk_ns_capable - The general case for special cases.
--- include/net/sock.h | 5 +++++ net/core/sock.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+)
include/net/sock.h +5 -0
@@ -2278,6 +2278,11 @@ int sock_get_timestampns(struct sock *,int sock_recv_errqueue (struct sock *sk,struct msghdr *msg,int len,int level,int type); +bool sk_ns_capable (const struct sock *sk, +struct user_namespace *user_ns,int cap); +bool sk_capable (const struct sock *sk,int cap); +bool sk_net_capable (const struct sock *sk,int cap); +/* * Enable debug/info messages */
net/core/sock.c +49 -0
55 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 10/68 net: Add variants of capable for use on netlink messages
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Eric W. Biederman" <[email protected]>
[ Upstream commit aa4cf9452f469f16cea8c96283b641b4576d4a7b ]
netlink_net_capable - The common case use, for operations that are safe on a network namespace netlink_capable - For operations that are only known to be safe for the global root netlink_ns_capable - The general case of capable used to handle special cases
__netlink_ns_capable - Same as netlink_ns_capable except taking a netlink_skb_parms instead of
the skbuff of a netlink message.
--- include/linux/netlink.h | 7 +++++ net/netlink/af_netlink.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+)
include/linux/netlink.h +7 -0
@@ -169,4 +169,11 @@ struct netlink_tap {extern int netlink_add_tap (struct netlink_tap *nt);extern int netlink_remove_tap (struct netlink_tap *nt); +bool __netlink_ns_capable (const struct netlink_skb_parms *nsp, +struct user_namespace *ns,int cap); +bool netlink_ns_capable (const struct sk_buff *skb, +struct user_namespace *ns,int cap); +bool netlink_capable (const struct sk_buff *skb,int cap); +bool netlink_net_capable (const struct sk_buff *skb,int cap); +#endif /* __LINUX_NETLINK_H */
net/netlink/af_netlink.c +65 -0
71 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 11/68 net: Use netlink_ns_capable to verify the permisions of netlink messages
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Eric W. Biederman" <[email protected]>
[ Upstream commit 90f62cf30a78721641e08737bda787552428061e ]
It is possible by passing a netlink socket to a more privileged executable and then to fool that executable into writing to the socket data that happens to be valid netlink message to do something that privileged executable did not intend to do.
To keep this from happening replace bare capable and ns_capable calls with netlink_capable, netlink_net_calls and netlink_ns_capable calls. Which act the same as the previous calls except they verify that the opener of the socket had the desired permissions as well.
--- crypto/crypto_user.c | 2 +- drivers/connector/cn_proc.c | 2 +- drivers/scsi/scsi_netlink.c | 2 +- kernel/audit.c | 4 ++-- net/can/gw.c | 4 ++-- net/core/rtnetlink.c | 20 +++++++++++--------- net/dcb/dcbnl.c | 2 +- net/decnet/dn_dev.c | 4 ++-- net/decnet/dn_fib.c | 4 ++-- net/decnet/netfilter/dn_rtmsg.c | 2 +- net/netfilter/nfnetlink.c | 2 +- net/netlink/genetlink.c | 2 +- net/packet/diag.c | 2 +- net/phonet/pn_netlink.c | 8 ++++---- net/sched/act_api.c | 2 +- net/sched/cls_api.c | 2 +- net/sched/sch_api.c | 6 +++--- net/tipc/netlink.c | 2 +- net/xfrm/xfrm_user.c | 2 +- 19 files changed, 38 insertions(+), 36 deletions(-)
crypto/crypto_user.c +1 -1
@@ -466,7 +466,7 @@ static int crypto_user_rcv_msg(struct sk type -=CRYPTO_MSG_BASE ; link = &crypto_dispatch[type]; -if (!capable (CAP_NET_ADMIN )) +if (!netlink_capable (skb,CAP_NET_ADMIN ))return -EPERM ; if ((type == (CRYPTO_MSG_GETALG - CRYPTO_MSG_BASE) &&
drivers/connector/cn_proc.c +1 -1
@@ -369,7 +369,7 @@ static void cn_proc_mcast_ctl(struct cn_return ;/* Can only change if privileged. */ -if (!capable (CAP_NET_ADMIN )) { +if (!__netlink_ns_capable (nsp, &init_user_ns,CAP_NET_ADMIN )) { err =EPERM ; goto out; }
drivers/scsi/scsi_netlink.c +1 -1
@@ -77,7 +77,7 @@ scsi_nl_rcv_msg(struct sk_buff *skb) goto next_msg; } -if (!capable (CAP_SYS_ADMIN )) { +if (!netlink_capable (skb,CAP_SYS_ADMIN )) { err = -EPERM ; goto next_msg; }
kernel/audit.c +2 -2
@@ -639,13 +639,13 @@ static int audit_netlink_ok(struct sk_bucase AUDIT_TTY_SET :case AUDIT_TRIM :case AUDIT_MAKE_EQUIV : -if (!capable (CAP_AUDIT_CONTROL )) +if (!netlink_capable (skb,CAP_AUDIT_CONTROL )) err = -EPERM ;break ;case AUDIT_USER : case AUDIT_FIRST_USER_MSG ... AUDIT_LAST_USER_MSG: case AUDIT_FIRST_USER_MSG2 ... AUDIT_LAST_USER_MSG2: -if (!capable (CAP_AUDIT_WRITE )) +if (!netlink_capable (skb,CAP_AUDIT_WRITE )) err = -EPERM ;break ;default :/* bad msg */
net/can/gw.c +2 -2
@@ -804,7 +804,7 @@ static int cgw_create_job(struct sk_buffu8 limhops =0 ;int err =0 ; -if (!capable (CAP_NET_ADMIN )) +if (!netlink_capable (skb,CAP_NET_ADMIN ))return -EPERM ;if (nlmsg_len (nlh) <sizeof (*r))
@@ -893,7 +893,7 @@ static int cgw_remove_job(struct sk_buffu8 limhops =0 ;int err =0 ; -if (!capable (CAP_NET_ADMIN )) +if (!netlink_capable (skb,CAP_NET_ADMIN ))return -EPERM ;if (nlmsg_len (nlh) <sizeof (*r))
net/core/rtnetlink.c +11 -9
@@ -1428,7 +1428,8 @@ static int do_set_master(struct net_devireturn 0 ; } -static int do_setlink (struct net_device *dev,struct ifinfomsg *ifm, +static int do_setlink (const struct sk_buff *skb, +struct net_device *dev,struct ifinfomsg *ifm,struct nlattr **tb,char *ifname,int modified) {const struct net_device_ops *ops = dev->netdev_ops;
@@ -1440,7 +1441,7 @@ static int do_setlink(struct net_device err =PTR_ERR (net); goto errout; } -if (!ns_capable (net->user_ns,CAP_NET_ADMIN )) { +if (!netlink_ns_capable (skb, net->user_ns,CAP_NET_ADMIN )) { err = -EPERM ; goto errout; }
@@ -1694,7 +1695,7 @@ static int rtnl_setlink(struct sk_buff *if (err <0 ) goto errout; - err =do_setlink (dev, ifm, tb, ifname,0 ); + err =do_setlink (skb, dev, ifm, tb, ifname,0 ); errout:return err; }
@@ -1811,7 +1812,8 @@ err: }EXPORT_SYMBOL (rtnl_create_link); -static int rtnl_group_changelink (struct net *net,int group, +static int rtnl_group_changelink (const struct sk_buff *skb, +struct net *net,int group,struct ifinfomsg *ifm,struct nlattr **tb) {
@@ -1820,7 +1822,7 @@ static int rtnl_group_changelink(structfor_each_netdev (net, dev) {if (dev->group == group) { - err =do_setlink (dev, ifm, tb,NULL ,0 ); + err =do_setlink (skb, dev, ifm, tb,NULL ,0 );if (err <0 )return err; }
@@ -1962,12 +1964,12 @@ replay: modified =1 ; } -return do_setlink (dev, ifm, tb, ifname, modified); +return do_setlink (skb, dev, ifm, tb, ifname, modified); }if (!(nlh->nlmsg_flags &NLM_F_CREATE )) {if (ifm->ifi_index ==0 && tb[IFLA_GROUP ]) -return rtnl_group_changelink (net, +return rtnl_group_changelink (skb, net,nla_get_u32 (tb[IFLA_GROUP ]), ifm, tb);return -ENODEV ;
@@ -2354,7 +2356,7 @@ static int rtnl_fdb_del(struct sk_buff *int err = -EINVAL ;__u8 *addr; -if (!capable (CAP_NET_ADMIN )) +if (!netlink_capable (skb,CAP_NET_ADMIN ))return -EPERM ; err =nlmsg_parse (nlh,sizeof (*ndm), tb,NDA_MAX ,NULL );
@@ -2806,7 +2808,7 @@ static int rtnetlink_rcv_msg(struct sk_b sz_idx = type>>2 ; kind = type&3 ; -if (kind !=2 && !ns_capable (net->user_ns,CAP_NET_ADMIN )) +if (kind !=2 && !netlink_net_capable (skb,CAP_NET_ADMIN ))return -EPERM ;if (kind ==2 && nlh->nlmsg_flags&NLM_F_DUMP ) {
net/dcb/dcbnl.c +1 -1
@@ -1669,7 +1669,7 @@ static int dcb_doit(struct sk_buff *skb,struct nlmsghdr *reply_nlh =NULL ;const struct reply_func *fn; -if ((nlh->nlmsg_type ==RTM_SETDCB ) && !capable (CAP_NET_ADMIN )) +if ((nlh->nlmsg_type ==RTM_SETDCB ) && !netlink_capable (skb,CAP_NET_ADMIN ))return -EPERM ; ret = nlmsg_parse(nlh, sizeof(*dcb), tb, DCB_ATTR_MAX,
net/decnet/dn_dev.c +2 -2
@@ -574,7 +574,7 @@ static int dn_nl_deladdr(struct sk_buffstruct dn_ifaddr __rcu **ifap;int err = -EINVAL ; -if (!capable (CAP_NET_ADMIN )) +if (!netlink_capable (skb,CAP_NET_ADMIN ))return -EPERM ;if (!net_eq (net, &init_net))
@@ -618,7 +618,7 @@ static int dn_nl_newaddr(struct sk_buffstruct dn_ifaddr *ifa;int err; -if (!capable (CAP_NET_ADMIN )) +if (!netlink_capable (skb,CAP_NET_ADMIN ))return -EPERM ;if (!net_eq (net, &init_net))
net/decnet/dn_fib.c +2 -2
@@ -505,7 +505,7 @@ static int dn_fib_rtm_delroute(struct skstruct nlattr *attrs[RTA_MAX +1 ];int err; -if (!capable (CAP_NET_ADMIN )) +if (!netlink_capable (skb,CAP_NET_ADMIN ))return -EPERM ;if (!net_eq (net, &init_net))
@@ -530,7 +530,7 @@ static int dn_fib_rtm_newroute(struct skstruct nlattr *attrs[RTA_MAX +1 ];int err; -if (!capable (CAP_NET_ADMIN )) +if (!netlink_capable (skb,CAP_NET_ADMIN ))return -EPERM ;if (!net_eq (net, &init_net))
net/decnet/netfilter/dn_rtmsg.c +1 -1
@@ -107,7 +107,7 @@ static inline void dnrmg_receive_user_skif (nlh->nlmsg_len <sizeof (*nlh) || skb->len < nlh->nlmsg_len)return ; -if (!capable (CAP_NET_ADMIN )) +if (!netlink_capable (skb,CAP_NET_ADMIN ))RCV_SKB_FAIL (-EPERM );/* Eventually we might send routing messages too */
net/netfilter/nfnetlink.c +1 -1
@@ -367,7 +367,7 @@ static void nfnetlink_rcv(struct sk_buff skb->len < nlh->nlmsg_len)return ; -if (!ns_capable (net->user_ns,CAP_NET_ADMIN )) { +if (!netlink_net_capable (skb,CAP_NET_ADMIN )) {netlink_ack (skb, nlh, -EPERM );return ; }
net/netlink/genetlink.c +1 -1
@@ -561,7 +561,7 @@ static int genl_family_rcv_msg(struct gereturn -EOPNOTSUPP ;if ((ops->flags &GENL_ADMIN_PERM ) && - !capable (CAP_NET_ADMIN )) + !netlink_capable (skb,CAP_NET_ADMIN ))return -EPERM ;if ((nlh->nlmsg_flags &NLM_F_DUMP ) ==NLM_F_DUMP ) {
net/packet/diag.c +1 -1
@@ -194,7 +194,7 @@ static int packet_diag_dump(struct sk_bu net =sock_net (skb->sk); req =nlmsg_data (cb->nlh); - may_report_filterinfo =ns_capable (net->user_ns,CAP_NET_ADMIN ); + may_report_filterinfo =netlink_net_capable (cb->skb,CAP_NET_ADMIN );mutex_lock (&net->packet.sklist_lock);sk_for_each (sk, &net->packet.sklist) {
net/phonet/pn_netlink.c +4 -4
@@ -70,10 +70,10 @@ static int addr_doit(struct sk_buff *skbint err;u8 pnaddr; -if (!capable (CAP_NET_ADMIN )) +if (!netlink_capable (skb,CAP_NET_ADMIN ))return -EPERM ; -if (!capable (CAP_SYS_ADMIN )) +if (!netlink_capable (skb,CAP_SYS_ADMIN ))return -EPERM ;ASSERT_RTNL ();
@@ -233,10 +233,10 @@ static int route_doit(struct sk_buff *skint err;u8 dst; -if (!capable (CAP_NET_ADMIN )) +if (!netlink_capable (skb,CAP_NET_ADMIN ))return -EPERM ; -if (!capable (CAP_SYS_ADMIN )) +if (!netlink_capable (skb,CAP_SYS_ADMIN ))return -EPERM ;ASSERT_RTNL ();
net/sched/act_api.c +1 -1
@@ -908,7 +908,7 @@ static int tc_ctl_action(struct sk_buffu32 portid = skb ?NETLINK_CB (skb).portid :0 ;int ret =0 , ovr =0 ; -if ((n->nlmsg_type !=RTM_GETACTION ) && !capable (CAP_NET_ADMIN )) +if ((n->nlmsg_type !=RTM_GETACTION ) && !netlink_capable (skb,CAP_NET_ADMIN ))return -EPERM ; ret =nlmsg_parse (n,sizeof (struct tcamsg ), tca,TCA_ACT_MAX ,NULL );
net/sched/cls_api.c +1 -1
@@ -134,7 +134,7 @@ static int tc_ctl_tfilter(struct sk_buffint err;int tp_created =0 ; -if ((n->nlmsg_type !=RTM_GETTFILTER ) && !capable (CAP_NET_ADMIN )) +if ((n->nlmsg_type !=RTM_GETTFILTER ) && !netlink_capable (skb,CAP_NET_ADMIN ))return -EPERM ; replay:
net/sched/sch_api.c +3 -3
@@ -1084,7 +1084,7 @@ static int tc_get_qdisc(struct sk_buff *struct Qdisc *p =NULL ;int err; -if ((n->nlmsg_type !=RTM_GETQDISC ) && !capable (CAP_NET_ADMIN )) +if ((n->nlmsg_type !=RTM_GETQDISC ) && !netlink_capable (skb,CAP_NET_ADMIN ))return -EPERM ; err =nlmsg_parse (n,sizeof (*tcm), tca,TCA_MAX ,NULL );
@@ -1151,7 +1151,7 @@ static int tc_modify_qdisc(struct sk_bufstruct Qdisc *q, *p;int err; -if (!capable (CAP_NET_ADMIN )) +if (!netlink_capable (skb,CAP_NET_ADMIN ))return -EPERM ; replay:
@@ -1491,7 +1491,7 @@ static int tc_ctl_tclass(struct sk_buffu32 qid;int err; -if ((n->nlmsg_type !=RTM_GETTCLASS ) && !capable (CAP_NET_ADMIN )) +if ((n->nlmsg_type !=RTM_GETTCLASS ) && !netlink_capable (skb,CAP_NET_ADMIN ))return -EPERM ; err =nlmsg_parse (n,sizeof (*tcm), tca,TCA_MAX ,NULL );
net/tipc/netlink.c +1 -1
@@ -47,7 +47,7 @@ static int handle_cmd(struct sk_buff *skint hdr_space =nlmsg_total_size (GENL_HDRLEN +TIPC_GENL_HDRLEN );u16 cmd; -if ((req_userhdr->cmd &0xC000 ) && (!capable (CAP_NET_ADMIN ))) +if ((req_userhdr->cmd &0xC000 ) && (!netlink_capable (skb,CAP_NET_ADMIN ))) cmd =TIPC_CMD_NOT_NET_ADMIN ;else cmd = req_userhdr->cmd;
net/xfrm/xfrm_user.c +1 -1
@@ -2350,7 +2350,7 @@ static int xfrm_user_rcv_msg(struct sk_b link = &xfrm_dispatch[type];/* All operations require privileges, even GET */ -if (!ns_capable (net->user_ns,CAP_NET_ADMIN )) +if (!netlink_net_capable (skb,CAP_NET_ADMIN ))return -EPERM ; if ((type == (XFRM_MSG_GETSA - XFRM_MSG_BASE) ||
Greg Kroah-Hartman
maintainerPATCH 12/68 netlink: Only check file credentials for implicit destinations
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Eric W. Biederman" <[email protected]>
[ Upstream commit 2d7a85f4b06e9c27ff629f07a524c48074f07f81 ]
It was possible to get a setuid root or setcap executable to write to it's stdout or stderr (which has been set made a netlink socket) and inadvertently reconfigure the networking stack.
To prevent this we check that both the creator of the socket and the currentl applications has permission to reconfigure the network stack.
Unfortunately this breaks Zebra which always uses sendto/sendmsg and creates it's socket without any privileges.
To keep Zebra working don't bother checking if the creator of the socket has privilege when a destination address is specified. Instead rely exclusively on the privileges of the sender of the socket.
Note from Andy: This is exactly Eric's code except for some comment clarifications and formatting fixes. Neither I nor, I think, anyone else is thrilled with this approach, but I'm hesitant to wait on a better fix since 3.15 is almost here.
Note to stable maintainers: This is a mess. An earlier series of patches in 3.15 fix a rather serious security issue (CVE-2014-0181), but they did so in a way that breaks Zebra. The offending series includes:
commit aa4cf9452f469f16cea8c96283b641b4576d4a7b
Author: Eric W. Biederman <[email protected]>
Date: Wed Apr 23 14:28:03 2014 -0700
net: Add variants of capable for use on netlink messages
If a given kernel version is missing that series of fixes, it's probably worth backporting it and this patch. if that series is present, then this fix is critical if you care about Zebra.
--- include/linux/netlink.h | 7 ++++--- net/netlink/af_netlink.c | 7 ++++++- 2 files changed, 10 insertions(+), 4 deletions(-)
include/linux/netlink.h +4 -3
@@ -16,9 +16,10 @@ static inline struct nlmsghdr *nlmsg_hdr }enum netlink_skb_flags { -NETLINK_SKB_MMAPED =0x1 ,/* Packet data is mmaped */ -NETLINK_SKB_TX =0x2 ,/* Packet was sent by userspace */ -NETLINK_SKB_DELIVERED =0x4 ,/* Packet was delivered */ +NETLINK_SKB_MMAPED =0x1 ,/* Packet data is mmaped */ +NETLINK_SKB_TX =0x2 ,/* Packet was sent by userspace */ +NETLINK_SKB_DELIVERED =0x4 ,/* Packet was delivered */ +NETLINK_SKB_DST =0x8 ,/* Dst set in sendto or sendmsg */ };struct netlink_skb_parms {
net/netlink/af_netlink.c +6 -1
@@ -1373,7 +1373,9 @@ retry:bool __netlink_ns_capable (const struct netlink_skb_parms *nsp,struct user_namespace *user_ns,int cap) { -return sk_ns_capable (nsp->sk, user_ns, cap); +return ((nsp->flags &NETLINK_SKB_DST ) || +file_ns_capable (nsp->sk->sk_socket->file, user_ns, cap)) && +ns_capable (user_ns, cap); }EXPORT_SYMBOL (__netlink_ns_capable);
@@ -2293,6 +2295,7 @@ static int netlink_sendmsg(struct kiocbstruct sk_buff *skb;int err;struct scm_cookie scm; +u32 netlink_skb_flags =0 ;if (msg->msg_flags&MSG_OOB )return -EOPNOTSUPP ;
@@ -2314,6 +2317,7 @@ static int netlink_sendmsg(struct kiocbif ((dst_group || dst_portid) && !netlink_allowed (sock,NL_CFG_F_NONROOT_SEND )) goto out; + netlink_skb_flags |=NETLINK_SKB_DST ; }else { dst_portid = nlk->dst_portid; dst_group = nlk->dst_group;
@@ -2343,6 +2347,7 @@ static int netlink_sendmsg(struct kiocbNETLINK_CB (skb).portid = nlk->portid;NETLINK_CB (skb).dst_group = dst_group;NETLINK_CB (skb).creds = siocb->scm->creds; +NETLINK_CB (skb).flags = netlink_skb_flags; err = -EFAULT ;if (memcpy_fromiovec (skb_put (skb, len), msg->msg_iov, len)) {
Greg Kroah-Hartman
maintainerPATCH 13/68 qlcnic: info leak in qlcnic_dcb_peer_app_info()
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit 7df566bbdd0af0785542b89466a937e94257fcfb ]
This function is called from dcbnl_build_peer_app(). The "info" struct isn't initialized at all so we disclose 2 bytes of uninitialized stack data. We should clear it before passing it to the user.
--- drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/qlogic/qlcnic/qlcnic_dcb.c +1 -0
@@ -1022,6 +1022,7 @@ static int qlcnic_dcb_peer_app_info(strustruct qlcnic_dcb_cee *peer;int i; +memset (info,0 ,sizeof (*info)); *app_count =0 ;if (!test_bit (QLCNIC_DCB_STATE , &adapter->dcb->state))
Greg Kroah-Hartman
maintainerPATCH 14/68 ipv6: Fix regression caused by efe4208 in udp_v6_mcast_next()
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sven Wegener <[email protected]>
[ Upstream commit 3bfdc59a6c24608ed23e903f670aaf5f58c7a6f3 ]
Commit efe4208 ("ipv6: make lookups simpler and faster") introduced a regression in udp_v6_mcast_next(), resulting in multicast packets not reaching the destination sockets under certain conditions.
The packet's IPv6 addresses are wrongly compared to the IPv6 addresses from the function's socket argument, which indicates the starting point for looping, instead of the loop variable. If the addresses from the first socket do not match the packet's addresses, no socket in the list will match.
--- net/ipv6/udp.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
net/ipv6/udp.c +4 -4
@@ -716,15 +716,15 @@ static struct sock *udp_v6_mcast_next(stif (inet->inet_dport != rmt_port)continue ; } -if (!ipv6_addr_any (&sk->sk_v6_daddr) && - !ipv6_addr_equal (&sk->sk_v6_daddr, rmt_addr)) +if (!ipv6_addr_any (&s->sk_v6_daddr) && + !ipv6_addr_equal (&s->sk_v6_daddr, rmt_addr))continue ;if (s->sk_bound_dev_if && s->sk_bound_dev_if != dif)continue ; -if (!ipv6_addr_any (&sk->sk_v6_rcv_saddr)) { -if (!ipv6_addr_equal (&sk->sk_v6_rcv_saddr, loc_addr)) +if (!ipv6_addr_any (&s->sk_v6_rcv_saddr)) { +if (!ipv6_addr_equal (&s->sk_v6_rcv_saddr, loc_addr))continue ; }if (!inet6_mc_check (s, loc_addr, rmt_addr))
Greg Kroah-Hartman
maintainerPATCH 15/68 netlink: rate-limit leftover bytes warning and print process name
In reply to Greg Kroah-Hartman3.14-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 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
lib/nlattr.c +2 -2
@@ -201,8 +201,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 16/68 bridge: Prevent insertion of FDB entry with disallowed vlan
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Toshiaki Makita <[email protected]>
[ Upstream commit e0d7968ab6c8bce2437b36fa7f04117e333f196d ]
br_handle_local_finish() is allowing us to insert an FDB entry with disallowed vlan. For example, when port 1 and 2 are communicating in vlan 10, and even if vlan 10 is disallowed on port 3, port 3 can interfere with their communication by spoofed src mac address with vlan id 10.
Note: Even if it is judged that a frame should not be learned, it should not be dropped because it is destined for not forwarding layer but higher layer. See IEEE 802.1Q-2011 8.13.10.
--- net/bridge/br_input.c | 4 ++-- net/bridge/br_private.h | 7 +++++++ net/bridge/br_vlan.c | 28 ++++++++++++++++++++++++++++ 3 files changed, 37 insertions(+), 2 deletions(-)
net/bridge/br_input.c +2 -2
@@ -147,8 +147,8 @@ static int br_handle_local_finish(structstruct net_bridge_port *p =br_port_get_rcu (skb->dev);u16 vid =0 ; -br_vlan_get_tag (skb, &vid); -if (p->flags &BR_LEARNING ) +/* check if vlan is allowed, to avoid spoofing */ +if (p->flags &BR_LEARNING &&br_should_learn (p, skb, &vid))br_fdb_update (p->br, p,eth_hdr (skb)->h_source, vid, false);return 0 ;/* process further */ }
net/bridge/br_private.h +7 -0
@@ -581,6 +581,7 @@ bool br_allowed_ingress(struct net_bridg struct sk_buff *skb, u16 *vid);bool br_allowed_egress (struct net_bridge *br,const struct net_port_vlans *v,const struct sk_buff *skb); +bool br_should_learn (struct net_bridge_port *p,struct sk_buff *skb,u16 *vid);struct sk_buff *br_handle_vlan (struct net_bridge *br,const struct net_port_vlans *v,struct sk_buff *skb);
@@ -647,6 +648,12 @@ static inline bool br_allowed_egress(str {return true; } + +static inline bool br_should_learn (struct net_bridge_port *p, +struct sk_buff *skb,u16 *vid) +{ +return true; +} static inline struct sk_buff *br_handle_vlan(struct net_bridge *br, const struct net_port_vlans *v,
net/bridge/br_vlan.c +28 -0
@@ -241,6 +241,34 @@ bool br_allowed_egress(struct net_bridgereturn false; } +/* Called under RCU */ +bool br_should_learn (struct net_bridge_port *p,struct sk_buff *skb,u16 *vid) +{ +struct net_bridge *br = p->br; +struct net_port_vlans *v; + +if (!br->vlan_enabled) +return true; + + v =rcu_dereference (p->vlan_info); +if (!v) +return false; + +br_vlan_get_tag (skb, vid); +if (!*vid) { + *vid =br_get_pvid (v); +if (*vid ==VLAN_N_VID ) +return false; + +return true; + } + +if (test_bit (*vid, v->vlan_bitmap)) +return true; + +return false; +} +/* Must be protected by RTNL. * Must be called with vid in range from 1 to 4094 inclusive. */
Greg Kroah-Hartman
maintainerPATCH 17/68 net: tunnels - enable module autoloading
In reply to Greg Kroah-Hartman3.14-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
@@ -486,4 +486,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
@@ -61,6 +61,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
@@ -1850,4 +1850,5 @@ xfrm_tunnel_failed:module_init (sit_init);module_exit (sit_cleanup);MODULE_LICENSE ("GPL" ); +MODULE_ALIAS_RTNL_LINK ("sit" );MODULE_ALIAS_NETDEV ("sit0" );
Greg Kroah-Hartman
maintainerPATCH 18/68 net: fix inet_getid() and ipv6_select_ident() bugs
In reply to Greg Kroah-Hartman3.14-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/output_core.c | 11 +++-------- 2 files changed, 4 insertions(+), 16 deletions(-)
include/net/inetpeer.h +1 -8
@@ -177,16 +177,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/output_core.c +3 -8
@@ -10,7 +10,7 @@void ipv6_select_ident (struct frag_hdr *fhdr,struct rt6_info *rt) {static atomic_t ipv6_fragmentation_id; -int old, new; +int ident;#if IS_ENABLED (CONFIG_IPV6 )if (rt && !(rt->dst.flags &DST_NOPEER )) {
@@ -26,13 +26,8 @@ void ipv6_select_ident(struct frag_hdr * } }#endif -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); }EXPORT_SYMBOL (ipv6_select_ident);
Greg Kroah-Hartman
maintainerPATCH 19/68 team: fix mtu setting
In reply to Greg Kroah-Hartman3.14-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
@@ -1732,6 +1732,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) {
@@ -1740,6 +1741,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;
@@ -1749,6 +1751,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;
@@ -2857,7 +2860,9 @@ static int team_device_event(struct notibreak ;case NETDEV_PRECHANGEMTU :/* 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
@@ -194,6 +194,7 @@ struct team {bool user_carrier_enabled;bool queue_override_enabled;struct list_head *qom_lists;/* array of queue override mapping lists */ +bool port_mtu_change_allowed;struct {unsigned int count;unsigned int interval;/* in ms */
Greg Kroah-Hartman
maintainerPATCH 20/68 tcp: fix cwnd undo on DSACK in F-RTO
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuchung Cheng <[email protected]>
[ Upstream commit 0cfa5c07d6d1d7f8e710fc671c5ba1ce85e09fa4 ]
This bug is discovered by an recent F-RTO issue on tcpm list
https://www.ietf.org/mail-archive/web/tcpm/current/msg08794.html
The bug is that currently F-RTO does not use DSACK to undo cwnd in certain cases: upon receiving an ACK after the RTO retransmission in F-RTO, and the ACK has DSACK indicating the retransmission is spurious, the sender only calls tcp_try_undo_loss() if some never retransmisted data is sacked (FLAG_ORIG_DATA_SACKED).
The correct behavior is to unconditionally call tcp_try_undo_loss so the DSACK information is used properly to undo the cwnd reduction.
--- net/ipv4/tcp_input.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
net/ipv4/tcp_input.c +5 -6
@@ -2683,13 +2683,12 @@ static void tcp_process_loss(struct sockbool recovered = !before (tp->snd_una, tp->high_seq);if (tp->frto) {/* F-RTO RFC5682 sec 3.1 (sack enhanced version). */ -if (flag &FLAG_ORIG_SACK_ACKED ) { -/* Step 3.b. A timeout is spurious if not all data are -* lost, i.e., never-retransmitted data are (s)acked. -*/ -tcp_try_undo_loss (sk, true); +/* Step 3.b. A timeout is spurious if not all data are +* lost, i.e., never-retransmitted data are (s)acked. +*/ +if (tcp_try_undo_loss (sk, flag &FLAG_ORIG_SACK_ACKED ))return ; - } +if (after (tp->snd_nxt, tp->high_seq) && (flag &FLAG_DATA_SACKED || is_dupack)) { tp->frto =0 ;/* Loss was real: 2nd part of step 3.a */
Greg Kroah-Hartman
maintainerPATCH 21/68 sh_eth: use RNC mode for packet reception
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Dooks <[email protected]>
[ Upstream commit 530aa2d0d9d55ab2775d47621ddf4b5b15bc1110 ]
The current behaviour of the sh_eth driver is not to use the RNC bit for the receive ring. This means that every packet recieved is not only generating an IRQ but it also stops the receive ring DMA as well until the driver re-enables it after unloading the packet.
This means that a number of the following errors are generated due to the receive packet FIFO overflowing due to nowhere to put packets:
net eth0: Receive FIFO Overflow
Since feedback from Yoshihiro Shimoda shows that every supported LSI for this driver should have the bit enabled it seems the best way is to remove the RMCR default value from the per-system data and just write it when initialising the RMCR value. This is discussed in the message (http://www.spinics.net/lists/netdev/msg284912.html).
I have tested the RMCR_RNC configuration with NFS root filesystem and the driver has not failed yet. There are further test reports from Sergei Shtylov and others for both the R8A7790 and R8A7791.
There is also feedback fron Cao Minh Hiep[1] which reports the same issue in (http://comments.gmane.org/gmane.linux.network/316285)
showing this fixes issues with losing UDP datagrams under iperf.
--- drivers/net/ethernet/renesas/sh_eth.c | 11 ++--------- drivers/net/ethernet/renesas/sh_eth.h | 2 -- 2 files changed, 2 insertions(+), 11 deletions(-)
drivers/net/ethernet/renesas/sh_eth.c +2 -9
@@ -539,7 +539,6 @@ static struct sh_eth_cpu_data sh7757_dat .register_type = SH_ETH_REG_FAST_SH4, .eesipr_value = DMAC_M_RFRMER | DMAC_M_ECI | 0x003fffff, - .rmcr_value = RMCR_RNC, .tx_check = EESR_FTC | EESR_CND | EESR_DLC | EESR_CD | EESR_RTO, .eesr_err_check = EESR_TWB | EESR_TABT | EESR_RABT | EESR_RFE |
@@ -617,7 +616,6 @@ static struct sh_eth_cpu_data sh7757_datEESR_RFE |EESR_RDE |EESR_RFRMER |EESR_TFE | EESR_TDE | EESR_ECI, .fdr_value = 0x0000072f, - .rmcr_value = RMCR_RNC, .irq_flags = IRQF_SHARED, .apr = 1,
@@ -745,7 +743,6 @@ static struct sh_eth_cpu_data r8a7740_daEESR_RFE |EESR_RDE |EESR_RFRMER |EESR_TFE | EESR_TDE | EESR_ECI, .fdr_value = 0x0000070f, - .rmcr_value = RMCR_RNC, .apr = 1, .mpr = 1,
@@ -777,7 +774,6 @@ static struct sh_eth_cpu_data r7s72100_dEESR_RFE |EESR_RDE |EESR_RFRMER |EESR_TFE | EESR_TDE | EESR_ECI, .fdr_value = 0x0000070f, - .rmcr_value = RMCR_RNC, .no_psr = 1, .apr = 1,
@@ -826,9 +822,6 @@ static void sh_eth_set_default_cpu_data(if (!cd->fdr_value) cd->fdr_value =DEFAULT_FDR_INIT ; -if (!cd->rmcr_value) - cd->rmcr_value =DEFAULT_RMCR_VALUE ; -if (!cd->tx_check) cd->tx_check =DEFAULT_TX_CHECK ;
@@ -1281,8 +1274,8 @@ static int sh_eth_dev_init(struct net_desh_eth_write (ndev, mdp->cd->fdr_value,FDR );sh_eth_write (ndev,0 ,TFTR ); -/* Frame recv control */ -sh_eth_write (ndev, mdp->cd->rmcr_value,RMCR ); +/* Frame recv control (enable multiple-packets per rx irq) */ +sh_eth_write (ndev,RMCR_RNC ,RMCR );sh_eth_write (ndev,DESC_I_RINT8 |DESC_I_RINT5 |DESC_I_TINT2 ,TRSCER );
drivers/net/ethernet/renesas/sh_eth.h +0 -2
@@ -320,7 +320,6 @@ enum TD_STS_BIT {enum RMCR_BIT {RMCR_RNC =0x00000001 , }; -#define DEFAULT_RMCR_VALUE 0x00000000/* ECMR */ enum FELIC_MODE_BIT {
@@ -467,7 +466,6 @@ struct sh_eth_cpu_data {unsigned long fdr_value;unsigned long fcftr_value;unsigned long rpadir_value; -unsigned long rmcr_value;/* interrupt checking mask */ unsigned long tx_check;
Greg Kroah-Hartman
maintainerPATCH 22/68 sh_eth: fix SH7619/771x support
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sergei Shtylyov <[email protected]>
[ Upstream commit d8b0426af5b67973585712c9af36b86f6ea97815 ]
Commit 4a55530f38e4 (net: sh_eth: modify the definitions of register) managed to leave out the E-DMAC register entries in sh_eth_offset_fast_sh3_sh2[], thus totally breaking SH7619/771x support. Add the missing entries using the data from before that commit.
--- drivers/net/ethernet/renesas/sh_eth.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
drivers/net/ethernet/renesas/sh_eth.c +21 -0
@@ -301,6 +301,27 @@ static const u16 sh_eth_offset_fast_sh4[ };static const u16 sh_eth_offset_fast_sh3_sh2[SH_ETH_MAX_REGISTER_OFFSET ] = { + [EDMR ] =0x0000 , + [EDTRR ] =0x0004 , + [EDRRR ] =0x0008 , + [TDLAR ] =0x000c , + [RDLAR ] =0x0010 , + [EESR ] =0x0014 , + [EESIPR ] =0x0018 , + [TRSCER ] =0x001c , + [RMFCR ] =0x0020 , + [TFTR ] =0x0024 , + [FDR ] =0x0028 , + [RMCR ] =0x002c , + [EDOCR ] =0x0030 , + [FCFTR ] =0x0034 , + [RPADIR ] =0x0038 , + [TRIMD ] =0x003c , + [RBWAR ] =0x0040 , + [RDFAR ] =0x0044 , + [TBRAR ] =0x004c , + [TDFAR ] =0x0050 , + [ECMR ] =0x0160 , [ECSR ] =0x0164 , [ECSIPR ] =0x0168 ,
Greg Kroah-Hartman
maintainerPATCH 23/68 net: filter: fix typo in sparc BPF JIT
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexei Starovoitov <[email protected]>
[ Upstream commit 569810d1e3278907264f5b115281fca3f0038d53 ]
fix typo in sparc codegen for SKF_AD_IFINDEX and SKF_AD_HATYPE classic BPF extensions
--- arch/sparc/net/bpf_jit_comp.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
arch/sparc/net/bpf_jit_comp.c +4 -4
@@ -83,9 +83,9 @@ static void bpf_flush_icache(void *start#define BNE (F2(0, 2) | CONDNE)#ifdef CONFIG_SPARC64 -#define BNE_PTR (F2(0, 1) | CONDNE | (2 << 20)) +#define BE_PTR (F2(0, 1) | CONDE | (2 << 20))#else -#define BNE_PTR BNE +#define BE_PTR BNE#endif #define SETHI (K ,REG ) \
@@ -600,7 +600,7 @@ void bpf_jit_compile(struct sk_filter *fcase BPF_S_ANC_IFINDEX :emit_skb_loadptr (dev, r_A);emit_cmpi (r_A,0 ); -emit_branch (BNE_PTR , cleanup_addr +4 ); +emit_branch (BE_PTR , cleanup_addr +4 );emit_nop (); emit_load32(r_A, struct net_device, ifindex, r_A);break ;
@@ -613,7 +613,7 @@ void bpf_jit_compile(struct sk_filter *fcase BPF_S_ANC_HATYPE :emit_skb_loadptr (dev, r_A);emit_cmpi (r_A,0 ); -emit_branch (BNE_PTR , cleanup_addr +4 ); +emit_branch (BE_PTR , cleanup_addr +4 );emit_nop (); emit_load16(r_A, struct net_device, type, r_A);break ;
Greg Kroah-Hartman
maintainerPATCH 24/68 net: filter: fix sparc32 typo
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexei Starovoitov <[email protected]>
[ Upstream commit 588f5d629b3369aba88f52217d1c473a28fa7723 ]
--- arch/sparc/net/bpf_jit_comp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/sparc/net/bpf_jit_comp.c +1 -1
@@ -85,7 +85,7 @@ static void bpf_flush_icache(void *start#ifdef CONFIG_SPARC64 #define BE_PTR (F2(0, 1) | CONDE | (2 << 20))#else -#define BE_PTR BNE +#define BE_PTR BE#endif #define SETHI (K ,REG ) \
Greg Kroah-Hartman
maintainerPATCH 26/68 net: force a list_del() in unregister_netdevice_many()
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 87757a917b0b3c0787e0563c679762152be81312 ]
unregister_netdevice_many() API is error prone and we had too many bugs because of dangling LIST_HEAD on stacks.
See commit f87e6f47933e3e ("net: dont leave active on stack LIST_HEAD")
In fact, instead of making sure no caller leaves an active list_head, just force a list_del() in the callee. No one seems to need to access the list after unregister_netdevice_many()
--- drivers/net/macvlan.c | 1 - net/core/dev.c | 5 ++++- net/core/rtnetlink.c | 1 - net/mac80211/iface.c | 1 - 4 files changed, 4 insertions(+), 4 deletions(-)
drivers/net/macvlan.c +0 -1
@@ -1043,7 +1043,6 @@ static int macvlan_device_event(struct nlist_for_each_entry_safe (vlan, next, &port->vlans, list) vlan->dev->rtnl_link_ops->dellink (vlan->dev, &list_kill);unregister_netdevice_many (&list_kill); -list_del (&list_kill);break ;case NETDEV_PRE_TYPE_CHANGE :/* Forbid underlaying device to change its type. */
net/core/dev.c +4 -1
@@ -6548,6 +6548,9 @@ EXPORT_SYMBOL(unregister_netdevice_queue/** * unregister_netdevice_many - unregister many devices * @head: list of devices +* +* Note: As most callers use a stack allocated list_head, +* we force a list_del() to make sure stack wont be corrupted later. */ void unregister_netdevice_many (struct list_head *head) {
@@ -6557,6 +6560,7 @@ void unregister_netdevice_many(struct lirollback_registered_many (head);list_for_each_entry (dev, head, unreg_list)net_set_todo (dev); +list_del (head); } }EXPORT_SYMBOL (unregister_netdevice_many);
@@ -7012,7 +7016,6 @@ static void __net_exit default_device_ex } }unregister_netdevice_many (&dev_kill_list); -list_del (&dev_kill_list);rtnl_unlock (); }
net/core/rtnetlink.c +0 -1
@@ -1735,7 +1735,6 @@ static int rtnl_dellink(struct sk_buff * ops->dellink (dev, &list_kill);unregister_netdevice_many (&list_kill); -list_del (&list_kill);return 0 ; }
net/mac80211/iface.c +0 -1
@@ -1761,7 +1761,6 @@ void ieee80211_remove_interfaces(struct }mutex_unlock (&local->iflist_mtx);unregister_netdevice_many (&unreg_list); -list_del (&unreg_list);list_for_each_entry_safe (sdata, tmp, &wdev_list, list) {list_del (&sdata->list);
Greg Kroah-Hartman
maintainerPATCH 27/68 ipip, sit: fix ipv4_{update_pmtu,redirect} calls
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Popov <[email protected]>
[ Upstream commit 2346829e641b804ece9ac9298136b56d9567c278 ]
ipv4_{update_pmtu,redirect} were called with tunnel's ifindex (t->dev is a tunnel netdevice). It caused wrong route lookup and failure of pmtu update or redirect. We should use the same ifindex that we use in ip_route_output_* in *tunnel_xmit code. It is t->parms.link .
--- net/ipv4/ipip.c | 4 ++-- net/ipv6/sit.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
net/ipv4/ipip.c +2 -2
@@ -149,13 +149,13 @@ static int ipip_err(struct sk_buff *skb,if (type ==ICMP_DEST_UNREACH && code ==ICMP_FRAG_NEEDED ) {ipv4_update_pmtu (skb,dev_net (skb->dev), info, - t->dev->ifindex,0 ,IPPROTO_IPIP ,0 ); + t->parms.link,0 ,IPPROTO_IPIP ,0 ); err =0 ; goto out; }if (type ==ICMP_REDIRECT ) { -ipv4_redirect (skb,dev_net (skb->dev), t->dev->ifindex,0 , +ipv4_redirect (skb,dev_net (skb->dev), t->parms.link,0 ,IPPROTO_IPIP ,0 ); err =0 ; goto out;
net/ipv6/sit.c +2 -2
@@ -560,12 +560,12 @@ static int ipip6_err(struct sk_buff *skbif (type ==ICMP_DEST_UNREACH && code ==ICMP_FRAG_NEEDED ) {ipv4_update_pmtu (skb,dev_net (skb->dev), info, - t->dev->ifindex,0 ,IPPROTO_IPV6 ,0 ); + t->parms.link,0 ,IPPROTO_IPV6 ,0 ); err =0 ; goto out; }if (type ==ICMP_REDIRECT ) { -ipv4_redirect (skb,dev_net (skb->dev), t->dev->ifindex,0 , +ipv4_redirect (skb,dev_net (skb->dev), t->parms.link,0 ,IPPROTO_IPV6 ,0 ); err =0 ; goto out;
Greg Kroah-Hartman
maintainerPATCH 28/68 sfc: PIO:Restrict to 64bit arch and use 64-bit writes.
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jon Cooper <[email protected]>
[ Upstream commit daf37b556e437ec1ea1a597dcfeff338068380e1 ]
("sfc: Use TX PIO for sufficiently small packets")
The linux net driver uses memcpy_toio() in order to copy into the PIO buffers.
Even on a 64bit machine this causes 32bit accesses to a write- combined memory region.
There are hardware limitations that mean that only 64bit naturally aligned accesses are safe in all cases.
Due to being write-combined memory region two 32bit accesses may be coalesced to form a 64bit non 64bit aligned access. Solution was to open-code the memory copy routines using pointers and to only enable PIO for x86_64 machines.
Not tested on platforms other than x86_64 because this patch disables the PIO feature on other platforms. Compile-tested on x86 to ensure that works.
The WARN_ON_ONCE() code in the previous version of this patch has been moved into the internal sfc debug driver as the assertion was unnecessary in the upstream kernel code.
This bug fix applies to v3.13 and v3.14 stable branches.
--- drivers/net/ethernet/sfc/io.h | 7 +++++++ drivers/net/ethernet/sfc/tx.c | 22 +++++++++++++++++----- 2 files changed, 24 insertions(+), 5 deletions(-)
drivers/net/ethernet/sfc/io.h +7 -0
@@ -66,10 +66,17 @@#define EFX_USE_QWORD_IO 1#endif +/* Hardware issue requires that only 64-bit naturally aligned writes +* are seen by hardware. Its not strictly necessary to restrict to +* x86_64 arch, but done for safety since unusual write combining behaviour +* can break PIO. +*/ +#ifdef CONFIG_X86_64 /* PIO is a win only if write-combining is possible */ #ifdef ARCH_HAS_IOREMAP_WC #define EFX_USE_PIO 1#endif +#endif #ifdef EFX_USE_QWORD_IO static inline void _efx_writeq(struct efx_nic *efx, __le64 value,
drivers/net/ethernet/sfc/tx.c +17 -5
@@ -189,6 +189,18 @@ struct efx_short_copy_buffer {u8 buf[L1_CACHE_BYTES ]; }; +/* Copy in explicit 64-bit writes. */ +static void efx_memcpy_64 (void __iomem *dest,void *src,size_t len) +{ +u64 *src64 = src; +u64 __iomem *dest64 = dest; +size_t l64 = len /8 ; +size_t i; + +for (i =0 ; i < l64; i++) +writeq (src64[i], &dest64[i]); +} +/* Copy to PIO, respecting that writes to PIO buffers must be dword aligned. * Advances piobuf pointer. Leaves additional data in the copy buffer. */
@@ -198,7 +210,7 @@ static void efx_memcpy_toio_aligned(stru {int block_len = len & ~(sizeof (copy_buf->buf) -1 ); -memcpy_toio (*piobuf, data, block_len); +efx_memcpy_64 (*piobuf, data, block_len); *piobuf += block_len; len -= block_len;
@@ -230,7 +242,7 @@ static void efx_memcpy_toio_aligned_cb(sif (copy_buf->used <sizeof (copy_buf->buf))return ; -memcpy_toio (*piobuf, copy_buf->buf,sizeof (copy_buf->buf)); +efx_memcpy_64 (*piobuf, copy_buf->buf,sizeof (copy_buf->buf)); *piobuf +=sizeof (copy_buf->buf); data += copy_to_buf; len -= copy_to_buf;
@@ -245,7 +257,7 @@ static void efx_flush_copy_buffer(struct {/* if there's anything in it, write the whole buffer, including junk */ if (copy_buf->used) -memcpy_toio (piobuf, copy_buf->buf,sizeof (copy_buf->buf)); +efx_memcpy_64 (piobuf, copy_buf->buf,sizeof (copy_buf->buf)); }/* Traverse skb structure and copy fragments in to PIO buffer.
@@ -304,8 +316,8 @@ efx_enqueue_skb_pio(struct efx_tx_queue*/ BUILD_BUG_ON (L1_CACHE_BYTES >SKB_DATA_ALIGN (sizeof (struct skb_shared_info ))); -memcpy_toio (tx_queue->piobuf, skb->data, -ALIGN (skb->len,L1_CACHE_BYTES )); +efx_memcpy_64 (tx_queue->piobuf, skb->data, +ALIGN (skb->len,L1_CACHE_BYTES )); } EFX_POPULATE_QWORD_5(buffer->option,
Greg Kroah-Hartman
maintainerPATCH 29/68 ipv4: fix a race in ip4_datagram_release_cb()
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 9709674e68646cee5a24e3000b3558d25412203a ]
Alexey gave a AddressSanitizer[1] report that finally gave a good hint at where was the origin of various problems already reported by Dormando in the past [2]
Problem comes from the fact that UDP can have a lockless TX path, and concurrent threads can manipulate sk_dst_cache, while another thread, is holding socket lock and calls __sk_dst_set() in ip4_datagram_release_cb() (this was added in linux-3.8)
It seems that all we need to do is to use sk_dst_check() and sk_dst_set() so that all the writers hold same spinlock (sk->sk_dst_lock) to prevent corruptions.
TCP stack do not need this protection, as all sk_dst_cache writers hold the socket lock.
[1]
https://code.google.com/p/address-sanitizer/wiki/AddressSanitizerForKernel
AddressSanitizer: heap-use-after-free in ipv4_dst_check
Read of size 2 by thread T15453: [<ffffffff817daa3a>] ipv4_dst_check+0x1a/0x90 ./net/ipv4/route.c:1116 [<ffffffff8175b789>] __sk_dst_check+0x89/0xe0 ./net/core/sock.c:531 [<ffffffff81830a36>] ip4_datagram_release_cb+0x46/0x390 ??:0 [<ffffffff8175eaea>] release_sock+0x17a/0x230 ./net/core/sock.c:2413 [<ffffffff81830882>] ip4_datagram_connect+0x462/0x5d0 ??:0 [<ffffffff81846d06>] inet_dgram_connect+0x76/0xd0 ./net/ipv4/af_inet.c:534 [<ffffffff817580ac>] SYSC_connect+0x15c/0x1c0 ./net/socket.c:1701 [<ffffffff817596ce>] SyS_connect+0xe/0x10 ./net/socket.c:1682 [<ffffffff818b0a29>] system_call_fastpath+0x16/0x1b
./arch/x86/kernel/entry_64.S:629
Freed by thread T15455:
[<ffffffff8178d9b8>] dst_destroy+0xa8/0x160 ./net/core/dst.c:251 [<ffffffff8178de25>] dst_release+0x45/0x80 ./net/core/dst.c:280 [<ffffffff818304c1>] ip4_datagram_connect+0xa1/0x5d0 ??:0 [<ffffffff81846d06>] inet_dgram_connect+0x76/0xd0 ./net/ipv4/af_inet.c:534 [<ffffffff817580ac>] SYSC_connect+0x15c/0x1c0 ./net/socket.c:1701 [<ffffffff817596ce>] SyS_connect+0xe/0x10 ./net/socket.c:1682 [<ffffffff818b0a29>] system_call_fastpath+0x16/0x1b
./arch/x86/kernel/entry_64.S:629
Allocated by thread T15453:
[<ffffffff8178d291>] dst_alloc+0x81/0x2b0 ./net/core/dst.c:171 [<ffffffff817db3b7>] rt_dst_alloc+0x47/0x50 ./net/ipv4/route.c:1406 [< inlined >] __ip_route_output_key+0x3e8/0xf70 __mkroute_output ./net/ipv4/route.c:1939 [<ffffffff817dde08>] __ip_route_output_key+0x3e8/0xf70 ./net/ipv4/route.c:2161 [<ffffffff817deb34>] ip_route_output_flow+0x14/0x30 ./net/ipv4/route.c:2249 [<ffffffff81830737>] ip4_datagram_connect+0x317/0x5d0 ??:0 [<ffffffff81846d06>] inet_dgram_connect+0x76/0xd0 ./net/ipv4/af_inet.c:534 [<ffffffff817580ac>] SYSC_connect+0x15c/0x1c0 ./net/socket.c:1701 [<ffffffff817596ce>] SyS_connect+0xe/0x10 ./net/socket.c:1682 [<ffffffff818b0a29>] system_call_fastpath+0x16/0x1b
./arch/x86/kernel/entry_64.S:629
[2]
<4>[196727.311203] general protection fault: 0000 [#1] SMP <4>[196727.311224] Modules linked in: xt_TEE xt_dscp xt_DSCP macvlan bridge coretemp crc32_pclmul ghash_clmulni_intel gpio_ich microcode ipmi_watchdog ipmi_devintf sb_edac edac_core lpc_ich mfd_core tpm_tis tpm tpm_bios ipmi_si ipmi_msghandler isci igb libsas i2c_algo_bit ixgbe ptp pps_core mdio <4>[196727.311333] CPU: 17 PID: 0 Comm: swapper/17 Not tainted 3.10.26 #1 <4>[196727.311344] Hardware name: Supermicro X9DRi-LN4+/X9DR3-LN4+/X9DRi-LN4+/X9DR3-LN4+, BIOS 3.0 07/05/2013 <4>[196727.311364] task: ffff885e6f069700 ti: ffff885e6f072000 task.ti: ffff885e6f072000 <4>[196727.311377] RIP: 0010:[<ffffffff815f8c7f>] [<ffffffff815f8c7f>] ipv4_dst_destroy+0x4f/0x80 <4>[196727.311399] RSP: 0018:ffff885effd23a70 EFLAGS: 00010282 <4>[196727.311409] RAX: dead000000200200 RBX: ffff8854c398ecc0 RCX: 0000000000000040 <4>[196727.311423] RDX: dead000000100100 RSI: dead000000100100 RDI: dead000000200200 <4>[196727.311437] RBP: ffff885effd23a80 R08: ffffffff815fd9e0 R09: ffff885d5a590800 <4>[196727.311451] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000 <4>[196727.311464] R13: ffffffff81c8c280 R14: 0000000000000000 R15: ffff880e85ee16ce <4>[196727.311510] FS: 0000000000000000(0000) GS:ffff885effd20000(0000) knlGS:0000000000000000 <4>[196727.311554] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 <4>[196727.311581] CR2: 00007a46751eb000 CR3: 0000005e65688000 CR4: 00000000000407e0 <4>[196727.311625] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 <4>[196727.311669] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400 <4>[196727.311713] Stack: <4>[196727.311733] ffff8854c398ecc0 ffff8854c398ecc0 ffff885effd23ab0 ffffffff815b7f42 <4>[196727.311784] ffff88be6595bc00 ffff8854c398ecc0 0000000000000000 ffff8854c398ecc0 <4>[196727.311834] ffff885effd23ad0 ffffffff815b86c6 ffff885d5a590800 ffff8816827821c0 <4>[196727.311885] Call Trace: <4>[196727.311907] <IRQ> <4>[196727.311912] [<ffffffff815b7f42>] dst_destroy+0x32/0xe0 <4>[196727.311959] [<ffffffff815b86c6>] dst_release+0x56/0x80 <4>[196727.311986] [<ffffffff81620bd5>] tcp_v4_do_rcv+0x2a5/0x4a0 <4>[196727.312013] [<ffffffff81622b5a>] tcp_v4_rcv+0x7da/0x820 <4>[196727.312041] [<ffffffff815fd9e0>] ? ip_rcv_finish+0x360/0x360 <4>[196727.312070] [<ffffffff815de02d>] ? nf_hook_slow+0x7d/0x150 <4>[196727.312097] [<ffffffff815fd9e0>] ? ip_rcv_finish+0x360/0x360 <4>[196727.312125] [<ffffffff815fda92>] ip_local_deliver_finish+0xb2/0x230 <4>[196727.312154] [<ffffffff815fdd9a>] ip_local_deliver+0x4a/0x90 <4>[196727.312183] [<ffffffff815fd799>] ip_rcv_finish+0x119/0x360 <4>[196727.312212] [<ffffffff815fe00b>] ip_rcv+0x22b/0x340 <4>[196727.312242] [<ffffffffa0339680>] ? macvlan_broadcast+0x160/0x160 [macvlan] <4>[196727.312275] [<ffffffff815b0c62>] __netif_receive_skb_core+0x512/0x640 <4>[196727.312308] [<ffffffff811427fb>] ? kmem_cache_alloc+0x13b/0x150 <4>[196727.312338] [<ffffffff815b0db1>] __netif_receive_skb+0x21/0x70 <4>[196727.312368] [<ffffffff815b0fa1>] netif_receive_skb+0x31/0xa0 <4>[196727.312397] [<ffffffff815b1ae8>] napi_gro_receive+0xe8/0x140 <4>[196727.312433] [<ffffffffa00274f1>] ixgbe_poll+0x551/0x11f0 [ixgbe] <4>[196727.312463] [<ffffffff815fe00b>] ? ip_rcv+0x22b/0x340 <4>[196727.312491] [<ffffffff815b1691>] net_rx_action+0x111/0x210 <4>[196727.312521] [<ffffffff815b0db1>] ? __netif_receive_skb+0x21/0x70 <4>[196727.312552] [<ffffffff810519d0>] __do_softirq+0xd0/0x270 <4>[196727.312583] [<ffffffff816cef3c>] call_softirq+0x1c/0x30 <4>[196727.312613] [<ffffffff81004205>] do_softirq+0x55/0x90 <4>[196727.312640] [<ffffffff81051c85>] irq_exit+0x55/0x60 <4>[196727.312668] [<ffffffff816cf5c3>] do_IRQ+0x63/0xe0 <4>[196727.312696] [<ffffffff816c5aaa>] common_interrupt+0x6a/0x6a <4>[196727.312722] <EOI> <1>[196727.313071] RIP [<ffffffff815f8c7f>] ipv4_dst_destroy+0x4f/0x80 <4>[196727.313100] RSP <ffff885effd23a70> <4>[196727.313377] ---[ end trace 64b3f14fae0f2e29 ]--- <0>[196727.380908] Kernel panic - not syncing: Fatal exception in interrupt
--- net/ipv4/datagram.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-)
net/ipv4/datagram.c +15 -5
@@ -86,18 +86,26 @@ out: }EXPORT_SYMBOL (ip4_datagram_connect); +/* Because UDP xmit path can manipulate sk_dst_cache without holding +* socket lock, we need to use sk_dst_set() here, +* even if we own the socket lock. +*/ void ip4_datagram_release_cb (struct sock *sk) {const struct inet_sock *inet =inet_sk (sk);const struct ip_options_rcu *inet_opt;__be32 daddr = inet->inet_daddr; +struct dst_entry *dst;struct flowi4 fl4;struct rtable *rt; -if (!__sk_dst_get (sk) ||__sk_dst_check (sk,0 )) -return ; -rcu_read_lock (); + + dst =__sk_dst_get (sk); +if (!dst || !dst->obsolete || dst->ops->check (dst,0 )) { +rcu_read_unlock (); +return ; + } inet_opt =rcu_dereference (inet->inet_opt);if (inet_opt && inet_opt->opt.srr) daddr = inet_opt->opt.faddr;
@@ -105,8 +113,10 @@ void ip4_datagram_release_cb(struct sock inet->inet_saddr, inet->inet_dport, inet->inet_sport, sk->sk_protocol, RT_CONN_FLAGS(sk), sk->sk_bound_dev_if); -if (!IS_ERR (rt)) -__sk_dst_set (sk, &rt->dst); + + dst = !IS_ERR (rt) ? &rt->dst :NULL ; +sk_dst_set (sk, dst); +rcu_read_unlock (); }EXPORT_SYMBOL_GPL (ip4_datagram_release_cb);
Greg Kroah-Hartman
maintainerPATCH 30/68 sctp: Fix sk_ack_backlog wrap-around problem
In reply to Greg Kroah-Hartman3.14-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
@@ -330,7 +330,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 31/68 rtnetlink: fix userspace API breakage for iproute2 < v3.9.0
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Schmidt <[email protected]>
[ Upstream commit e5eca6d41f53db48edd8cf88a3f59d2c30227f8e ]
When running RHEL6 userspace on a current upstream kernel, "ip link" fails to show VF information.
The reason is a kernel<->userspace API change introduced by commit 88c5b5ce5cb57 ("rtnetlink: Call nlmsg_parse() with correct header length"), after which the kernel does not see iproute2's IFLA_EXT_MASK attribute in the netlink request.
iproute2 adjusted for the API change in its commit 63338dca4513 ("libnetlink: Use ifinfomsg instead of rtgenmsg in rtnl_wilddump_req_filter").
The problem has been noticed before:
http://marc.info/?l=linux-netdev&m=136692296022182&w=2
(Subject: Re: getting VF link info seems to be broken in 3.9-rc8)
We can do better than tell those with old userspace to upgrade. We can recognize the old iproute2 in the kernel by checking the netlink message length. Even when including the IFLA_EXT_MASK attribute, its netlink message is shorter than struct ifinfomsg.
With this patch "ip link" shows VF information in both old and new iproute2 versions.
--- net/core/rtnetlink.c | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-)
net/core/rtnetlink.c +18 -4
@@ -1166,6 +1166,7 @@ static int rtnl_dump_ifinfo(struct sk_bustruct nlattr *tb[IFLA_MAX +1 ];u32 ext_filter_mask =0 ;int err; +int hdrlen; s_h = cb->args[0 ]; s_idx = cb->args[1 ];
@@ -1173,8 +1174,17 @@ static int rtnl_dump_ifinfo(struct sk_burcu_read_lock (); cb->seq = net->dev_base_seq; -if (nlmsg_parse (cb->nlh,sizeof (struct ifinfomsg ), tb,IFLA_MAX , - ifla_policy) >=0 ) { +/* A hack to preserve kernel<->userspace interface. +* The correct header is ifinfomsg. It is consistent with rtnl_getlink. +* However, before Linux v3.9 the code here assumed rtgenmsg and that's +* what iproute2 < v3.9.0 used. +* We can detect the old iproute2. Even including the IFLA_EXT_MASK +* attribute, its netlink message is shorter than struct ifinfomsg. +*/ + hdrlen =nlmsg_len (cb->nlh) <sizeof (struct ifinfomsg ) ? +sizeof (struct rtgenmsg ) :sizeof (struct ifinfomsg ); + +if (nlmsg_parse (cb->nlh, hdrlen, tb,IFLA_MAX , ifla_policy) >=0 ) {if (tb[IFLA_EXT_MASK ]) ext_filter_mask =nla_get_u32 (tb[IFLA_EXT_MASK ]);
@@ -2085,9 +2095,13 @@ static u16 rtnl_calcit(struct sk_buff *sstruct nlattr *tb[IFLA_MAX +1 ];u32 ext_filter_mask =0 ;u16 min_ifinfo_dump_size =0 ; +int hdrlen; + +/* Same kernel<->userspace interface hack as in rtnl_dump_ifinfo. */ + hdrlen =nlmsg_len (nlh) <sizeof (struct ifinfomsg ) ? +sizeof (struct rtgenmsg ) :sizeof (struct ifinfomsg ); -if (nlmsg_parse (nlh,sizeof (struct ifinfomsg ), tb,IFLA_MAX , - ifla_policy) >=0 ) { +if (nlmsg_parse (nlh, hdrlen, tb,IFLA_MAX , ifla_policy) >=0 ) {if (tb[IFLA_EXT_MASK ]) ext_filter_mask =nla_get_u32 (tb[IFLA_EXT_MASK ]); }
Greg Kroah-Hartman
maintainerPATCH 32/68 vxlan: use dev->needed_headroom instead of dev->hard_header_len
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cong Wang <[email protected]>
[ Upstream commit 2853af6a2ea1a8ed09b09dd4fb578e7f435e8d34 ]
When we mirror packets from a vxlan tunnel to other device, the mirror device should see the same packets (that is, without outer header). Because vxlan tunnel sets dev->hard_header_len, tcf_mirred() resets mac header back to outer mac, the mirror device actually sees packets with outer headers
Vxlan tunnel should set dev->needed_headroom instead of dev->hard_header_len, like what other ip tunnels do. This fixes the above problem.
--- drivers/net/vxlan.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
drivers/net/vxlan.c +3 -4
@@ -2282,9 +2282,9 @@ static void vxlan_setup(struct net_deviceth_hw_addr_random (dev);ether_setup (dev);if (vxlan->default_dst.remote_ip.sa.sa_family ==AF_INET6 ) - dev->hard_header_len =ETH_HLEN +VXLAN6_HEADROOM ; + dev->needed_headroom =ETH_HLEN +VXLAN6_HEADROOM ;else - dev->hard_header_len =ETH_HLEN +VXLAN_HEADROOM ; + dev->needed_headroom =ETH_HLEN +VXLAN_HEADROOM ; dev->netdev_ops = &vxlan_netdev_ops; dev->destructor = free_netdev;
@@ -2667,8 +2667,7 @@ static int vxlan_newlink(struct net *netif (!tb[IFLA_MTU ]) dev->mtu = lowerdev->mtu - (use_ipv6 ?VXLAN6_HEADROOM :VXLAN_HEADROOM ); -/* update header length based on lower device */ - dev->hard_header_len = lowerdev->hard_header_len + + dev->needed_headroom = lowerdev->hard_header_len + (use_ipv6 ?VXLAN6_HEADROOM :VXLAN_HEADROOM ); }else if (use_ipv6) vxlan->flags |=VXLAN_F_IPV6 ;
Greg Kroah-Hartman
maintainerPATCH 33/68 udp: ipv4: do not waste time in __udp4_lib_mcast_demux_lookup
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 63c6f81cdde58c41da62a8d8a209592e42a0203e ]
Its too easy to add thousand of UDP sockets on a particular bucket, and slow down an innocent multicast receiver.
Early demux is supposed to be an optimization, we should avoid spending too much time in it.
It is interesting to note __udp4_lib_demux_lookup() only tries to match first socket in the chain.
10 is the threshold we already have in __udp4_lib_lookup() to switch to secondary hash.
--- net/ipv4/udp.c | 4 ++++ 1 file changed, 4 insertions(+)
net/ipv4/udp.c +4 -0
@@ -1833,6 +1833,10 @@ static struct sock *__udp4_lib_mcast_demunsigned int count, slot =udp_hashfn (net, hnum, udp_table.mask);struct udp_hslot *hslot = &udp_table.hash[slot]; +/* Do not bother scanning a too big list */ +if (hslot->count >10 ) +return NULL ; +rcu_read_lock (); begin: count =0 ;
Greg Kroah-Hartman
maintainerPATCH 34/68 net/mlx4_core: Preserve pci_dev_data after __mlx4_remove_one()
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Yang <[email protected]>
[ Upstream commit befdf8978accecac2e0739e6b5075afc62db37fe ]
pci_match_id() just match the static pci_device_id, which may return NULL if someone binds the driver to a device manually using /sys/bus/pci/drivers/.../new_id.
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 | 168 ++++++++++++++++-------------- drivers/net/ethernet/mellanox/mlx4/mlx4.h | 1 2 files changed, 94 insertions(+), 75 deletions(-)
drivers/net/ethernet/mellanox/mlx4/main.c +93 -75
@@ -2275,13 +2275,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) { - 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);
@@ -2465,8 +2460,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 ;
@@ -2532,84 +2526,108 @@ err_disable_pdev:static int 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; -if (mlx4_is_master (dev)) -mlx4_free_resource_tracker (dev, -RES_TR_FREE_SLAVES_ONLY ); +/* in SRIOV it is not allowed to unload the pf's +* driver while there are alive vf's */ +if (mlx4_is_master (dev) &&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); + +for (p =1 ; p <= dev->caps.num_ports; p++) { +mlx4_cleanup_port_info (&priv->port[p]); +mlx4_CLOSE_PORT (dev, p); + } -mlx4_cleanup_counters_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_mcg_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, +RES_TR_FREE_SLAVES_ONLY ); -if (mlx4_is_master (dev)) -mlx4_free_resource_tracker (dev, -RES_TR_FREE_STRUCTS_ONLY ); +mlx4_cleanup_counters_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_mcg_table (dev); +mlx4_cleanup_mr_table (dev); +mlx4_cleanup_xrcd_table (dev); +mlx4_cleanup_pd_table (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 (dev->flags &MLX4_FLAG_MSI_X ) -pci_disable_msix (pdev); -if (dev->flags &MLX4_FLAG_SRIOV ) { -mlx4_warn (dev,"Disabling SR-IOV\n" ); -pci_disable_sriov (pdev); - } +if (mlx4_is_master (dev)) +mlx4_free_resource_tracker (dev, +RES_TR_FREE_STRUCTS_ONLY ); -if (!mlx4_is_slave (dev)) -mlx4_free_ownership (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); -kfree (dev->caps.qp0_tunnel); -kfree (dev->caps.qp0_proxy); -kfree (dev->caps.qp1_tunnel); -kfree (dev->caps.qp1_proxy); - -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 (dev->flags &MLX4_FLAG_SRIOV ) { +mlx4_warn (dev,"Disabling SR-IOV\n" ); +pci_disable_sriov (pdev); } + +if (!mlx4_is_slave (dev)) +mlx4_free_ownership (dev); + +kfree (dev->caps.qp0_tunnel); +kfree (dev->caps.qp0_proxy); +kfree (dev->caps.qp1_tunnel); +kfree (dev->caps.qp1_proxy); + +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)
@@ -2619,7 +2637,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); }
@@ -2674,7 +2692,7 @@ MODULE_DEVICE_TABLE(pci, mlx4_pci_table)static pci_ers_result_t mlx4_pci_err_detected (struct pci_dev *pdev,pci_channel_state_t state) { -mlx4_remove_one (pdev); +__mlx4_remove_one (pdev);return state == pci_channel_io_perm_failure ?PCI_ERS_RESULT_DISCONNECT :PCI_ERS_RESULT_NEED_RESET ;
@@ -2682,11 +2700,11 @@ static pci_ers_result_t mlx4_pci_err_detstatic pci_ers_result_t mlx4_pci_slot_reset (struct pci_dev *pdev) { -const struct pci_device_id *id; -int ret; +struct mlx4_dev *dev =pci_get_drvdata (pdev); +struct mlx4_priv *priv =mlx4_priv (dev); +int ret; - id =pci_match_id (mlx4_pci_table, pdev); - ret =__mlx4_init_one (pdev, id->driver_data); + ret =__mlx4_init_one (pdev, priv->pci_dev_data);return ret ?PCI_ERS_RESULT_DISCONNECT :PCI_ERS_RESULT_RECOVERED ; }
drivers/net/ethernet/mellanox/mlx4/mlx4.h +1 -0
@@ -796,6 +796,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 35/68 net/mlx4_core: Keep only one driver entry release mlx4_priv
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Yang <[email protected]>
[ Upstream commit da1de8dfff09d33d4a5345762c21b487028e25f5 ]
Following commit befdf89 "net/mlx4_core: Preserve pci_dev_data after __mlx4_remove_one()", there are two mlx4 pci callbacks which will attempt to release the mlx4_priv object -- .shutdown and .remove.
This leads to a use-after-free access to the already freed mlx4_priv instance and trigger a "Kernel access of bad area" crash when both .shutdown and .remove are called.
During reboot or kexec, .shutdown is called, with the VFs probed to the host going through shutdown first and then the PF. Later, the PF will trigger VFs' .remove since VFs still have driver attached.
Fix that by keeping only one driver entry which releases mlx4_priv.
--- drivers/net/ethernet/mellanox/mlx4/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx4/main.c +1 -1
@@ -2718,7 +2718,7 @@ static struct pci_driver mlx4_driver = { .name = DRV_NAME, .id_table = mlx4_pci_table, .probe = mlx4_init_one, - .shutdown = mlx4_remove_one, + .shutdown = __mlx4_remove_one, .remove = mlx4_remove_one, .err_handler = &mlx4_err_handler, };
Greg Kroah-Hartman
maintainerPATCH 36/68 KVM: lapic: sync highest ISR to hardware apic on EOI
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Bonzini <[email protected]>
commit fc57ac2c9ca8109ea97fcc594f4be436944230cc upstream.
When Hyper-V enlightenments are in effect, Windows prefers to issue an Hyper-V MSR write to issue an EOI rather than an x2apic MSR write. The Hyper-V MSR write is not handled by the processor, and besides being slower, this also causes bugs with APIC virtualization. The reason is that on EOI the processor will modify the highest in-service interrupt (SVI) field of the VMCS, as explained in section 29.1.4 of the SDM; every other step in EOI virtualization is already done by apic_send_eoi or on VM entry, but this one is missing.
We need to do the same, and be careful not to muck with the isr_count and highest_isr_cache fields that are unused when virtual interrupt delivery is enabled.
--- arch/x86/kvm/lapic.c | 62 +++++++++++++++++++++++++++++++++++---------------- 1 file changed, 43 insertions(+), 19 deletions(-)
arch/x86/kvm/lapic.c +43 -19
@@ -360,6 +360,8 @@ static inline void apic_clear_irr(int vestatic inline void apic_set_isr (int vec,struct kvm_lapic *apic) { +/* Note that we never get here with APIC virtualization enabled. */ +if (!__apic_test_and_set_vector (vec, apic->regs +APIC_ISR )) ++apic->isr_count;BUG_ON (apic->isr_count >MAX_APIC_VECTOR );
@@ -371,12 +373,48 @@ static inline void apic_set_isr(int vec, apic->highest_isr_cache = vec; } +static inline int apic_find_highest_isr (struct kvm_lapic *apic) +{ +int result; + +/* +* Note that isr_count is always 1, and highest_isr_cache +* is always -1, with APIC virtualization enabled. +*/ +if (!apic->isr_count) +return -1 ; +if (likely (apic->highest_isr_cache !=-1 )) +return apic->highest_isr_cache; + + result =find_highest_vector (apic->regs +APIC_ISR ); +ASSERT (result ==-1 || result >=16 ); + +return result; +} +static inline void apic_clear_isr (int vec,struct kvm_lapic *apic) { -if (__apic_test_and_clear_vector (vec, apic->regs +APIC_ISR )) +struct kvm_vcpu *vcpu; +if (!__apic_test_and_clear_vector (vec, apic->regs +APIC_ISR )) +return ; + + vcpu = apic->vcpu; + +/* +* We do get here for APIC virtualization enabled if the guest +* uses the Hyper-V APIC enlightenment. In this case we may need +* to trigger a new interrupt delivery by writing the SVI field; +* on the other hand isr_count and highest_isr_cache are unused +* and must be left alone. +*/ +if (unlikely (kvm_apic_vid_enabled (vcpu->kvm))) + kvm_x86_ops->hwapic_isr_update (vcpu->kvm, +apic_find_highest_isr (apic)); +else { --apic->isr_count; -BUG_ON (apic->isr_count <0 ); - apic->highest_isr_cache =-1 ; +BUG_ON (apic->isr_count <0 ); + apic->highest_isr_cache =-1 ; + } }int kvm_lapic_find_highest_irr (struct kvm_vcpu *vcpu)
@@ -456,22 +494,6 @@ static void pv_eoi_clr_pending(struct kv__clear_bit (KVM_APIC_PV_EOI_PENDING , &vcpu->arch.apic_attention); } -static inline int apic_find_highest_isr (struct kvm_lapic *apic) -{ -int result; - -/* Note that isr_count is always 1 with vid enabled */ -if (!apic->isr_count) -return -1 ; -if (likely (apic->highest_isr_cache !=-1 )) -return apic->highest_isr_cache; - - result =find_highest_vector (apic->regs +APIC_ISR ); -ASSERT (result ==-1 || result >=16 ); - -return result; -} -void kvm_apic_update_tmr (struct kvm_vcpu *vcpu,u32 *tmr) {struct kvm_lapic *apic = vcpu->arch.apic;
@@ -1605,6 +1627,8 @@ int kvm_get_apic_interrupt(struct kvm_vcint vector =kvm_apic_has_interrupt (vcpu);struct kvm_lapic *apic = vcpu->arch.apic; +/* Note that we never get here with APIC virtualization enabled. */ +if (vector ==-1 )return -1 ;
Greg Kroah-Hartman
maintainerPATCH 37/68 ARM: at91: fix at91_sysirq_mask_rtc for sam9x5 SoCs
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Boris BREZILLON <[email protected]>
commit 9dcc87fec8947308e0111c65dcd881e6aa5b1673 upstream.
sam9x5 SoCs have the following errata:
"RTC: Interrupt Mask Register cannot be used
Interrupt Mask Register read always returns 0."
Hence we should not rely on what IMR claims about already masked IRQs and just disable all IRQs.
--- arch/arm/mach-at91/sysirq_mask.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-)
arch/arm/mach-at91/sysirq_mask.c +13 -9
@@ -25,24 +25,28 @@#include "generic.h" -#define AT91_RTC_IDR 0x24/* Interrupt Disable Register */ -#define AT91_RTC_IMR 0x28/* Interrupt Mask Register */ +#define AT91_RTC_IDR 0x24/* Interrupt Disable Register */ +#define AT91_RTC_IMR 0x28/* Interrupt Mask Register */ +#define AT91_RTC_IRQ_MASK 0x1f/* Available IRQs mask */ void __init at91_sysirq_mask_rtc (u32 rtc_base) {void __iomem *base; -u32 mask; base =ioremap (rtc_base,64 );if (!base)return ; - mask =readl_relaxed (base +AT91_RTC_IMR ); -if (mask) { -pr_info ("AT91: Disabling rtc irq\n" ); -writel_relaxed (mask, base +AT91_RTC_IDR ); - (void )readl_relaxed (base +AT91_RTC_IMR );/* flush */ - } +/* +* sam9x5 SoCs have the following errata: +* "RTC: Interrupt Mask Register cannot be used +* Interrupt Mask Register read always returns 0." +* +* Hence we're not relying on IMR values to disable +* interrupts. +*/ +writel_relaxed (AT91_RTC_IRQ_MASK , base +AT91_RTC_IDR ); + (void )readl_relaxed (base +AT91_RTC_IMR );/* flush */ iounmap (base); }
Greg Kroah-Hartman
maintainerPATCH 38/68 MIPS: KVM: Allocate at least 16KB for exception handlers
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Hogan <[email protected]>
commit 7006e2dfda9adfa40251093604db76d7e44263b3 upstream.
Each MIPS KVM guest has its own copy of the KVM exception vector. This contains the TLB refill exception handler at offset 0x000, the general exception handler at offset 0x180, and interrupt exception handlers at offset 0x200 in case Cause_IV=1. A common handler is copied to offset 0x2000 and offset 0x3000 is used for temporarily storing k1 during entry from guest.
However the amount of memory allocated for this purpose is calculated as 0x200 rounded up to the next page boundary, which is insufficient if 4KB pages are in use. This can lead to the common handler at offset 0x2000 being overwritten and infinitely recursive exceptions on the next exit from the guest.
Increase the minimum size from 0x200 to 0x4000 to cover the full use of the page.
--- arch/mips/kvm/kvm_mips.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/mips/kvm/kvm_mips.c +1 -1
@@ -304,7 +304,7 @@ struct kvm_vcpu *kvm_arch_vcpu_create(stif (cpu_has_veic || cpu_has_vint) { size =0x200 +VECTORSPACING *64 ; }else { - size =0x200 ; + size =0x4000 ; }/* Save Linux EBASE */
Greg Kroah-Hartman
maintainerPATCH 39/68 USB: cdc-acm: fix write and suspend race
In reply to Greg Kroah-Hartman3.14-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
@@ -1512,18 +1512,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 40/68 USB: cdc-acm: fix write and resume race
In reply to Greg Kroah-Hartman3.14-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
@@ -1539,27 +1539,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); }/*
@@ -1567,12 +1560,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 41/68 USB: cdc-acm: fix broken runtime suspend
In reply to Greg Kroah-Hartman3.14-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
@@ -571,6 +571,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__);
@@ -579,6 +581,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);
@@ -646,12 +658,9 @@ static int acm_tty_write(struct tty_struusb_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 count;/* A white lie */ +return count; }usb_mark_last_busy (acm->dev);
@@ -1267,6 +1276,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) {
@@ -1537,7 +1547,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);
@@ -1549,10 +1559,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
@@ -120,7 +120,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 42/68 USB: cdc-acm: fix runtime PM for control messages
In reply to Greg Kroah-Hartman3.14-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
@@ -122,13 +122,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 43/68 USB: cdc-acm: fix shutdown and suspend race
In reply to Greg Kroah-Hartman3.14-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
@@ -1548,8 +1548,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 44/68 USB: cdc-acm: fix potential urb leak and PM imbalance in write
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 183a45087d126d126e8dd1d9b2602fc129dff9ad upstream.
Make sure to check return value of autopm get in write() in order to avoid urb leak and PM counter imbalance on errors.
that support remote wakeup")
--- drivers/usb/class/cdc-acm.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/usb/class/cdc-acm.c +7 -1
@@ -666,7 +666,13 @@ static int acm_tty_write(struct tty_strumemcpy (wb->buf, buf, count); wb->len = count; -usb_autopm_get_interface_async (acm->control); + stat =usb_autopm_get_interface_async (acm->control); +if (stat) { + wb->use =0 ; +spin_unlock_irqrestore (&acm->write_lock, flags); +return stat; + } +if (acm->susp_count) {usb_anchor_urb (wb->urb, &acm->delayed);spin_unlock_irqrestore (&acm->write_lock, flags);
Greg Kroah-Hartman
maintainerPATCH 45/68 USB: cdc-acm: fix I/O after failed open
In reply to Greg Kroah-Hartman3.14-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
@@ -506,6 +506,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__);
@@ -554,6 +555,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 46/68 USB: cdc-acm: fix runtime PM imbalance at shutdown
In reply to Greg Kroah-Hartman3.14-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
@@ -587,12 +587,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 (;;) {
@@ -610,7 +611,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 47/68 Drivers: hv: balloon: Ensure pressure reports are posted regularly
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: "K. Y. Srinivasan" <[email protected]>
commit ae339336dc950b9b05e7ccd3565dd3e8781c06d9 upstream.
The current code posts periodic memory pressure status from a dedicated thread. Under some conditions, especially when we are releasing a lot of memory into the guest, we may not send timely pressure reports back to the host. Fix this issue by reporting pressure in all contexts that can be active in this driver.
--- drivers/hv/hv_balloon.c | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-)
drivers/hv/hv_balloon.c +26 -3
@@ -19,6 +19,7 @@#define pr_fmt (fmt) KBUILD_MODNAME ": " fmt#include <linux/kernel.h> +#include <linux/jiffies.h> #include <linux/mman.h> #include <linux/delay.h> #include <linux/init.h>
@@ -459,6 +460,11 @@ static bool do_hot_add;*/ static uint pressure_report_delay =45 ; +/* +* The last time we posted a pressure report to host. +*/ +static unsigned long last_post_time; +module_param (hot_add, bool, (S_IRUGO |S_IWUSR ));MODULE_PARM_DESC (hot_add,"If set attempt memory hot_add" );
@@ -542,6 +548,7 @@ struct hv_dynmem_device {static struct hv_dynmem_device dm_device; +static void post_status (struct hv_dynmem_device *dm);#ifdef CONFIG_MEMORY_HOTPLUG static void hv_bring_pgs_online (unsigned long start_pfn,unsigned long size)
@@ -612,7 +619,7 @@ static void hv_mem_hot_add(unsigned long* have not been "onlined" within the allowed time. */ wait_for_completion_timeout (&dm_device.ol_waitevent,5 *HZ ); - +post_status (&dm_device); }return ;
@@ -951,11 +958,17 @@ static void post_status(struct hv_dynmem {struct dm_status status;struct sysinfo val; +unsigned long now = jiffies; +unsigned long last_post = last_post_time;if (pressure_report_delay >0 ) { --pressure_report_delay;return ; } + +if (!time_after (now, (last_post_time +HZ ))) +return ; +si_meminfo (&val);memset (&status,0 ,sizeof (struct dm_status )); status.hdr.type =DM_STATUS_REPORT ;
@@ -983,6 +996,14 @@ static void post_status(struct hv_dynmemif (status.hdr.trans_id !=atomic_read (&trans_id))return ; +/* +* If the last post time that we sampled has changed, +* we have raced, don't post the status. +*/ +if (last_post != last_post_time) +return ; + + last_post_time = jiffies; vmbus_sendpacket(dm->dev->channel, &status, sizeof(struct dm_status), (unsigned long)NULL,
@@ -1117,7 +1138,7 @@ static void balloon_up(struct work_strucif (ret == -EAGAIN )msleep (20 ); - +post_status (&dm_device); }while (ret == -EAGAIN );if (ret) {
@@ -1144,8 +1165,10 @@ static void balloon_down(struct hv_dynmestruct dm_unballoon_response resp;int i; -for (i =0 ; i < range_count; i++) +for (i =0 ; i < range_count; i++) {free_balloon_pages (dm, &range_array[i]); +post_status (&dm_device); + }if (req->more_pages ==1 )return ;
Greg Kroah-Hartman
maintainerPATCH 49/68 ASoC: dapm: Make sure to always update the DAPM graph in _put_volsw()
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lars-Peter Clausen <[email protected]>
commit c9e065c27fe9b81e5d6e7681d77a24f7b9616675 upstream.
When using auto-muted controls it may happen that the register value will not change when changing a control from enabled to disabled (since the control might be physically disabled due to the auto-muting). We have to make sure to still update the DAPM graph and disconnect the mixer input.
--- sound/soc/soc-dapm.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-)
sound/soc/soc-dapm.c +10 -13
@@ -2888,22 +2888,19 @@ int snd_soc_dapm_put_volsw(struct snd_kcmutex_lock_nested (&card->dapm_mutex,SND_SOC_DAPM_CLASS_RUNTIME ); change =dapm_kcontrol_set_value (kcontrol, val); - -if (reg !=SND_SOC_NOPM ) { - mask = mask << shift; - val = val << shift; - - change =snd_soc_test_bits (codec, reg, mask, val); - } -if (change) {if (reg !=SND_SOC_NOPM ) { - update.kcontrol = kcontrol; - update.reg = reg; - update.mask = mask; - update.val = val; + mask = mask << shift; + val = val << shift; + +if (snd_soc_test_bits (codec, reg, mask, val)) { + update.kcontrol = kcontrol; + update.reg = reg; + update.mask = mask; + update.val = val; + card->update = &update; + } - card->update = &update; } ret =soc_dapm_mixer_update_power (card, kcontrol, connect);
Greg Kroah-Hartman
maintainerPATCH 50/68 ASoC: max98090: Fix reset at resume time
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Liam Girdwood <[email protected]>
commit 25b4ab430f8e166c9b63f4db28e7e812d5a59396 upstream.
Reset needs to wait 20ms before other codec IO is performed. This wait was not being performed. Fix this by making sure the reset register is not restored with the cache, but use the manual reset method in resume with the wait.
--- sound/soc/codecs/max98090.c | 3 +++ 1 file changed, 3 insertions(+)
sound/soc/codecs/max98090.c +3 -0
@@ -255,6 +255,7 @@ static struct reg_default max98090_reg[]static bool max98090_volatile_register (struct device *dev,unsigned int reg) {switch (reg) { +case M98090_REG_SOFTWARE_RESET :case M98090_REG_DEVICE_STATUS :case M98090_REG_JACK_STATUS :case M98090_REG_REVISION_ID :
@@ -2360,6 +2361,8 @@ static int max98090_runtime_resume(strucregcache_cache_only (max98090->regmap, false); +max98090_reset (max98090); +regcache_sync (max98090->regmap);return 0 ;
Greg Kroah-Hartman
maintainerPATCH 51/68 ASoC: tlv320aci3x: Fix custom snd_soc_dapm_put_volsw_aic3x() function
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Ujfalusi <[email protected]>
commit e6c111fac4464e3f4bf7b3802b517dafc80f8e0f upstream.
For some unknown reason the parameters for snd_soc_test_bits() were in wrong order:
It was:snd_soc_test_bits(codec, val, mask, reg); /* WRONG!!! */
while it should be:snd_soc_test_bits(codec, reg, mask, val);
--- sound/soc/codecs/tlv320aic3x.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/codecs/tlv320aic3x.c +1 -1
@@ -169,7 +169,7 @@ static int snd_soc_dapm_put_volsw_aic3x( mask <<= shift; val <<= shift; - change =snd_soc_test_bits (codec, val, mask, reg); + change =snd_soc_test_bits (codec, reg, mask, val);if (change) { update.kcontrol = kcontrol; update.reg = reg;
Greg Kroah-Hartman
maintainerPATCH 52/68 iio:adc:max1363 incorrect resolutions for max11604, max11605, max11610 and max11611.
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonathan Cameron <[email protected]>
commit a91a73c8b39a6b8bcc53fafa5372c65387c81233 upstream.
--- drivers/iio/adc/max1363.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/iio/adc/max1363.c +8 -8
@@ -1258,8 +1258,8 @@ static const struct max1363_chip_info ma .num_modes = ARRAY_SIZE(max1238_mode_list), .default_mode = s0to11, .info = &max1238_info, - .channels = max1238_channels, - .num_channels = ARRAY_SIZE(max1238_channels), + .channels = max1038_channels, + .num_channels = ARRAY_SIZE(max1038_channels), }, [max11605] = { .bits = 8,
@@ -1268,8 +1268,8 @@ static const struct max1363_chip_info ma .num_modes = ARRAY_SIZE(max1238_mode_list), .default_mode = s0to11, .info = &max1238_info, - .channels = max1238_channels, - .num_channels = ARRAY_SIZE(max1238_channels), + .channels = max1038_channels, + .num_channels = ARRAY_SIZE(max1038_channels), }, [max11606] = { .bits = 10,
@@ -1318,8 +1318,8 @@ static const struct max1363_chip_info ma .num_modes = ARRAY_SIZE(max1238_mode_list), .default_mode = s0to11, .info = &max1238_info, - .channels = max1238_channels, - .num_channels = ARRAY_SIZE(max1238_channels), + .channels = max1138_channels, + .num_channels = ARRAY_SIZE(max1138_channels), }, [max11611] = { .bits = 10,
@@ -1328,8 +1328,8 @@ static const struct max1363_chip_info ma .num_modes = ARRAY_SIZE(max1238_mode_list), .default_mode = s0to11, .info = &max1238_info, - .channels = max1238_channels, - .num_channels = ARRAY_SIZE(max1238_channels), + .channels = max1138_channels, + .num_channels = ARRAY_SIZE(max1138_channels), }, [max11612] = { .bits = 12,
Greg Kroah-Hartman
maintainerPATCH 53/68 staging: iio: tsl2x7x_core: fix proximity treshold
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mario Schuknecht <[email protected]>
commit c404618cd06dad771495fe1cf9d5a63b5664f65f upstream.
Consider high byte of proximity min and max treshold in function 'tsl2x7x_chip_on'. So far, the high byte was not set.
--- drivers/staging/iio/light/tsl2x7x_core.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/staging/iio/light/tsl2x7x_core.c +6 -2
@@ -667,9 +667,13 @@ static int tsl2x7x_chip_on(struct iio_de chip->tsl2x7x_config[TSL2X7X_PRX_COUNT ] = chip->tsl2x7x_settings.prox_pulse_count; chip->tsl2x7x_config[TSL2X7X_PRX_MINTHRESHLO ] = - chip->tsl2x7x_settings.prox_thres_low; + (chip->tsl2x7x_settings.prox_thres_low) &0xFF ; + chip->tsl2x7x_config[TSL2X7X_PRX_MINTHRESHHI ] = + (chip->tsl2x7x_settings.prox_thres_low >>8 ) &0xFF ; chip->tsl2x7x_config[TSL2X7X_PRX_MAXTHRESHLO ] = - chip->tsl2x7x_settings.prox_thres_high; + (chip->tsl2x7x_settings.prox_thres_high) &0xFF ; + chip->tsl2x7x_config[TSL2X7X_PRX_MAXTHRESHHI ] = + (chip->tsl2x7x_settings.prox_thres_high >>8 ) &0xFF ;/* and make sure we're not already on */ if (chip->tsl2x7x_chip_status ==TSL2X7X_CHIP_WORKING ) {
Greg Kroah-Hartman
maintainerPATCH 54/68 iio: mxs-lradc: fix divider
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Robert Hodaszi <[email protected]>
commit 19bc4981a213d0c5b0e1e8b08815c0b26f01ec54 upstream.
All channels' single measurement are happening on CH 0. So enabling / disabling the divider once is not enough, because it has impact on all channels.
Set only a flag, then check this on each measurement, and enable / disable the divider as required.
--- drivers/staging/iio/adc/mxs-lradc.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
drivers/staging/iio/adc/mxs-lradc.c +8 -4
@@ -846,6 +846,14 @@ static int mxs_lradc_read_single(struct LRADC_CTRL1);mxs_lradc_reg_clear (lradc,0xff ,LRADC_CTRL0 ); +/* Enable / disable the divider per requirement */ +if (test_bit (chan, &lradc->is_divided)) +mxs_lradc_reg_set (lradc,1 <<LRADC_CTRL2_DIVIDE_BY_TWO_OFFSET , +LRADC_CTRL2 ); +else +mxs_lradc_reg_clear (lradc, +1 <<LRADC_CTRL2_DIVIDE_BY_TWO_OFFSET ,LRADC_CTRL2 ); +/* Clean the slot's previous content, then set new one. */ mxs_lradc_reg_clear (lradc,LRADC_CTRL4_LRADCSELECT_MASK (0 ),LRADC_CTRL4 );mxs_lradc_reg_set (lradc, chan,LRADC_CTRL4 );
@@ -964,15 +972,11 @@ static int mxs_lradc_write_raw(struct iiif (val == scale_avail[MXS_LRADC_DIV_DISABLED ].integer && val2 == scale_avail[MXS_LRADC_DIV_DISABLED ].nano) {/* divider by two disabled */ -writel (1 <<LRADC_CTRL2_DIVIDE_BY_TWO_OFFSET , - lradc->base +LRADC_CTRL2 +STMP_OFFSET_REG_CLR );clear_bit (chan->channel, &lradc->is_divided); ret =0 ; }else if (val == scale_avail[MXS_LRADC_DIV_ENABLED ].integer && val2 == scale_avail[MXS_LRADC_DIV_ENABLED ].nano) {/* divider by two enabled */ -writel (1 <<LRADC_CTRL2_DIVIDE_BY_TWO_OFFSET , - lradc->base +LRADC_CTRL2 +STMP_OFFSET_REG_SET );set_bit (chan->channel, &lradc->is_divided); ret =0 ; }
Greg Kroah-Hartman
maintainerPATCH 55/68 iio: adc: at91: signedness bug in at91_adc_get_trigger_value_by_name()
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
commit 4f3bcd878f1d3c730fe00f619b7260c6125d49eb upstream.
at91_adc_get_trigger_value_by_name() was returning -ENOMEM truncated to a positive u8 and that doesn't work. I've changed it to int and refactored it to preserve the error code.
--- drivers/iio/adc/at91_adc.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-)
drivers/iio/adc/at91_adc.c +8 -8
@@ -322,12 +322,11 @@ static int at91_adc_channel_init(structreturn idev->num_channels; } -static u8 at91_adc_get_trigger_value_by_name (struct iio_dev *idev, +static int at91_adc_get_trigger_value_by_name (struct iio_dev *idev,struct at91_adc_trigger *triggers,const char *trigger_name) {struct at91_adc_state *st =iio_priv (idev); -u8 value =0 ;int i;for (i =0 ; i < st->trigger_number; i++) {
@@ -340,15 +339,16 @@ static u8 at91_adc_get_trigger_value_by_return -ENOMEM ;if (strcmp (trigger_name, name) ==0 ) { - value = triggers[i].value;kfree (name); -break ; +if (triggers[i].value ==0 ) +return -EINVAL ; +return triggers[i].value; }kfree (name); } -return value; +return -EINVAL ; }static int at91_adc_configure_trigger (struct iio_trigger *trig,bool state)
@@ -358,14 +358,14 @@ static int at91_adc_configure_trigger(ststruct iio_buffer *buffer = idev->buffer;struct at91_adc_reg_desc *reg = st->registers;u32 status =at91_adc_readl (st, reg->trigger_register); -u8 value; +int value;u8 bit; value =at91_adc_get_trigger_value_by_name (idev, st->trigger_list, idev->trig->name); -if (value ==0 ) -return -EINVAL ; +if (value <0 ) +return value;if (state) { st->buffer =kmalloc (idev->scan_bytes,GFP_KERNEL );
Greg Kroah-Hartman
maintainerPATCH 56/68 iio: Fix endianness issue in ak8975_read_axis()
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Meerwald <[email protected]>
commit 8ba42fb7b17649c9ab5b5e79d4e90370a0b4645e upstream.
i2c_smbus_read_word_data() does host endian conversion already, no need for le16_to_cpu()
--- drivers/iio/magnetometer/ak8975.c | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-)
drivers/iio/magnetometer/ak8975.c +1 -8
@@ -352,8 +352,6 @@ static int ak8975_read_axis(struct iio_d {struct ak8975_data *data =iio_priv (indio_dev);struct i2c_client *client = data->client; -u16 meas_reg; -s16 raw;int ret;mutex_lock (&data->lock);
@@ -401,16 +399,11 @@ static int ak8975_read_axis(struct iio_ddev_err (&client->dev,"Read axis data fails\n" ); goto exit; } - meas_reg = ret;mutex_unlock (&data->lock); -/* Endian conversion of the measured values. */ - raw = (s16) (le16_to_cpu (meas_reg)); -/* Clamp to valid range. */ - raw =clamp_t (s16, raw,-4096 ,4095 ); - *val = raw; + *val =clamp_t (s16, ret,-4096 ,4095 );return IIO_VAL_INT ; exit:
Greg Kroah-Hartman
maintainerPATCH 58/68 lzo: properly check for overruns
In reply to Greg Kroah-Hartman3.14-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--;
Greg Kroah-Hartman
maintainerPATCH 59/68 lz4: ensure length does not wrap
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Greg Kroah-Hartman <[email protected]>
commit 206204a1162b995e2185275167b22468c00d6b36 upstream.
Given some pathologically compressed data, lz4 could possibly decide to wrap a few internal variables, causing unknown things to happen. Catch this before the wrapping happens and abort the decompression.
--- lib/lz4/lz4_decompress.c | 2 ++ 1 file changed, 2 insertions(+)
lib/lz4/lz4_decompress.c +2 -0
@@ -72,6 +72,8 @@ static int lz4_uncompress(const char *so len = *ip++;for (; len ==255 ; length +=255 ) len = *ip++; +if (unlikely (length > (size_t )(length + len))) + goto _output_error; length += len; }
Greg Kroah-Hartman
maintainerPATCH 60/68 ALSA: compress: Cancel the optimization of compiler and fix the size of struct for all platform.
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: "Wang, Xiaoming" <[email protected]>
commit 2bd0ae464a6cf7363bbf72c8545e0aa43caa57f0 upstream.
Cancel the optimization of compiler for struct snd_compr_avail which size will be 0x1c in 32bit kernel while 0x20 in 64bit kernel under the optimizer. That will make compaction between 32bit and 64bit. So add packed to fix the size of struct snd_compr_avail to 0x1c for all platform.
--- include/uapi/sound/compress_offload.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/uapi/sound/compress_offload.h +1 -1
@@ -80,7 +80,7 @@ struct snd_compr_tstamp {struct snd_compr_avail {__u64 avail;struct snd_compr_tstamp tstamp; -}; +} __attribute__((packed));enum snd_compr_direction {SND_COMPRESS_PLAYBACK =0 ,
Greg Kroah-Hartman
maintainerPATCH 61/68 ALSA: hda/realtek - Add support of ALC891 codec
In reply to Greg Kroah-Hartman3.14-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
@@ -5536,6 +5536,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 62/68 ALSA: hda/realtek - Add more entry for enable HP mute led
In reply to Greg Kroah-Hartman3.14-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kailang Yang <[email protected]>
commit 8a02b164d4bfac108bfe37e98108bff1e062bd3d upstream.
More HP machine need mute led support.
--- sound/pci/hda/patch_realtek.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
sound/pci/hda/patch_realtek.c +14 -0
@@ -4427,14 +4427,24 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x103c ,0x1983 ,"HP Pavilion" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x218b ,"HP" ,ALC269_FIXUP_LIMIT_INT_MIC_BOOST_MUTE_LED ),/* ALC282 */ +SND_PCI_QUIRK (0x103c ,0x220d ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), +SND_PCI_QUIRK (0x103c ,0x220e ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x220f ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), +SND_PCI_QUIRK (0x103c ,0x2210 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), +SND_PCI_QUIRK (0x103c ,0x2211 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), +SND_PCI_QUIRK (0x103c ,0x2212 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x2213 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), +SND_PCI_QUIRK (0x103c ,0x2214 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x2266 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x2267 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x2268 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x2269 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x226a ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x226b ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), +SND_PCI_QUIRK (0x103c ,0x226c ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), +SND_PCI_QUIRK (0x103c ,0x226d ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), +SND_PCI_QUIRK (0x103c ,0x226e ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), +SND_PCI_QUIRK (0x103c ,0x226f ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x227a ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x227b ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), SND_PCI_QUIRK(0x103c, 0x229e, "HP", ALC269_FIXUP_HP_MUTE_LED_MIC1),
@@ -4474,6 +4484,10 @@ static const struct snd_pci_quirk alc269SND_PCI_QUIRK (0x103c ,0x22c8 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x22c3 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK (0x103c ,0x22c4 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), +SND_PCI_QUIRK (0x103c ,0x2334 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), +SND_PCI_QUIRK (0x103c ,0x2335 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), +SND_PCI_QUIRK (0x103c ,0x2336 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ), +SND_PCI_QUIRK (0x103c ,0x2337 ,"HP" ,ALC269_FIXUP_HP_MUTE_LED_MIC1 ),SND_PCI_QUIRK_VENDOR (0x103c ,"HP" ,ALC269_FIXUP_HP_MUTE_LED ),SND_PCI_QUIRK (0x1043 ,0x103f ,"ASUS TX300" ,ALC282_FIXUP_ASUS_TX300 ), SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
Greg Kroah-Hartman
maintainerPATCH 64/68 ALSA: control: Protect user controls against concurrent access
In reply to Greg Kroah-Hartman3.14-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
@@ -121,6 +121,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
@@ -992,6 +992,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 */
@@ -1035,7 +1036,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 ; }
@@ -1044,10 +1047,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; }
@@ -1067,19 +1072,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; }
@@ -1211,6 +1229,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
@@ -218,6 +218,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 65/68 ALSA: control: Fix replacing user controls
In reply to Greg Kroah-Hartman3.14-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
@@ -1155,8 +1155,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 :
@@ -1165,21 +1163,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 66/68 ALSA: control: Dont access controls outside of protected regions
In reply to Greg Kroah-Hartman3.14-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
@@ -331,6 +331,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)
@@ -359,8 +360,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 ;
@@ -389,6 +391,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;
@@ -424,8 +427,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 ;
@@ -898,9 +902,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 ; } }
@@ -1334,8 +1338,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 67/68 ALSA: control: Handle numid overflow
In reply to Greg Kroah-Hartman3.14-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
@@ -289,6 +289,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 68/68 ALSA: control: Make sure that id->index does not overflow
In reply to Greg Kroah-Hartman3.14-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
@@ -343,6 +343,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);
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 3.14.9 release. There are 68 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:47:04 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.14.9-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.14.9 release. There are 68 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:47:04 UTC 2014. Anything received after that time might be too late.
Build results:
total: 144 pass: 137 skipped: 4 fail: 3
Failed builds:
powerpc:allmodconfig (binutils 2.23)
powerpc:allmodconfig (binutils 2.24)
unicore32:defconfig
Qemu tests all passed.
Results are as expected.
Details are available at http://server.roeck-us.net:8010/builders.
Guenter