Linux v3.17.4
This commit is contained in:
parent
562f560fd5
commit
335cadc866
|
@ -1,90 +0,0 @@
|
|||
From: Bob Peterson <rpeterso@redhat.com>
|
||||
Date: Mon, 29 Sep 2014 08:52:04 -0400
|
||||
Subject: [PATCH] GFS2: Make rename not save dirent location
|
||||
|
||||
This patch fixes a regression in the patch "GFS2: Remember directory
|
||||
insert point", commit 2b47dad866d04f14c328f888ba5406057b8c7d33.
|
||||
The problem had to do with the rename function: The function found
|
||||
space for the new dirent, and remembered that location. But then the
|
||||
old dirent was removed, which often moved the eligible location for
|
||||
the renamed dirent. Putting the new dirent at the saved location
|
||||
caused file system corruption.
|
||||
|
||||
This patch adds a new "save_loc" variable to struct gfs2_diradd.
|
||||
If 1, the dirent location is saved. If 0, the dirent location is not
|
||||
saved and the buffer_head is released as per previous behavior.
|
||||
|
||||
Signed-off-by: Bob Peterson <rpeterso@redhat.com>
|
||||
Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
|
||||
---
|
||||
fs/gfs2/dir.c | 9 +++++++--
|
||||
fs/gfs2/dir.h | 1 +
|
||||
fs/gfs2/inode.c | 6 +++---
|
||||
3 files changed, 11 insertions(+), 5 deletions(-)
|
||||
|
||||
diff --git a/fs/gfs2/dir.c b/fs/gfs2/dir.c
|
||||
index 1a349f9a9685..5d4261ff5d23 100644
|
||||
--- a/fs/gfs2/dir.c
|
||||
+++ b/fs/gfs2/dir.c
|
||||
@@ -2100,8 +2100,13 @@ int gfs2_diradd_alloc_required(struct inode *inode, const struct qstr *name,
|
||||
}
|
||||
if (IS_ERR(dent))
|
||||
return PTR_ERR(dent);
|
||||
- da->bh = bh;
|
||||
- da->dent = dent;
|
||||
+
|
||||
+ if (da->save_loc) {
|
||||
+ da->bh = bh;
|
||||
+ da->dent = dent;
|
||||
+ } else {
|
||||
+ brelse(bh);
|
||||
+ }
|
||||
return 0;
|
||||
}
|
||||
|
||||
diff --git a/fs/gfs2/dir.h b/fs/gfs2/dir.h
|
||||
index 126c65dda028..e1b309c24dab 100644
|
||||
--- a/fs/gfs2/dir.h
|
||||
+++ b/fs/gfs2/dir.h
|
||||
@@ -23,6 +23,7 @@ struct gfs2_diradd {
|
||||
unsigned nr_blocks;
|
||||
struct gfs2_dirent *dent;
|
||||
struct buffer_head *bh;
|
||||
+ int save_loc;
|
||||
};
|
||||
|
||||
extern struct inode *gfs2_dir_search(struct inode *dir,
|
||||
diff --git a/fs/gfs2/inode.c b/fs/gfs2/inode.c
|
||||
index fc8ac2ee0667..7d2723ce067e 100644
|
||||
--- a/fs/gfs2/inode.c
|
||||
+++ b/fs/gfs2/inode.c
|
||||
@@ -600,7 +600,7 @@ static int gfs2_create_inode(struct inode *dir, struct dentry *dentry,
|
||||
int error, free_vfs_inode = 0;
|
||||
u32 aflags = 0;
|
||||
unsigned blocks = 1;
|
||||
- struct gfs2_diradd da = { .bh = NULL, };
|
||||
+ struct gfs2_diradd da = { .bh = NULL, .save_loc = 1, };
|
||||
|
||||
if (!name->len || name->len > GFS2_FNAMESIZE)
|
||||
return -ENAMETOOLONG;
|
||||
@@ -899,7 +899,7 @@ static int gfs2_link(struct dentry *old_dentry, struct inode *dir,
|
||||
struct gfs2_inode *ip = GFS2_I(inode);
|
||||
struct gfs2_holder ghs[2];
|
||||
struct buffer_head *dibh;
|
||||
- struct gfs2_diradd da = { .bh = NULL, };
|
||||
+ struct gfs2_diradd da = { .bh = NULL, .save_loc = 1, };
|
||||
int error;
|
||||
|
||||
if (S_ISDIR(inode->i_mode))
|
||||
@@ -1337,7 +1337,7 @@ static int gfs2_rename(struct inode *odir, struct dentry *odentry,
|
||||
struct gfs2_rgrpd *nrgd;
|
||||
unsigned int num_gh;
|
||||
int dir_rename = 0;
|
||||
- struct gfs2_diradd da = { .nr_blocks = 0, };
|
||||
+ struct gfs2_diradd da = { .nr_blocks = 0, .save_loc = 0, };
|
||||
unsigned int x;
|
||||
int error;
|
||||
|
||||
--
|
||||
1.9.3
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
From: David Howells <dhowells@redhat.com>
|
||||
Date: Tue, 16 Sep 2014 17:29:03 +0100
|
||||
Subject: [PATCH] KEYS: Reinstate EPERM for a key type name beginning with a
|
||||
'.'
|
||||
|
||||
Reinstate the generation of EPERM for a key type name beginning with a '.' in
|
||||
a userspace call. Types whose name begins with a '.' are internal only.
|
||||
|
||||
The test was removed by:
|
||||
|
||||
commit a4e3b8d79a5c6d40f4a9703abf7fe3abcc6c3b8d
|
||||
Author: Mimi Zohar <zohar@linux.vnet.ibm.com>
|
||||
Date: Thu May 22 14:02:23 2014 -0400
|
||||
Subject: KEYS: special dot prefixed keyring name bug fix
|
||||
|
||||
I think we want to keep the restriction on type name so that userspace can't
|
||||
add keys of a special internal type.
|
||||
|
||||
Note that removal of the test causes several of the tests in the keyutils
|
||||
testsuite to fail.
|
||||
|
||||
Signed-off-by: David Howells <dhowells@redhat.com>
|
||||
Acked-by: Vivek Goyal <vgoyal@redhat.com>
|
||||
cc: Mimi Zohar <zohar@linux.vnet.ibm.com>
|
||||
---
|
||||
security/keys/keyctl.c | 2 ++
|
||||
1 file changed, 2 insertions(+)
|
||||
|
||||
diff --git a/security/keys/keyctl.c b/security/keys/keyctl.c
|
||||
index e26f860e5f2e..eff88a5f5d40 100644
|
||||
--- a/security/keys/keyctl.c
|
||||
+++ b/security/keys/keyctl.c
|
||||
@@ -37,6 +37,8 @@ static int key_get_type_from_user(char *type,
|
||||
return ret;
|
||||
if (ret == 0 || ret >= len)
|
||||
return -EINVAL;
|
||||
+ if (type[0] == '.')
|
||||
+ return -EPERM;
|
||||
type[len - 1] = '\0';
|
||||
return 0;
|
||||
}
|
||||
--
|
||||
1.9.3
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
From eeb55bed9ae80e1e860a1451986ce2ee0e5e52a7 Mon Sep 17 00:00:00 2001
|
||||
From: Nadav Amit <namit@cs.technion.ac.il>
|
||||
Date: Wed, 17 Sep 2014 02:50:50 +0300
|
||||
Subject: [PATCH] KVM: x86: Don't report guest userspace emulation error to
|
||||
userspace
|
||||
|
||||
Commit fc3a9157d314 ("KVM: X86: Don't report L2 emulation failures to
|
||||
user-space") disabled the reporting of L2 (nested guest) emulation failures to
|
||||
userspace due to race-condition between a vmexit and the instruction emulator.
|
||||
The same rational applies also to userspace applications that are permitted by
|
||||
the guest OS to access MMIO area or perform PIO.
|
||||
|
||||
This patch extends the current behavior - of injecting a #UD instead of
|
||||
reporting it to userspace - also for guest userspace code.
|
||||
|
||||
Signed-off-by: Nadav Amit <namit@cs.technion.ac.il>
|
||||
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
||||
---
|
||||
arch/x86/kvm/x86.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
|
||||
index 9d292e8372d6..d6aeccf116fa 100644
|
||||
--- a/arch/x86/kvm/x86.c
|
||||
+++ b/arch/x86/kvm/x86.c
|
||||
@@ -5002,7 +5002,7 @@ static int handle_emulation_failure(struct kvm_vcpu *vcpu)
|
||||
|
||||
++vcpu->stat.insn_emulation_fail;
|
||||
trace_kvm_emulate_insn_failed(vcpu);
|
||||
- if (!is_guest_mode(vcpu)) {
|
||||
+ if (!is_guest_mode(vcpu) && kvm_x86_ops->get_cpl(vcpu) == 0) {
|
||||
vcpu->run->exit_reason = KVM_EXIT_INTERNAL_ERROR;
|
||||
vcpu->run->internal.suberror = KVM_INTERNAL_ERROR_EMULATION;
|
||||
vcpu->run->internal.ndata = 0;
|
||||
--
|
||||
1.9.3
|
||||
|
|
@ -1,68 +0,0 @@
|
|||
From c6f69fa54729350d1e3be454739993197255fd40 Mon Sep 17 00:00:00 2001
|
||||
From: Tejun Heo <tj@kernel.org>
|
||||
Date: Mon, 27 Oct 2014 10:30:52 -0400
|
||||
Subject: [PATCH] ahci: disable MSI instead of NCQ on Samsung pci-e SSDs on
|
||||
macbooks
|
||||
|
||||
From 44aecdabc85087e7c299d7a28e095e2b91894a51 Mon Sep 17 00:00:00 2001
|
||||
From: Tejun Heo <tj@kernel.org>
|
||||
Date: Mon, 27 Oct 2014 10:22:56 -0400
|
||||
|
||||
Samsung pci-e SSDs on macbooks failed miserably on NCQ commands, so
|
||||
67809f85d31e ("ahci: disable NCQ on Samsung pci-e SSDs on macbooks")
|
||||
disabled NCQ on them. It turns out that NCQ is fine as long as MSI is
|
||||
not used, so let's turn off MSI and leave NCQ on.
|
||||
|
||||
Signed-off-by: Tejun Heo <tj@kernel.org>
|
||||
Link: https://bugzilla.kernel.org/show_bug.cgi?id=60731
|
||||
Tested-by: <dorin@i51.org>
|
||||
Tested-by: Imre Kaloz <kaloz@openwrt.org>
|
||||
Cc: stable@vger.kernel.org
|
||||
Fixes: 67809f85d31e ("ahci: disable NCQ on Samsung pci-e SSDs on macbooks")
|
||||
---
|
||||
drivers/ata/ahci.c | 14 +++++++++++---
|
||||
1 file changed, 11 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
|
||||
index a0cc0edafc78..3d8a10e4f827 100644
|
||||
--- a/drivers/ata/ahci.c
|
||||
+++ b/drivers/ata/ahci.c
|
||||
@@ -60,6 +60,7 @@ enum board_ids {
|
||||
/* board IDs by feature in alphabetical order */
|
||||
board_ahci,
|
||||
board_ahci_ign_iferr,
|
||||
+ board_ahci_nomsi,
|
||||
board_ahci_noncq,
|
||||
board_ahci_nosntf,
|
||||
board_ahci_yes_fbs,
|
||||
@@ -121,6 +122,13 @@ static const struct ata_port_info ahci_port_info[] = {
|
||||
.udma_mask = ATA_UDMA6,
|
||||
.port_ops = &ahci_ops,
|
||||
},
|
||||
+ [board_ahci_nomsi] = {
|
||||
+ AHCI_HFLAGS (AHCI_HFLAG_NO_MSI),
|
||||
+ .flags = AHCI_FLAG_COMMON,
|
||||
+ .pio_mask = ATA_PIO4,
|
||||
+ .udma_mask = ATA_UDMA6,
|
||||
+ .port_ops = &ahci_ops,
|
||||
+ },
|
||||
[board_ahci_noncq] = {
|
||||
AHCI_HFLAGS (AHCI_HFLAG_NO_NCQ),
|
||||
.flags = AHCI_FLAG_COMMON,
|
||||
@@ -475,10 +483,10 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||
{ PCI_VDEVICE(ASMEDIA, 0x0612), board_ahci }, /* ASM1062 */
|
||||
|
||||
/*
|
||||
- * Samsung SSDs found on some macbooks. NCQ times out.
|
||||
- * https://bugzilla.kernel.org/show_bug.cgi?id=60731
|
||||
+ * Samsung SSDs found on some macbooks. NCQ times out if MSI is
|
||||
+ * enabled. https://bugzilla.kernel.org/show_bug.cgi?id=60731
|
||||
*/
|
||||
- { PCI_VDEVICE(SAMSUNG, 0x1600), board_ahci_noncq },
|
||||
+ { PCI_VDEVICE(SAMSUNG, 0x1600), board_ahci_nomsi },
|
||||
|
||||
/* Enmotus */
|
||||
{ PCI_DEVICE(0x1c44, 0x8000), board_ahci },
|
||||
--
|
||||
1.9.3
|
||||
|
|
@ -1,58 +0,0 @@
|
|||
From: Kyle McMartin <kyle@redhat.com>
|
||||
Date: Wed, 12 Nov 2014 16:07:44 -0500
|
||||
Subject: [PATCH] arm64: __clear_user: handle exceptions on strb
|
||||
|
||||
ARM64 currently doesn't fix up faults on the single-byte (strb) case of
|
||||
__clear_user... which means that we can cause a nasty kernel panic as an
|
||||
ordinary user with any multiple PAGE_SIZE+1 read from /dev/zero.
|
||||
i.e.: dd if=/dev/zero of=foo ibs=1 count=1 (or ibs=65537, etc.)
|
||||
|
||||
This is a pretty obscure bug in the general case since we'll only
|
||||
__do_kernel_fault (since there's no extable entry for pc) if the
|
||||
mmap_sem is contended. However, with CONFIG_DEBUG_VM enabled, we'll
|
||||
always fault.
|
||||
|
||||
if (!down_read_trylock(&mm->mmap_sem)) {
|
||||
if (!user_mode(regs) && !search_exception_tables(regs->pc))
|
||||
goto no_context;
|
||||
retry:
|
||||
down_read(&mm->mmap_sem);
|
||||
} else {
|
||||
/*
|
||||
* The above down_read_trylock() might have succeeded in
|
||||
* which
|
||||
* case, we'll have missed the might_sleep() from
|
||||
* down_read().
|
||||
*/
|
||||
might_sleep();
|
||||
#ifdef CONFIG_DEBUG_VM
|
||||
if (!user_mode(regs) && !search_exception_tables(regs->pc))
|
||||
goto no_context;
|
||||
#endif
|
||||
}
|
||||
|
||||
Fix that by adding an extable entry for the strb instruction, since it
|
||||
touches user memory, similar to the other stores in __clear_user.
|
||||
|
||||
Signed-off-by: Kyle McMartin <kyle@redhat.com>
|
||||
Cc: stable@vger.kernel.org
|
||||
---
|
||||
arch/arm64/lib/clear_user.S | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/arch/arm64/lib/clear_user.S b/arch/arm64/lib/clear_user.S
|
||||
index 6e0ed93d51fe..c17967fdf5f6 100644
|
||||
--- a/arch/arm64/lib/clear_user.S
|
||||
+++ b/arch/arm64/lib/clear_user.S
|
||||
@@ -46,7 +46,7 @@ USER(9f, strh wzr, [x0], #2 )
|
||||
sub x1, x1, #2
|
||||
4: adds x1, x1, #1
|
||||
b.mi 5f
|
||||
- strb wzr, [x0]
|
||||
+USER(9f, strb wzr, [x0] )
|
||||
5: mov x0, #0
|
||||
ret
|
||||
ENDPROC(__clear_user)
|
||||
--
|
||||
1.9.3
|
||||
|
|
@ -10,12 +10,12 @@ CONFIG_HPET_TIMER=y
|
|||
|
||||
CONFIG_I8K=m
|
||||
CONFIG_SONYPI_COMPAT=y
|
||||
CONFIG_MICROCODE=y
|
||||
CONFIG_MICROCODE_EARLY=y
|
||||
CONFIG_MICROCODE=m
|
||||
# CONFIG_MICROCODE_EARLY is not set
|
||||
CONFIG_MICROCODE_INTEL=y
|
||||
CONFIG_MICROCODE_INTEL_EARLY=y
|
||||
CONFIG_MICROCODE_AMD=y
|
||||
CONFIG_MICROCODE_AMD_EARLY=y
|
||||
# CONFIG_MICROCODE_AMD_EARLY is not set
|
||||
|
||||
CONFIG_X86_MSR=y
|
||||
CONFIG_X86_CPUID=y
|
||||
|
|
73
kernel.spec
73
kernel.spec
|
@ -62,7 +62,7 @@ Summary: The Linux kernel
|
|||
# For non-released -rc kernels, this will be appended after the rcX and
|
||||
# gitX tags, so a 3 here would become part of release "0.rcX.gitX.3"
|
||||
#
|
||||
%global baserelease 201
|
||||
%global baserelease 200
|
||||
%global fedora_build %{baserelease}
|
||||
|
||||
# base_sublevel is the kernel version we're starting with and patching
|
||||
|
@ -74,7 +74,7 @@ Summary: The Linux kernel
|
|||
%if 0%{?released_kernel}
|
||||
|
||||
# Do we have a -stable update to apply?
|
||||
%define stable_update 3
|
||||
%define stable_update 4
|
||||
# Is it a -stable RC?
|
||||
%define stable_rc 0
|
||||
# Set rpm version accordingly
|
||||
|
@ -729,41 +729,9 @@ Patch26016: HID-wacom-Add-support-for-the-Cintiq-Companion.patch
|
|||
Patch26019: psmouse-Add-psmouse_matches_pnp_id-helper-function.patch
|
||||
Patch26020: psmouse-Add-support-for-detecting-FocalTech-PS-2-tou.patch
|
||||
|
||||
#rhbz 1145318
|
||||
Patch26029: KEYS-Reinstate-EPERM-for-a-key-type-name-beginning-w.patch
|
||||
|
||||
Patch26030: GFS2-Make-rename-not-save-dirent-location.patch
|
||||
|
||||
#rhbz 1089731
|
||||
Patch26058: asus-nb-wmi-Add-wapf4-quirk-for-the-X550VB.patch
|
||||
|
||||
#CVE-2014-3688 rhbz 1155745 1155751
|
||||
Patch26061: net-sctp-fix-skb_over_panic-when-receiving-malformed.patch
|
||||
|
||||
#CVE-2014-3687 rhbz 1155731 1155738
|
||||
Patch26062: net-sctp-fix-panic-on-duplicate-ASCONF-chunks.patch
|
||||
|
||||
#CVE-2014-3673 rhbz 1147850 1155727
|
||||
Patch26063: net-sctp-fix-remote-memory-pressure-from-excessive-q.patch
|
||||
|
||||
#rhbz 1157327
|
||||
Patch26083: quirk-for-Lenovo-Yoga-3-no-rfkill-switch.patch
|
||||
|
||||
#rhbz 1159592
|
||||
Patch26084: x86-microcode-AMD-Fix-early-ucode-loading-on-32-bit.patch
|
||||
|
||||
#rhbz 1161805
|
||||
Patch26066: ahci-disable-MSI-instead-of-NCQ-on-Samsung-pci-e-SSD.patch
|
||||
|
||||
#CVE-2014-7841 rhbz 1163087 1163095
|
||||
Patch26067: net-sctp-fix-NULL-pointer-dereference-in-af-from_add.patch
|
||||
|
||||
#CVE-2014-7842 rhbz 1163762 1163767
|
||||
Patch26068: KVM-x86-Don-t-report-guest-userspace-emulation-error.patch
|
||||
|
||||
#CVE-2014-7843 rhbz 1163744 1163745
|
||||
Patch26069: arm64-__clear_user-handle-exceptions-on-strb.patch
|
||||
|
||||
#rhbz 1135338
|
||||
Patch26090: HID-add-support-for-MS-Surface-Pro-3-Type-Cover.patch
|
||||
|
||||
|
@ -1467,42 +1435,9 @@ ApplyPatch HID-wacom-Add-support-for-the-Cintiq-Companion.patch
|
|||
ApplyPatch psmouse-Add-psmouse_matches_pnp_id-helper-function.patch
|
||||
ApplyPatch psmouse-Add-support-for-detecting-FocalTech-PS-2-tou.patch
|
||||
|
||||
#rhbz 1145318
|
||||
ApplyPatch KEYS-Reinstate-EPERM-for-a-key-type-name-beginning-w.patch
|
||||
|
||||
ApplyPatch GFS2-Make-rename-not-save-dirent-location.patch
|
||||
|
||||
|
||||
#rhbz 1089731
|
||||
ApplyPatch asus-nb-wmi-Add-wapf4-quirk-for-the-X550VB.patch
|
||||
|
||||
#CVE-2014-3688 rhbz 1155745 1155751
|
||||
ApplyPatch net-sctp-fix-skb_over_panic-when-receiving-malformed.patch
|
||||
|
||||
#CVE-2014-3687 rhbz 1155731 1155738
|
||||
ApplyPatch net-sctp-fix-panic-on-duplicate-ASCONF-chunks.patch
|
||||
|
||||
#CVE-2014-3673 rhbz 1147850 1155727
|
||||
ApplyPatch net-sctp-fix-remote-memory-pressure-from-excessive-q.patch
|
||||
|
||||
#rhbz 1157327
|
||||
ApplyPatch quirk-for-Lenovo-Yoga-3-no-rfkill-switch.patch
|
||||
|
||||
#rhbz 1159592
|
||||
ApplyPatch x86-microcode-AMD-Fix-early-ucode-loading-on-32-bit.patch
|
||||
|
||||
#rhbz 1161805
|
||||
ApplyPatch ahci-disable-MSI-instead-of-NCQ-on-Samsung-pci-e-SSD.patch
|
||||
|
||||
#CVE-2014-7841 rhbz 1163087 1163095
|
||||
ApplyPatch net-sctp-fix-NULL-pointer-dereference-in-af-from_add.patch
|
||||
|
||||
#CVE-2014-7842 rhbz 1163762 1163767
|
||||
ApplyPatch KVM-x86-Don-t-report-guest-userspace-emulation-error.patch
|
||||
|
||||
#CVE-2014-7843 rhbz 1163744 1163745
|
||||
ApplyPatch arm64-__clear_user-handle-exceptions-on-strb.patch
|
||||
|
||||
#rhbz 1135338
|
||||
ApplyPatch HID-add-support-for-MS-Surface-Pro-3-Type-Cover.patch
|
||||
|
||||
|
@ -2324,6 +2259,10 @@ fi
|
|||
# ||----w |
|
||||
# || ||
|
||||
%changelog
|
||||
* Fri Nov 21 2014 Justin M. Forbes <jforbes@fedoraproject.org> - 3.17.4-200
|
||||
- Linux v3.17.4
|
||||
- disable early microcode load (rhbz 1163520)
|
||||
|
||||
* Fri Nov 21 2014 Josh Boyer <jwboyer@fedoraproject.org>
|
||||
- Move TPM drivers to main kernel package (rhbz 1164937)
|
||||
|
||||
|
|
|
@ -1,77 +0,0 @@
|
|||
From: Daniel Borkmann <dborkman@redhat.com>
|
||||
Date: Mon, 10 Nov 2014 17:54:26 +0100
|
||||
Subject: [PATCH] net: sctp: fix NULL pointer dereference in
|
||||
af->from_addr_param on malformed packet
|
||||
|
||||
An SCTP server doing ASCONF will panic on malformed INIT ping-of-death
|
||||
in the form of:
|
||||
|
||||
------------ INIT[PARAM: SET_PRIMARY_IP] ------------>
|
||||
|
||||
While the INIT chunk parameter verification dissects through many things
|
||||
in order to detect malformed input, it misses to actually check parameters
|
||||
inside of parameters. E.g. RFC5061, section 4.2.4 proposes a 'set primary
|
||||
IP address' parameter in ASCONF, which has as a subparameter an address
|
||||
parameter.
|
||||
|
||||
So an attacker may send a parameter type other than SCTP_PARAM_IPV4_ADDRESS
|
||||
or SCTP_PARAM_IPV6_ADDRESS, param_type2af() will subsequently return 0
|
||||
and thus sctp_get_af_specific() returns NULL, too, which we then happily
|
||||
dereference unconditionally through af->from_addr_param().
|
||||
|
||||
The trace for the log:
|
||||
|
||||
BUG: unable to handle kernel NULL pointer dereference at 0000000000000078
|
||||
IP: [<ffffffffa01e9c62>] sctp_process_init+0x492/0x990 [sctp]
|
||||
PGD 0
|
||||
Oops: 0000 [#1] SMP
|
||||
[...]
|
||||
Pid: 0, comm: swapper Not tainted 2.6.32-504.el6.x86_64 #1 Bochs Bochs
|
||||
RIP: 0010:[<ffffffffa01e9c62>] [<ffffffffa01e9c62>] sctp_process_init+0x492/0x990 [sctp]
|
||||
[...]
|
||||
Call Trace:
|
||||
<IRQ>
|
||||
[<ffffffffa01f2add>] ? sctp_bind_addr_copy+0x5d/0xe0 [sctp]
|
||||
[<ffffffffa01e1fcb>] sctp_sf_do_5_1B_init+0x21b/0x340 [sctp]
|
||||
[<ffffffffa01e3751>] sctp_do_sm+0x71/0x1210 [sctp]
|
||||
[<ffffffffa01e5c09>] ? sctp_endpoint_lookup_assoc+0xc9/0xf0 [sctp]
|
||||
[<ffffffffa01e61f6>] sctp_endpoint_bh_rcv+0x116/0x230 [sctp]
|
||||
[<ffffffffa01ee986>] sctp_inq_push+0x56/0x80 [sctp]
|
||||
[<ffffffffa01fcc42>] sctp_rcv+0x982/0xa10 [sctp]
|
||||
[<ffffffffa01d5123>] ? ipt_local_in_hook+0x23/0x28 [iptable_filter]
|
||||
[<ffffffff8148bdc9>] ? nf_iterate+0x69/0xb0
|
||||
[<ffffffff81496d10>] ? ip_local_deliver_finish+0x0/0x2d0
|
||||
[<ffffffff8148bf86>] ? nf_hook_slow+0x76/0x120
|
||||
[<ffffffff81496d10>] ? ip_local_deliver_finish+0x0/0x2d0
|
||||
[...]
|
||||
|
||||
A minimal way to address this is to check for NULL as we do on all
|
||||
other such occasions where we know sctp_get_af_specific() could
|
||||
possibly return with NULL.
|
||||
|
||||
Fixes: d6de3097592b ("[SCTP]: Add the handling of "Set Primary IP Address" parameter to INIT")
|
||||
Signed-off-by: Daniel Borkmann <dborkman@redhat.com>
|
||||
Cc: Vlad Yasevich <vyasevich@gmail.com>
|
||||
Acked-by: Neil Horman <nhorman@tuxdriver.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
net/sctp/sm_make_chunk.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c
|
||||
index ab734be8cb20..9f32741abb1c 100644
|
||||
--- a/net/sctp/sm_make_chunk.c
|
||||
+++ b/net/sctp/sm_make_chunk.c
|
||||
@@ -2609,6 +2609,9 @@ do_addr_param:
|
||||
addr_param = param.v + sizeof(sctp_addip_param_t);
|
||||
|
||||
af = sctp_get_af_specific(param_type2af(param.p->type));
|
||||
+ if (af == NULL)
|
||||
+ break;
|
||||
+
|
||||
af->from_addr_param(&addr, addr_param,
|
||||
htons(asoc->peer.port), 0);
|
||||
|
||||
--
|
||||
1.9.3
|
||||
|
|
@ -1,95 +0,0 @@
|
|||
From: Daniel Borkmann <dborkman@redhat.com>
|
||||
Date: Thu, 9 Oct 2014 22:55:32 +0200
|
||||
Subject: [PATCH] net: sctp: fix panic on duplicate ASCONF chunks
|
||||
|
||||
Upstream commit b69040d8e39f20d5215a03502a8e8b4c6ab78395 CVE-2014-3687
|
||||
|
||||
When receiving a e.g. semi-good formed connection scan in the
|
||||
form of ...
|
||||
|
||||
-------------- INIT[ASCONF; ASCONF_ACK] ------------->
|
||||
<----------- INIT-ACK[ASCONF; ASCONF_ACK] ------------
|
||||
-------------------- COOKIE-ECHO -------------------->
|
||||
<-------------------- COOKIE-ACK ---------------------
|
||||
---------------- ASCONF_a; ASCONF_b ----------------->
|
||||
|
||||
... where ASCONF_a equals ASCONF_b chunk (at least both serials
|
||||
need to be equal), we panic an SCTP server!
|
||||
|
||||
The problem is that good-formed ASCONF chunks that we reply with
|
||||
ASCONF_ACK chunks are cached per serial. Thus, when we receive a
|
||||
same ASCONF chunk twice (e.g. through a lost ASCONF_ACK), we do
|
||||
not need to process them again on the server side (that was the
|
||||
idea, also proposed in the RFC). Instead, we know it was cached
|
||||
and we just resend the cached chunk instead. So far, so good.
|
||||
|
||||
Where things get nasty is in SCTP's side effect interpreter, that
|
||||
is, sctp_cmd_interpreter():
|
||||
|
||||
While incoming ASCONF_a (chunk = event_arg) is being marked
|
||||
!end_of_packet and !singleton, and we have an association context,
|
||||
we do not flush the outqueue the first time after processing the
|
||||
ASCONF_ACK singleton chunk via SCTP_CMD_REPLY. Instead, we keep it
|
||||
queued up, although we set local_cork to 1. Commit 2e3216cd54b1
|
||||
changed the precedence, so that as long as we get bundled, incoming
|
||||
chunks we try possible bundling on outgoing queue as well. Before
|
||||
this commit, we would just flush the output queue.
|
||||
|
||||
Now, while ASCONF_a's ASCONF_ACK sits in the corked outq, we
|
||||
continue to process the same ASCONF_b chunk from the packet. As
|
||||
we have cached the previous ASCONF_ACK, we find it, grab it and
|
||||
do another SCTP_CMD_REPLY command on it. So, effectively, we rip
|
||||
the chunk->list pointers and requeue the same ASCONF_ACK chunk
|
||||
another time. Since we process ASCONF_b, it's correctly marked
|
||||
with end_of_packet and we enforce an uncork, and thus flush, thus
|
||||
crashing the kernel.
|
||||
|
||||
Fix it by testing if the ASCONF_ACK is currently pending and if
|
||||
that is the case, do not requeue it. When flushing the output
|
||||
queue we may relink the chunk for preparing an outgoing packet,
|
||||
but eventually unlink it when it's copied into the skb right
|
||||
before transmission.
|
||||
|
||||
Joint work with Vlad Yasevich.
|
||||
|
||||
Fixes: 2e3216cd54b1 ("sctp: Follow security requirement of responding with 1 packet")
|
||||
Signed-off-by: Daniel Borkmann <dborkman@redhat.com>
|
||||
Signed-off-by: Vlad Yasevich <vyasevich@gmail.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
include/net/sctp/sctp.h | 5 +++++
|
||||
net/sctp/associola.c | 2 ++
|
||||
2 files changed, 7 insertions(+)
|
||||
|
||||
diff --git a/include/net/sctp/sctp.h b/include/net/sctp/sctp.h
|
||||
index 9fbd856e6713..856f01cb51dd 100644
|
||||
--- a/include/net/sctp/sctp.h
|
||||
+++ b/include/net/sctp/sctp.h
|
||||
@@ -426,6 +426,11 @@ static inline void sctp_assoc_pending_pmtu(struct sock *sk, struct sctp_associat
|
||||
asoc->pmtu_pending = 0;
|
||||
}
|
||||
|
||||
+static inline bool sctp_chunk_pending(const struct sctp_chunk *chunk)
|
||||
+{
|
||||
+ return !list_empty(&chunk->list);
|
||||
+}
|
||||
+
|
||||
/* Walk through a list of TLV parameters. Don't trust the
|
||||
* individual parameter lengths and instead depend on
|
||||
* the chunk length to indicate when to stop. Make sure
|
||||
diff --git a/net/sctp/associola.c b/net/sctp/associola.c
|
||||
index a88b8524846e..f791edd64d6c 100644
|
||||
--- a/net/sctp/associola.c
|
||||
+++ b/net/sctp/associola.c
|
||||
@@ -1668,6 +1668,8 @@ struct sctp_chunk *sctp_assoc_lookup_asconf_ack(
|
||||
* ack chunk whose serial number matches that of the request.
|
||||
*/
|
||||
list_for_each_entry(ack, &asoc->asconf_ack_list, transmitted_list) {
|
||||
+ if (sctp_chunk_pending(ack))
|
||||
+ continue;
|
||||
if (ack->subh.addip_hdr->serial == serial) {
|
||||
sctp_chunk_hold(ack);
|
||||
return ack;
|
||||
--
|
||||
1.9.3
|
||||
|
|
@ -1,153 +0,0 @@
|
|||
From: Daniel Borkmann <dborkman@redhat.com>
|
||||
Date: Thu, 9 Oct 2014 22:55:33 +0200
|
||||
Subject: [PATCH] net: sctp: fix remote memory pressure from excessive queueing
|
||||
|
||||
Upstream commit 26b87c7881006311828bb0ab271a551a62dcceb4 CVE-2014-3688
|
||||
|
||||
This scenario is not limited to ASCONF, just taken as one
|
||||
example triggering the issue. When receiving ASCONF probes
|
||||
in the form of ...
|
||||
|
||||
-------------- INIT[ASCONF; ASCONF_ACK] ------------->
|
||||
<----------- INIT-ACK[ASCONF; ASCONF_ACK] ------------
|
||||
-------------------- COOKIE-ECHO -------------------->
|
||||
<-------------------- COOKIE-ACK ---------------------
|
||||
---- ASCONF_a; [ASCONF_b; ...; ASCONF_n;] JUNK ------>
|
||||
[...]
|
||||
---- ASCONF_m; [ASCONF_o; ...; ASCONF_z;] JUNK ------>
|
||||
|
||||
... where ASCONF_a, ASCONF_b, ..., ASCONF_z are good-formed
|
||||
ASCONFs and have increasing serial numbers, we process such
|
||||
ASCONF chunk(s) marked with !end_of_packet and !singleton,
|
||||
since we have not yet reached the SCTP packet end. SCTP does
|
||||
only do verification on a chunk by chunk basis, as an SCTP
|
||||
packet is nothing more than just a container of a stream of
|
||||
chunks which it eats up one by one.
|
||||
|
||||
We could run into the case that we receive a packet with a
|
||||
malformed tail, above marked as trailing JUNK. All previous
|
||||
chunks are here goodformed, so the stack will eat up all
|
||||
previous chunks up to this point. In case JUNK does not fit
|
||||
into a chunk header and there are no more other chunks in
|
||||
the input queue, or in case JUNK contains a garbage chunk
|
||||
header, but the encoded chunk length would exceed the skb
|
||||
tail, or we came here from an entirely different scenario
|
||||
and the chunk has pdiscard=1 mark (without having had a flush
|
||||
point), it will happen, that we will excessively queue up
|
||||
the association's output queue (a correct final chunk may
|
||||
then turn it into a response flood when flushing the
|
||||
queue ;)): I ran a simple script with incremental ASCONF
|
||||
serial numbers and could see the server side consuming
|
||||
excessive amount of RAM [before/after: up to 2GB and more].
|
||||
|
||||
The issue at heart is that the chunk train basically ends
|
||||
with !end_of_packet and !singleton markers and since commit
|
||||
2e3216cd54b1 ("sctp: Follow security requirement of responding
|
||||
with 1 packet") therefore preventing an output queue flush
|
||||
point in sctp_do_sm() -> sctp_cmd_interpreter() on the input
|
||||
chunk (chunk = event_arg) even though local_cork is set,
|
||||
but its precedence has changed since then. In the normal
|
||||
case, the last chunk with end_of_packet=1 would trigger the
|
||||
queue flush to accommodate possible outgoing bundling.
|
||||
|
||||
In the input queue, sctp_inq_pop() seems to do the right thing
|
||||
in terms of discarding invalid chunks. So, above JUNK will
|
||||
not enter the state machine and instead be released and exit
|
||||
the sctp_assoc_bh_rcv() chunk processing loop. It's simply
|
||||
the flush point being missing at loop exit. Adding a try-flush
|
||||
approach on the output queue might not work as the underlying
|
||||
infrastructure might be long gone at this point due to the
|
||||
side-effect interpreter run.
|
||||
|
||||
One possibility, albeit a bit of a kludge, would be to defer
|
||||
invalid chunk freeing into the state machine in order to
|
||||
possibly trigger packet discards and thus indirectly a queue
|
||||
flush on error. It would surely be better to discard chunks
|
||||
as in the current, perhaps better controlled environment, but
|
||||
going back and forth, it's simply architecturally not possible.
|
||||
I tried various trailing JUNK attack cases and it seems to
|
||||
look good now.
|
||||
|
||||
Joint work with Vlad Yasevich.
|
||||
|
||||
Fixes: 2e3216cd54b1 ("sctp: Follow security requirement of responding with 1 packet")
|
||||
Signed-off-by: Daniel Borkmann <dborkman@redhat.com>
|
||||
Signed-off-by: Vlad Yasevich <vyasevich@gmail.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
net/sctp/inqueue.c | 33 +++++++--------------------------
|
||||
net/sctp/sm_statefuns.c | 3 +++
|
||||
2 files changed, 10 insertions(+), 26 deletions(-)
|
||||
|
||||
diff --git a/net/sctp/inqueue.c b/net/sctp/inqueue.c
|
||||
index 4de12afa13d4..7e8a16c77039 100644
|
||||
--- a/net/sctp/inqueue.c
|
||||
+++ b/net/sctp/inqueue.c
|
||||
@@ -140,18 +140,9 @@ struct sctp_chunk *sctp_inq_pop(struct sctp_inq *queue)
|
||||
} else {
|
||||
/* Nothing to do. Next chunk in the packet, please. */
|
||||
ch = (sctp_chunkhdr_t *) chunk->chunk_end;
|
||||
-
|
||||
/* Force chunk->skb->data to chunk->chunk_end. */
|
||||
- skb_pull(chunk->skb,
|
||||
- chunk->chunk_end - chunk->skb->data);
|
||||
-
|
||||
- /* Verify that we have at least chunk headers
|
||||
- * worth of buffer left.
|
||||
- */
|
||||
- if (skb_headlen(chunk->skb) < sizeof(sctp_chunkhdr_t)) {
|
||||
- sctp_chunk_free(chunk);
|
||||
- chunk = queue->in_progress = NULL;
|
||||
- }
|
||||
+ skb_pull(chunk->skb, chunk->chunk_end - chunk->skb->data);
|
||||
+ /* We are guaranteed to pull a SCTP header. */
|
||||
}
|
||||
}
|
||||
|
||||
@@ -187,24 +178,14 @@ struct sctp_chunk *sctp_inq_pop(struct sctp_inq *queue)
|
||||
skb_pull(chunk->skb, sizeof(sctp_chunkhdr_t));
|
||||
chunk->subh.v = NULL; /* Subheader is no longer valid. */
|
||||
|
||||
- if (chunk->chunk_end < skb_tail_pointer(chunk->skb)) {
|
||||
+ if (chunk->chunk_end + sizeof(sctp_chunkhdr_t) <
|
||||
+ skb_tail_pointer(chunk->skb)) {
|
||||
/* This is not a singleton */
|
||||
chunk->singleton = 0;
|
||||
} else if (chunk->chunk_end > skb_tail_pointer(chunk->skb)) {
|
||||
- /* RFC 2960, Section 6.10 Bundling
|
||||
- *
|
||||
- * Partial chunks MUST NOT be placed in an SCTP packet.
|
||||
- * If the receiver detects a partial chunk, it MUST drop
|
||||
- * the chunk.
|
||||
- *
|
||||
- * Since the end of the chunk is past the end of our buffer
|
||||
- * (which contains the whole packet, we can freely discard
|
||||
- * the whole packet.
|
||||
- */
|
||||
- sctp_chunk_free(chunk);
|
||||
- chunk = queue->in_progress = NULL;
|
||||
-
|
||||
- return NULL;
|
||||
+ /* Discard inside state machine. */
|
||||
+ chunk->pdiscard = 1;
|
||||
+ chunk->chunk_end = skb_tail_pointer(chunk->skb);
|
||||
} else {
|
||||
/* We are at the end of the packet, so mark the chunk
|
||||
* in case we need to send a SACK.
|
||||
diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
|
||||
index bdea3dfbad31..3ee27b7704ff 100644
|
||||
--- a/net/sctp/sm_statefuns.c
|
||||
+++ b/net/sctp/sm_statefuns.c
|
||||
@@ -170,6 +170,9 @@ sctp_chunk_length_valid(struct sctp_chunk *chunk,
|
||||
{
|
||||
__u16 chunk_length = ntohs(chunk->chunk_hdr->length);
|
||||
|
||||
+ /* Previously already marked? */
|
||||
+ if (unlikely(chunk->pdiscard))
|
||||
+ return 0;
|
||||
if (unlikely(chunk_length < required_length))
|
||||
return 0;
|
||||
|
||||
--
|
||||
1.9.3
|
||||
|
|
@ -1,341 +0,0 @@
|
|||
From: Daniel Borkmann <dborkman@redhat.com>
|
||||
Date: Thu, 9 Oct 2014 22:55:31 +0200
|
||||
Subject: [PATCH] net: sctp: fix skb_over_panic when receiving malformed ASCONF
|
||||
chunks
|
||||
|
||||
Upstream commit 9de7922bc709eee2f609cd01d98aaedc4cf5ea74 CVE-2014-3673
|
||||
|
||||
Commit 6f4c618ddb0 ("SCTP : Add paramters validity check for
|
||||
ASCONF chunk") added basic verification of ASCONF chunks, however,
|
||||
it is still possible to remotely crash a server by sending a
|
||||
special crafted ASCONF chunk, even up to pre 2.6.12 kernels:
|
||||
|
||||
skb_over_panic: text:ffffffffa01ea1c3 len:31056 put:30768
|
||||
head:ffff88011bd81800 data:ffff88011bd81800 tail:0x7950
|
||||
end:0x440 dev:<NULL>
|
||||
------------[ cut here ]------------
|
||||
kernel BUG at net/core/skbuff.c:129!
|
||||
[...]
|
||||
Call Trace:
|
||||
<IRQ>
|
||||
[<ffffffff8144fb1c>] skb_put+0x5c/0x70
|
||||
[<ffffffffa01ea1c3>] sctp_addto_chunk+0x63/0xd0 [sctp]
|
||||
[<ffffffffa01eadaf>] sctp_process_asconf+0x1af/0x540 [sctp]
|
||||
[<ffffffff8152d025>] ? _read_unlock_bh+0x15/0x20
|
||||
[<ffffffffa01e0038>] sctp_sf_do_asconf+0x168/0x240 [sctp]
|
||||
[<ffffffffa01e3751>] sctp_do_sm+0x71/0x1210 [sctp]
|
||||
[<ffffffff8147645d>] ? fib_rules_lookup+0xad/0xf0
|
||||
[<ffffffffa01e6b22>] ? sctp_cmp_addr_exact+0x32/0x40 [sctp]
|
||||
[<ffffffffa01e8393>] sctp_assoc_bh_rcv+0xd3/0x180 [sctp]
|
||||
[<ffffffffa01ee986>] sctp_inq_push+0x56/0x80 [sctp]
|
||||
[<ffffffffa01fcc42>] sctp_rcv+0x982/0xa10 [sctp]
|
||||
[<ffffffffa01d5123>] ? ipt_local_in_hook+0x23/0x28 [iptable_filter]
|
||||
[<ffffffff8148bdc9>] ? nf_iterate+0x69/0xb0
|
||||
[<ffffffff81496d10>] ? ip_local_deliver_finish+0x0/0x2d0
|
||||
[<ffffffff8148bf86>] ? nf_hook_slow+0x76/0x120
|
||||
[<ffffffff81496d10>] ? ip_local_deliver_finish+0x0/0x2d0
|
||||
[<ffffffff81496ded>] ip_local_deliver_finish+0xdd/0x2d0
|
||||
[<ffffffff81497078>] ip_local_deliver+0x98/0xa0
|
||||
[<ffffffff8149653d>] ip_rcv_finish+0x12d/0x440
|
||||
[<ffffffff81496ac5>] ip_rcv+0x275/0x350
|
||||
[<ffffffff8145c88b>] __netif_receive_skb+0x4ab/0x750
|
||||
[<ffffffff81460588>] netif_receive_skb+0x58/0x60
|
||||
|
||||
This can be triggered e.g., through a simple scripted nmap
|
||||
connection scan injecting the chunk after the handshake, for
|
||||
example, ...
|
||||
|
||||
-------------- INIT[ASCONF; ASCONF_ACK] ------------->
|
||||
<----------- INIT-ACK[ASCONF; ASCONF_ACK] ------------
|
||||
-------------------- COOKIE-ECHO -------------------->
|
||||
<-------------------- COOKIE-ACK ---------------------
|
||||
------------------ ASCONF; UNKNOWN ------------------>
|
||||
|
||||
... where ASCONF chunk of length 280 contains 2 parameters ...
|
||||
|
||||
1) Add IP address parameter (param length: 16)
|
||||
2) Add/del IP address parameter (param length: 255)
|
||||
|
||||
... followed by an UNKNOWN chunk of e.g. 4 bytes. Here, the
|
||||
Address Parameter in the ASCONF chunk is even missing, too.
|
||||
This is just an example and similarly-crafted ASCONF chunks
|
||||
could be used just as well.
|
||||
|
||||
The ASCONF chunk passes through sctp_verify_asconf() as all
|
||||
parameters passed sanity checks, and after walking, we ended
|
||||
up successfully at the chunk end boundary, and thus may invoke
|
||||
sctp_process_asconf(). Parameter walking is done with
|
||||
WORD_ROUND() to take padding into account.
|
||||
|
||||
In sctp_process_asconf()'s TLV processing, we may fail in
|
||||
sctp_process_asconf_param() e.g., due to removal of the IP
|
||||
address that is also the source address of the packet containing
|
||||
the ASCONF chunk, and thus we need to add all TLVs after the
|
||||
failure to our ASCONF response to remote via helper function
|
||||
sctp_add_asconf_response(), which basically invokes a
|
||||
sctp_addto_chunk() adding the error parameters to the given
|
||||
skb.
|
||||
|
||||
When walking to the next parameter this time, we proceed
|
||||
with ...
|
||||
|
||||
length = ntohs(asconf_param->param_hdr.length);
|
||||
asconf_param = (void *)asconf_param + length;
|
||||
|
||||
... instead of the WORD_ROUND()'ed length, thus resulting here
|
||||
in an off-by-one that leads to reading the follow-up garbage
|
||||
parameter length of 12336, and thus throwing an skb_over_panic
|
||||
for the reply when trying to sctp_addto_chunk() next time,
|
||||
which implicitly calls the skb_put() with that length.
|
||||
|
||||
Fix it by using sctp_walk_params() [ which is also used in
|
||||
INIT parameter processing ] macro in the verification *and*
|
||||
in ASCONF processing: it will make sure we don't spill over,
|
||||
that we walk parameters WORD_ROUND()'ed. Moreover, we're being
|
||||
more defensive and guard against unknown parameter types and
|
||||
missized addresses.
|
||||
|
||||
Joint work with Vlad Yasevich.
|
||||
|
||||
Fixes: b896b82be4ae ("[SCTP] ADDIP: Support for processing incoming ASCONF_ACK chunks.")
|
||||
Signed-off-by: Daniel Borkmann <dborkman@redhat.com>
|
||||
Signed-off-by: Vlad Yasevich <vyasevich@gmail.com>
|
||||
Acked-by: Neil Horman <nhorman@tuxdriver.com>
|
||||
Signed-off-by: David S. Miller <davem@davemloft.net>
|
||||
---
|
||||
include/net/sctp/sm.h | 6 +--
|
||||
net/sctp/sm_make_chunk.c | 99 +++++++++++++++++++++++++++---------------------
|
||||
net/sctp/sm_statefuns.c | 18 +--------
|
||||
3 files changed, 60 insertions(+), 63 deletions(-)
|
||||
|
||||
diff --git a/include/net/sctp/sm.h b/include/net/sctp/sm.h
|
||||
index 7f4eeb340a54..72a31db47ded 100644
|
||||
--- a/include/net/sctp/sm.h
|
||||
+++ b/include/net/sctp/sm.h
|
||||
@@ -248,9 +248,9 @@ struct sctp_chunk *sctp_make_asconf_update_ip(struct sctp_association *,
|
||||
int, __be16);
|
||||
struct sctp_chunk *sctp_make_asconf_set_prim(struct sctp_association *asoc,
|
||||
union sctp_addr *addr);
|
||||
-int sctp_verify_asconf(const struct sctp_association *asoc,
|
||||
- struct sctp_paramhdr *param_hdr, void *chunk_end,
|
||||
- struct sctp_paramhdr **errp);
|
||||
+bool sctp_verify_asconf(const struct sctp_association *asoc,
|
||||
+ struct sctp_chunk *chunk, bool addr_param_needed,
|
||||
+ struct sctp_paramhdr **errp);
|
||||
struct sctp_chunk *sctp_process_asconf(struct sctp_association *asoc,
|
||||
struct sctp_chunk *asconf);
|
||||
int sctp_process_asconf_ack(struct sctp_association *asoc,
|
||||
diff --git a/net/sctp/sm_make_chunk.c b/net/sctp/sm_make_chunk.c
|
||||
index ae0e616a7ca5..ab734be8cb20 100644
|
||||
--- a/net/sctp/sm_make_chunk.c
|
||||
+++ b/net/sctp/sm_make_chunk.c
|
||||
@@ -3110,50 +3110,63 @@ static __be16 sctp_process_asconf_param(struct sctp_association *asoc,
|
||||
return SCTP_ERROR_NO_ERROR;
|
||||
}
|
||||
|
||||
-/* Verify the ASCONF packet before we process it. */
|
||||
-int sctp_verify_asconf(const struct sctp_association *asoc,
|
||||
- struct sctp_paramhdr *param_hdr, void *chunk_end,
|
||||
- struct sctp_paramhdr **errp) {
|
||||
- sctp_addip_param_t *asconf_param;
|
||||
+/* Verify the ASCONF packet before we process it. */
|
||||
+bool sctp_verify_asconf(const struct sctp_association *asoc,
|
||||
+ struct sctp_chunk *chunk, bool addr_param_needed,
|
||||
+ struct sctp_paramhdr **errp)
|
||||
+{
|
||||
+ sctp_addip_chunk_t *addip = (sctp_addip_chunk_t *) chunk->chunk_hdr;
|
||||
union sctp_params param;
|
||||
- int length, plen;
|
||||
-
|
||||
- param.v = (sctp_paramhdr_t *) param_hdr;
|
||||
- while (param.v <= chunk_end - sizeof(sctp_paramhdr_t)) {
|
||||
- length = ntohs(param.p->length);
|
||||
- *errp = param.p;
|
||||
+ bool addr_param_seen = false;
|
||||
|
||||
- if (param.v > chunk_end - length ||
|
||||
- length < sizeof(sctp_paramhdr_t))
|
||||
- return 0;
|
||||
+ sctp_walk_params(param, addip, addip_hdr.params) {
|
||||
+ size_t length = ntohs(param.p->length);
|
||||
|
||||
+ *errp = param.p;
|
||||
switch (param.p->type) {
|
||||
+ case SCTP_PARAM_ERR_CAUSE:
|
||||
+ break;
|
||||
+ case SCTP_PARAM_IPV4_ADDRESS:
|
||||
+ if (length != sizeof(sctp_ipv4addr_param_t))
|
||||
+ return false;
|
||||
+ addr_param_seen = true;
|
||||
+ break;
|
||||
+ case SCTP_PARAM_IPV6_ADDRESS:
|
||||
+ if (length != sizeof(sctp_ipv6addr_param_t))
|
||||
+ return false;
|
||||
+ addr_param_seen = true;
|
||||
+ break;
|
||||
case SCTP_PARAM_ADD_IP:
|
||||
case SCTP_PARAM_DEL_IP:
|
||||
case SCTP_PARAM_SET_PRIMARY:
|
||||
- asconf_param = (sctp_addip_param_t *)param.v;
|
||||
- plen = ntohs(asconf_param->param_hdr.length);
|
||||
- if (plen < sizeof(sctp_addip_param_t) +
|
||||
- sizeof(sctp_paramhdr_t))
|
||||
- return 0;
|
||||
+ /* In ASCONF chunks, these need to be first. */
|
||||
+ if (addr_param_needed && !addr_param_seen)
|
||||
+ return false;
|
||||
+ length = ntohs(param.addip->param_hdr.length);
|
||||
+ if (length < sizeof(sctp_addip_param_t) +
|
||||
+ sizeof(sctp_paramhdr_t))
|
||||
+ return false;
|
||||
break;
|
||||
case SCTP_PARAM_SUCCESS_REPORT:
|
||||
case SCTP_PARAM_ADAPTATION_LAYER_IND:
|
||||
if (length != sizeof(sctp_addip_param_t))
|
||||
- return 0;
|
||||
-
|
||||
+ return false;
|
||||
break;
|
||||
default:
|
||||
- break;
|
||||
+ /* This is unkown to us, reject! */
|
||||
+ return false;
|
||||
}
|
||||
-
|
||||
- param.v += WORD_ROUND(length);
|
||||
}
|
||||
|
||||
- if (param.v != chunk_end)
|
||||
- return 0;
|
||||
+ /* Remaining sanity checks. */
|
||||
+ if (addr_param_needed && !addr_param_seen)
|
||||
+ return false;
|
||||
+ if (!addr_param_needed && addr_param_seen)
|
||||
+ return false;
|
||||
+ if (param.v != chunk->chunk_end)
|
||||
+ return false;
|
||||
|
||||
- return 1;
|
||||
+ return true;
|
||||
}
|
||||
|
||||
/* Process an incoming ASCONF chunk with the next expected serial no. and
|
||||
@@ -3162,16 +3175,17 @@ int sctp_verify_asconf(const struct sctp_association *asoc,
|
||||
struct sctp_chunk *sctp_process_asconf(struct sctp_association *asoc,
|
||||
struct sctp_chunk *asconf)
|
||||
{
|
||||
+ sctp_addip_chunk_t *addip = (sctp_addip_chunk_t *) asconf->chunk_hdr;
|
||||
+ bool all_param_pass = true;
|
||||
+ union sctp_params param;
|
||||
sctp_addiphdr_t *hdr;
|
||||
union sctp_addr_param *addr_param;
|
||||
sctp_addip_param_t *asconf_param;
|
||||
struct sctp_chunk *asconf_ack;
|
||||
-
|
||||
__be16 err_code;
|
||||
int length = 0;
|
||||
int chunk_len;
|
||||
__u32 serial;
|
||||
- int all_param_pass = 1;
|
||||
|
||||
chunk_len = ntohs(asconf->chunk_hdr->length) - sizeof(sctp_chunkhdr_t);
|
||||
hdr = (sctp_addiphdr_t *)asconf->skb->data;
|
||||
@@ -3199,9 +3213,14 @@ struct sctp_chunk *sctp_process_asconf(struct sctp_association *asoc,
|
||||
goto done;
|
||||
|
||||
/* Process the TLVs contained within the ASCONF chunk. */
|
||||
- while (chunk_len > 0) {
|
||||
+ sctp_walk_params(param, addip, addip_hdr.params) {
|
||||
+ /* Skip preceeding address parameters. */
|
||||
+ if (param.p->type == SCTP_PARAM_IPV4_ADDRESS ||
|
||||
+ param.p->type == SCTP_PARAM_IPV6_ADDRESS)
|
||||
+ continue;
|
||||
+
|
||||
err_code = sctp_process_asconf_param(asoc, asconf,
|
||||
- asconf_param);
|
||||
+ param.addip);
|
||||
/* ADDIP 4.1 A7)
|
||||
* If an error response is received for a TLV parameter,
|
||||
* all TLVs with no response before the failed TLV are
|
||||
@@ -3209,28 +3228,20 @@ struct sctp_chunk *sctp_process_asconf(struct sctp_association *asoc,
|
||||
* the failed response are considered unsuccessful unless
|
||||
* a specific success indication is present for the parameter.
|
||||
*/
|
||||
- if (SCTP_ERROR_NO_ERROR != err_code)
|
||||
- all_param_pass = 0;
|
||||
-
|
||||
+ if (err_code != SCTP_ERROR_NO_ERROR)
|
||||
+ all_param_pass = false;
|
||||
if (!all_param_pass)
|
||||
- sctp_add_asconf_response(asconf_ack,
|
||||
- asconf_param->crr_id, err_code,
|
||||
- asconf_param);
|
||||
+ sctp_add_asconf_response(asconf_ack, param.addip->crr_id,
|
||||
+ err_code, param.addip);
|
||||
|
||||
/* ADDIP 4.3 D11) When an endpoint receiving an ASCONF to add
|
||||
* an IP address sends an 'Out of Resource' in its response, it
|
||||
* MUST also fail any subsequent add or delete requests bundled
|
||||
* in the ASCONF.
|
||||
*/
|
||||
- if (SCTP_ERROR_RSRC_LOW == err_code)
|
||||
+ if (err_code == SCTP_ERROR_RSRC_LOW)
|
||||
goto done;
|
||||
-
|
||||
- /* Move to the next ASCONF param. */
|
||||
- length = ntohs(asconf_param->param_hdr.length);
|
||||
- asconf_param = (void *)asconf_param + length;
|
||||
- chunk_len -= length;
|
||||
}
|
||||
-
|
||||
done:
|
||||
asoc->peer.addip_serial++;
|
||||
|
||||
diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
|
||||
index c8f606324134..bdea3dfbad31 100644
|
||||
--- a/net/sctp/sm_statefuns.c
|
||||
+++ b/net/sctp/sm_statefuns.c
|
||||
@@ -3591,9 +3591,7 @@ sctp_disposition_t sctp_sf_do_asconf(struct net *net,
|
||||
struct sctp_chunk *asconf_ack = NULL;
|
||||
struct sctp_paramhdr *err_param = NULL;
|
||||
sctp_addiphdr_t *hdr;
|
||||
- union sctp_addr_param *addr_param;
|
||||
__u32 serial;
|
||||
- int length;
|
||||
|
||||
if (!sctp_vtag_verify(chunk, asoc)) {
|
||||
sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_BAD_TAG,
|
||||
@@ -3618,17 +3616,8 @@ sctp_disposition_t sctp_sf_do_asconf(struct net *net,
|
||||
hdr = (sctp_addiphdr_t *)chunk->skb->data;
|
||||
serial = ntohl(hdr->serial);
|
||||
|
||||
- addr_param = (union sctp_addr_param *)hdr->params;
|
||||
- length = ntohs(addr_param->p.length);
|
||||
- if (length < sizeof(sctp_paramhdr_t))
|
||||
- return sctp_sf_violation_paramlen(net, ep, asoc, type, arg,
|
||||
- (void *)addr_param, commands);
|
||||
-
|
||||
/* Verify the ASCONF chunk before processing it. */
|
||||
- if (!sctp_verify_asconf(asoc,
|
||||
- (sctp_paramhdr_t *)((void *)addr_param + length),
|
||||
- (void *)chunk->chunk_end,
|
||||
- &err_param))
|
||||
+ if (!sctp_verify_asconf(asoc, chunk, true, &err_param))
|
||||
return sctp_sf_violation_paramlen(net, ep, asoc, type, arg,
|
||||
(void *)err_param, commands);
|
||||
|
||||
@@ -3745,10 +3734,7 @@ sctp_disposition_t sctp_sf_do_asconf_ack(struct net *net,
|
||||
rcvd_serial = ntohl(addip_hdr->serial);
|
||||
|
||||
/* Verify the ASCONF-ACK chunk before processing it. */
|
||||
- if (!sctp_verify_asconf(asoc,
|
||||
- (sctp_paramhdr_t *)addip_hdr->params,
|
||||
- (void *)asconf_ack->chunk_end,
|
||||
- &err_param))
|
||||
+ if (!sctp_verify_asconf(asoc, asconf_ack, false, &err_param))
|
||||
return sctp_sf_violation_paramlen(net, ep, asoc, type, arg,
|
||||
(void *)err_param, commands);
|
||||
|
||||
--
|
||||
1.9.3
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
From: Stephan Mueller <smueller@chronox.de>
|
||||
Date: Mon, 27 Oct 2014 04:09:50 +0100
|
||||
Subject: [PATCH] quirk for Lenovo Yoga 3: no rfkill switch
|
||||
|
||||
The Yoga 3 does not contain any physical rfkill switch. Therefore
|
||||
disable the rfkill switch identically to the Yoga 2 approach.
|
||||
|
||||
Signed-off-by: Stephan Mueller <smueller@chronox.de>
|
||||
---
|
||||
drivers/platform/x86/ideapad-laptop.c | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
diff --git a/drivers/platform/x86/ideapad-laptop.c b/drivers/platform/x86/ideapad-laptop.c
|
||||
index 02152de135b5..ed494f37c40f 100644
|
||||
--- a/drivers/platform/x86/ideapad-laptop.c
|
||||
+++ b/drivers/platform/x86/ideapad-laptop.c
|
||||
@@ -837,6 +837,13 @@ static const struct dmi_system_id no_hw_rfkill_list[] = {
|
||||
DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo Yoga 2"),
|
||||
},
|
||||
},
|
||||
+ {
|
||||
+ .ident = "Lenovo Yoga 3 Pro 1370",
|
||||
+ .matches = {
|
||||
+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
|
||||
+ DMI_MATCH(DMI_PRODUCT_VERSION, "Lenovo YOGA 3 Pro-1370"),
|
||||
+ },
|
||||
+ },
|
||||
{}
|
||||
};
|
||||
|
||||
--
|
||||
1.9.3
|
||||
|
2
sources
2
sources
|
@ -1,3 +1,3 @@
|
|||
fb30d0f29214d75cddd2faa94f73d5cf linux-3.17.tar.xz
|
||||
159e969cbc27201d8e2fa0f609dc722f perf-man-3.17.tar.gz
|
||||
13f495e3ce72ed6ccefb38591587a6ef patch-3.17.3.xz
|
||||
df86f9de60a651ce3312af09729f7b1e patch-3.17.4.xz
|
||||
|
|
|
@ -1,56 +0,0 @@
|
|||
From 4232c1bb6b7ed45b96d2112e6f151cf5c9c28470 Mon Sep 17 00:00:00 2001
|
||||
From: Borislav Petkov <bp@alien8.de>
|
||||
Date: Sat, 1 Nov 2014 11:01:00 +0100
|
||||
Subject: [PATCH] x86, microcode, AMD: Fix early ucode loading on 32-bit
|
||||
|
||||
Hi guys,
|
||||
|
||||
please queue this for the next batch to Linus.
|
||||
|
||||
Thanks.
|
||||
---
|
||||
arch/x86/kernel/cpu/microcode/amd_early.c | 9 +++++++--
|
||||
1 file changed, 7 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/arch/x86/kernel/cpu/microcode/amd_early.c b/arch/x86/kernel/cpu/microcode/amd_early.c
|
||||
index 617a9e284245..65bdfb598880 100644
|
||||
--- a/arch/x86/kernel/cpu/microcode/amd_early.c
|
||||
+++ b/arch/x86/kernel/cpu/microcode/amd_early.c
|
||||
@@ -348,6 +348,7 @@ int __init save_microcode_in_initrd_amd(void)
|
||||
{
|
||||
unsigned long cont;
|
||||
enum ucode_state ret;
|
||||
+ u8 *cont_va;
|
||||
u32 eax;
|
||||
|
||||
if (!container)
|
||||
@@ -355,13 +356,15 @@ int __init save_microcode_in_initrd_amd(void)
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
get_bsp_sig();
|
||||
- cont = (unsigned long)container;
|
||||
+ cont = (unsigned long)container;
|
||||
+ cont_va = __va(container);
|
||||
#else
|
||||
/*
|
||||
* We need the physical address of the container for both bitness since
|
||||
* boot_params.hdr.ramdisk_image is a physical address.
|
||||
*/
|
||||
- cont = __pa(container);
|
||||
+ cont = __pa(container);
|
||||
+ cont_va = container;
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -372,6 +375,8 @@ int __init save_microcode_in_initrd_amd(void)
|
||||
if (relocated_ramdisk)
|
||||
container = (u8 *)(__va(relocated_ramdisk) +
|
||||
(cont - boot_params.hdr.ramdisk_image));
|
||||
+ else
|
||||
+ container = cont_va;
|
||||
|
||||
if (ucode_new_rev)
|
||||
pr_info("microcode: updated early to new patch_level=0x%08x\n",
|
||||
--
|
||||
1.9.3
|
||||
|
Loading…
Reference in New Issue