mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Willy Tarreau <w@1wt.eu>
To: linux-kernel@vger.kernel.org, stable@vger.kernel.org, linux@roeck-us.net
Cc: Hugh Dickins <hughd@google.com>, Willy Tarreau <w@1wt.eu>
Subject: [PATCH 3.10 268/268] mm: larger stack guard gap, between vmas
Date: Mon, 19 Jun 2017 20:32:47 +0200	[thread overview]
Message-ID: <1497897167-14556-269-git-send-email-w@1wt.eu> (raw)
In-Reply-To: <1497897167-14556-1-git-send-email-w@1wt.eu>

From: Hugh Dickins <hughd@google.com>

commit 1be7107fbe18eed3e319a6c3e83c78254b693acb upstream.

Stack guard page is a useful feature to reduce a risk of stack smashing
into a different mapping. We have been using a single page gap which
is sufficient to prevent having stack adjacent to a different mapping.
But this seems to be insufficient in the light of the stack usage in
userspace. E.g. glibc uses as large as 64kB alloca() in many commonly
used functions. Others use constructs liks gid_t buffer[NGROUPS_MAX]
which is 256kB or stack strings with MAX_ARG_STRLEN.

This will become especially dangerous for suid binaries and the default
no limit for the stack size limit because those applications can be
tricked to consume a large portion of the stack and a single glibc call
could jump over the guard page. These attacks are not theoretical,
unfortunatelly.

Make those attacks less probable by increasing the stack guard gap
to 1MB (on systems with 4k pages; but make it depend on the page size
because systems with larger base pages might cap stack allocations in
the PAGE_SIZE units) which should cover larger alloca() and VLA stack
allocations. It is obviously not a full fix because the problem is
somehow inherent, but it should reduce attack space a lot.

One could argue that the gap size should be configurable from userspace,
but that can be done later when somebody finds that the new 1MB is wrong
for some special case applications.  For now, add a kernel command line
option (stack_guard_gap) to specify the stack gap size (in page units).

Implementation wise, first delete all the old code for stack guard page:
because although we could get away with accounting one extra page in a
stack vma, accounting a larger gap can break userspace - case in point,
a program run with "ulimit -S -v 20000" failed when the 1MB gap was
counted for RLIMIT_AS; similar problems could come with RLIMIT_MLOCK
and strict non-overcommit mode.

Instead of keeping gap inside the stack vma, maintain the stack guard
gap as a gap between vmas: using vm_start_gap() in place of vm_start
(or vm_end_gap() in place of vm_end if VM_GROWSUP) in just those few
places which need to respect the gap - mainly arch_get_unmapped_area(),
and and the vma tree's subtree_gap support for that.

Original-patch-by: Oleg Nesterov <oleg@redhat.com>
Original-patch-by: Michal Hocko <mhocko@suse.com>
Signed-off-by: Hugh Dickins <hughd@google.com>
[wt: backport to 4.11: adjust context]
[wt: backport to 4.9: adjust context ; kernel doc was not in admin-guide]
[wt: backport to 4.4: adjust context ; drop ppc hugetlb_radix changes]
[wt: backport to 3.18: adjust context ; no FOLL_POPULATE ;
     s390 uses generic arch_get_unmapped_area()]
[wt: backport to 3.16: adjust context]
[wt: backport to 3.10: adjust context ; code logic in PARISC's
     arch_get_unmapped_area() wasn't found ; code inserted into
     expand_upwards() and expand_downwards() runs under anon_vma lock;
     changes for gup.c:faultin_page go to memory.c:__get_user_pages()]
Signed-off-by: Willy Tarreau <w@1wt.eu>
---
 Documentation/kernel-parameters.txt |   7 ++
 arch/arc/mm/mmap.c                  |   2 +-
 arch/arm/mm/mmap.c                  |   4 +-
 arch/frv/mm/elf-fdpic.c             |   2 +-
 arch/mips/mm/mmap.c                 |   2 +-
 arch/powerpc/mm/slice.c             |   2 +-
 arch/sh/mm/mmap.c                   |   4 +-
 arch/sparc/kernel/sys_sparc_64.c    |   4 +-
 arch/sparc/mm/hugetlbpage.c         |   2 +-
 arch/tile/mm/hugetlbpage.c          |   2 +-
 arch/x86/kernel/sys_x86_64.c        |   4 +-
 arch/x86/mm/hugetlbpage.c           |   2 +-
 arch/xtensa/kernel/syscall.c        |   2 +-
 fs/hugetlbfs/inode.c                |   2 +-
 fs/proc/task_mmu.c                  |   4 -
 include/linux/mm.h                  |  54 ++++++------
 mm/memory.c                         |  52 +-----------
 mm/mmap.c                           | 161 +++++++++++++++++++++++-------------
 18 files changed, 155 insertions(+), 157 deletions(-)

diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index daf8382..ed0c7e3 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -2889,6 +2889,13 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
 	spia_pedr=
 	spia_peddr=
 
+	stack_guard_gap=	[MM]
+			override the default stack gap protection. The value
+			is in page units and it defines how many pages prior
+			to (for stacks growing down) resp. after (for stacks
+			growing up) the main stack are reserved for no other
+			mapping. Default value is 256 pages.
+
 	stacktrace	[FTRACE]
 			Enabled the stack tracer on boot up.
 
diff --git a/arch/arc/mm/mmap.c b/arch/arc/mm/mmap.c
index 2e06d56..cf4ae69 100644
--- a/arch/arc/mm/mmap.c
+++ b/arch/arc/mm/mmap.c
@@ -64,7 +64,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
 
 		vma = find_vma(mm, addr);
 		if (TASK_SIZE - len >= addr &&
-		    (!vma || addr + len <= vma->vm_start))
+		    (!vma || addr + len <= vm_start_gap(vma)))
 			return addr;
 	}
 
diff --git a/arch/arm/mm/mmap.c b/arch/arm/mm/mmap.c
index 5ef506c..984509e 100644
--- a/arch/arm/mm/mmap.c
+++ b/arch/arm/mm/mmap.c
@@ -89,7 +89,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
 
 		vma = find_vma(mm, addr);
 		if (TASK_SIZE - len >= addr &&
-		    (!vma || addr + len <= vma->vm_start))
+		    (!vma || addr + len <= vm_start_gap(vma)))
 			return addr;
 	}
 
@@ -140,7 +140,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
 			addr = PAGE_ALIGN(addr);
 		vma = find_vma(mm, addr);
 		if (TASK_SIZE - len >= addr &&
-				(!vma || addr + len <= vma->vm_start))
+				(!vma || addr + len <= vm_start_gap(vma)))
 			return addr;
 	}
 
diff --git a/arch/frv/mm/elf-fdpic.c b/arch/frv/mm/elf-fdpic.c
index 836f1470..efa59f1 100644
--- a/arch/frv/mm/elf-fdpic.c
+++ b/arch/frv/mm/elf-fdpic.c
@@ -74,7 +74,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi
 		addr = PAGE_ALIGN(addr);
 		vma = find_vma(current->mm, addr);
 		if (TASK_SIZE - len >= addr &&
-		    (!vma || addr + len <= vma->vm_start))
+		    (!vma || addr + len <= vm_start_gap(vma)))
 			goto success;
 	}
 
diff --git a/arch/mips/mm/mmap.c b/arch/mips/mm/mmap.c
index 7e5fe27..0bb4295 100644
--- a/arch/mips/mm/mmap.c
+++ b/arch/mips/mm/mmap.c
@@ -92,7 +92,7 @@ static unsigned long arch_get_unmapped_area_common(struct file *filp,
 
 		vma = find_vma(mm, addr);
 		if (TASK_SIZE - len >= addr &&
-		    (!vma || addr + len <= vma->vm_start))
+		    (!vma || addr + len <= vm_start_gap(vma)))
 			return addr;
 	}
 
diff --git a/arch/powerpc/mm/slice.c b/arch/powerpc/mm/slice.c
index 7ce9cf3..887365a 100644
--- a/arch/powerpc/mm/slice.c
+++ b/arch/powerpc/mm/slice.c
@@ -103,7 +103,7 @@ static int slice_area_is_free(struct mm_struct *mm, unsigned long addr,
 	if ((mm->task_size - len) < addr)
 		return 0;
 	vma = find_vma(mm, addr);
-	return (!vma || (addr + len) <= vma->vm_start);
+	return (!vma || (addr + len) <= vm_start_gap(vma));
 }
 
 static int slice_low_has_vma(struct mm_struct *mm, unsigned long slice)
diff --git a/arch/sh/mm/mmap.c b/arch/sh/mm/mmap.c
index 6777177..7df7d59 100644
--- a/arch/sh/mm/mmap.c
+++ b/arch/sh/mm/mmap.c
@@ -63,7 +63,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,
 
 		vma = find_vma(mm, addr);
 		if (TASK_SIZE - len >= addr &&
-		    (!vma || addr + len <= vma->vm_start))
+		    (!vma || addr + len <= vm_start_gap(vma)))
 			return addr;
 	}
 
@@ -113,7 +113,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
 
 		vma = find_vma(mm, addr);
 		if (TASK_SIZE - len >= addr &&
-		    (!vma || addr + len <= vma->vm_start))
+		    (!vma || addr + len <= vm_start_gap(vma)))
 			return addr;
 	}
 
diff --git a/arch/sparc/kernel/sys_sparc_64.c b/arch/sparc/kernel/sys_sparc_64.c
index 666510b..66e1047 100644
--- a/arch/sparc/kernel/sys_sparc_64.c
+++ b/arch/sparc/kernel/sys_sparc_64.c
@@ -119,7 +119,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi
 
 		vma = find_vma(mm, addr);
 		if (task_size - len >= addr &&
-		    (!vma || addr + len <= vma->vm_start))
+		    (!vma || addr + len <= vm_start_gap(vma)))
 			return addr;
 	}
 
@@ -182,7 +182,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
 
 		vma = find_vma(mm, addr);
 		if (task_size - len >= addr &&
-		    (!vma || addr + len <= vma->vm_start))
+		    (!vma || addr + len <= vm_start_gap(vma)))
 			return addr;
 	}
 
diff --git a/arch/sparc/mm/hugetlbpage.c b/arch/sparc/mm/hugetlbpage.c
index d2b5944..ce49370 100644
--- a/arch/sparc/mm/hugetlbpage.c
+++ b/arch/sparc/mm/hugetlbpage.c
@@ -118,7 +118,7 @@ hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
 		addr = ALIGN(addr, HPAGE_SIZE);
 		vma = find_vma(mm, addr);
 		if (task_size - len >= addr &&
-		    (!vma || addr + len <= vma->vm_start))
+		    (!vma || addr + len <= vm_start_gap(vma)))
 			return addr;
 	}
 	if (mm->get_unmapped_area == arch_get_unmapped_area)
diff --git a/arch/tile/mm/hugetlbpage.c b/arch/tile/mm/hugetlbpage.c
index 650ccff..c75eac7 100644
--- a/arch/tile/mm/hugetlbpage.c
+++ b/arch/tile/mm/hugetlbpage.c
@@ -297,7 +297,7 @@ unsigned long hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
 		addr = ALIGN(addr, huge_page_size(h));
 		vma = find_vma(mm, addr);
 		if (TASK_SIZE - len >= addr &&
-		    (!vma || addr + len <= vma->vm_start))
+		    (!vma || addr + len <= vm_start_gap(vma)))
 			return addr;
 	}
 	if (current->mm->get_unmapped_area == arch_get_unmapped_area)
diff --git a/arch/x86/kernel/sys_x86_64.c b/arch/x86/kernel/sys_x86_64.c
index 30277e2..d050393 100644
--- a/arch/x86/kernel/sys_x86_64.c
+++ b/arch/x86/kernel/sys_x86_64.c
@@ -127,7 +127,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
 		addr = PAGE_ALIGN(addr);
 		vma = find_vma(mm, addr);
 		if (end - len >= addr &&
-		    (!vma || addr + len <= vma->vm_start))
+		    (!vma || addr + len <= vm_start_gap(vma)))
 			return addr;
 	}
 
@@ -166,7 +166,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
 		addr = PAGE_ALIGN(addr);
 		vma = find_vma(mm, addr);
 		if (TASK_SIZE - len >= addr &&
-				(!vma || addr + len <= vma->vm_start))
+				(!vma || addr + len <= vm_start_gap(vma)))
 			return addr;
 	}
 
diff --git a/arch/x86/mm/hugetlbpage.c b/arch/x86/mm/hugetlbpage.c
index ae1aa71..6adf3d9 100644
--- a/arch/x86/mm/hugetlbpage.c
+++ b/arch/x86/mm/hugetlbpage.c
@@ -341,7 +341,7 @@ hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
 		addr = ALIGN(addr, huge_page_size(h));
 		vma = find_vma(mm, addr);
 		if (TASK_SIZE - len >= addr &&
-		    (!vma || addr + len <= vma->vm_start))
+		    (!vma || addr + len <= vm_start_gap(vma)))
 			return addr;
 	}
 	if (mm->get_unmapped_area == arch_get_unmapped_area)
diff --git a/arch/xtensa/kernel/syscall.c b/arch/xtensa/kernel/syscall.c
index 5d3f7a1..1ff0b92 100644
--- a/arch/xtensa/kernel/syscall.c
+++ b/arch/xtensa/kernel/syscall.c
@@ -86,7 +86,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr,
 		/* At this point:  (!vmm || addr < vmm->vm_end). */
 		if (TASK_SIZE - len < addr)
 			return -ENOMEM;
-		if (!vmm || addr + len <= vmm->vm_start)
+		if (!vmm || addr + len <= vm_start_gap(vmm))
 			return addr;
 		addr = vmm->vm_end;
 		if (flags & MAP_SHARED)
diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
index 4e5f332..db7d89c 100644
--- a/fs/hugetlbfs/inode.c
+++ b/fs/hugetlbfs/inode.c
@@ -169,7 +169,7 @@ hugetlb_get_unmapped_area(struct file *file, unsigned long addr,
 		addr = ALIGN(addr, huge_page_size(h));
 		vma = find_vma(mm, addr);
 		if (TASK_SIZE - len >= addr &&
-		    (!vma || addr + len <= vma->vm_start))
+		    (!vma || addr + len <= vm_start_gap(vma)))
 			return addr;
 	}
 
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
index b86db12..972cdc2 100644
--- a/fs/proc/task_mmu.c
+++ b/fs/proc/task_mmu.c
@@ -279,11 +279,7 @@ show_map_vma(struct seq_file *m, struct vm_area_struct *vma, int is_pid)
 
 	/* We don't show the stack guard page in /proc/maps */
 	start = vma->vm_start;
-	if (stack_guard_page_start(vma, start))
-		start += PAGE_SIZE;
 	end = vma->vm_end;
-	if (stack_guard_page_end(vma, end))
-		end -= PAGE_SIZE;
 
 	seq_printf(m, "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu %n",
 			start,
diff --git a/include/linux/mm.h b/include/linux/mm.h
index 55590f4..47f1604 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -1069,34 +1069,6 @@ int set_page_dirty(struct page *page);
 int set_page_dirty_lock(struct page *page);
 int clear_page_dirty_for_io(struct page *page);
 
-/* Is the vma a continuation of the stack vma above it? */
-static inline int vma_growsdown(struct vm_area_struct *vma, unsigned long addr)
-{
-	return vma && (vma->vm_end == addr) && (vma->vm_flags & VM_GROWSDOWN);
-}
-
-static inline int stack_guard_page_start(struct vm_area_struct *vma,
-					     unsigned long addr)
-{
-	return (vma->vm_flags & VM_GROWSDOWN) &&
-		(vma->vm_start == addr) &&
-		!vma_growsdown(vma->vm_prev, addr);
-}
-
-/* Is the vma a continuation of the stack vma below it? */
-static inline int vma_growsup(struct vm_area_struct *vma, unsigned long addr)
-{
-	return vma && (vma->vm_start == addr) && (vma->vm_flags & VM_GROWSUP);
-}
-
-static inline int stack_guard_page_end(struct vm_area_struct *vma,
-					   unsigned long addr)
-{
-	return (vma->vm_flags & VM_GROWSUP) &&
-		(vma->vm_end == addr) &&
-		!vma_growsup(vma->vm_next, addr);
-}
-
 extern pid_t
 vm_is_stack(struct task_struct *task, struct vm_area_struct *vma, int in_group);
 
@@ -1622,6 +1594,8 @@ unsigned long ra_submit(struct file_ra_state *ra,
 			struct address_space *mapping,
 			struct file *filp);
 
+extern unsigned long stack_guard_gap;
+
 /* Generic expand stack which grows the stack according to GROWS{UP,DOWN} */
 extern int expand_stack(struct vm_area_struct *vma, unsigned long address);
 
@@ -1650,6 +1624,30 @@ static inline struct vm_area_struct * find_vma_intersection(struct mm_struct * m
 	return vma;
 }
 
+static inline unsigned long vm_start_gap(struct vm_area_struct *vma)
+{
+	unsigned long vm_start = vma->vm_start;
+
+	if (vma->vm_flags & VM_GROWSDOWN) {
+		vm_start -= stack_guard_gap;
+		if (vm_start > vma->vm_start)
+			vm_start = 0;
+	}
+	return vm_start;
+}
+
+static inline unsigned long vm_end_gap(struct vm_area_struct *vma)
+{
+	unsigned long vm_end = vma->vm_end;
+
+	if (vma->vm_flags & VM_GROWSUP) {
+		vm_end += stack_guard_gap;
+		if (vm_end < vma->vm_end)
+			vm_end = -PAGE_SIZE;
+	}
+	return vm_end;
+}
+
 static inline unsigned long vma_pages(struct vm_area_struct *vma)
 {
 	return (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
diff --git a/mm/memory.c b/mm/memory.c
index 2ca2ee1..0508aef 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -1654,12 +1654,6 @@ no_page_table:
 	return page;
 }
 
-static inline int stack_guard_page(struct vm_area_struct *vma, unsigned long addr)
-{
-	return stack_guard_page_start(vma, addr) ||
-	       stack_guard_page_end(vma, addr+PAGE_SIZE);
-}
-
 /**
  * __get_user_pages() - pin user pages in memory
  * @tsk:	task_struct of target task
@@ -1827,11 +1821,9 @@ long __get_user_pages(struct task_struct *tsk, struct mm_struct *mm,
 				int ret;
 				unsigned int fault_flags = 0;
 
-				/* For mlock, just skip the stack guard page. */
-				if (foll_flags & FOLL_MLOCK) {
-					if (stack_guard_page(vma, start))
-						goto next_page;
-				}
+				/* mlock all present pages, but do not fault in new pages */
+				if (foll_flags & FOLL_MLOCK)
+					goto next_page;
 				if (foll_flags & FOLL_WRITE)
 					fault_flags |= FAULT_FLAG_WRITE;
 				if (nonblocking)
@@ -3192,40 +3184,6 @@ out_release:
 }
 
 /*
- * This is like a special single-page "expand_{down|up}wards()",
- * except we must first make sure that 'address{-|+}PAGE_SIZE'
- * doesn't hit another vma.
- */
-static inline int check_stack_guard_page(struct vm_area_struct *vma, unsigned long address)
-{
-	address &= PAGE_MASK;
-	if ((vma->vm_flags & VM_GROWSDOWN) && address == vma->vm_start) {
-		struct vm_area_struct *prev = vma->vm_prev;
-
-		/*
-		 * Is there a mapping abutting this one below?
-		 *
-		 * That's only ok if it's the same stack mapping
-		 * that has gotten split..
-		 */
-		if (prev && prev->vm_end == address)
-			return prev->vm_flags & VM_GROWSDOWN ? 0 : -ENOMEM;
-
-		return expand_downwards(vma, address - PAGE_SIZE);
-	}
-	if ((vma->vm_flags & VM_GROWSUP) && address + PAGE_SIZE == vma->vm_end) {
-		struct vm_area_struct *next = vma->vm_next;
-
-		/* As VM_GROWSDOWN but s/below/above/ */
-		if (next && next->vm_start == address + PAGE_SIZE)
-			return next->vm_flags & VM_GROWSUP ? 0 : -ENOMEM;
-
-		return expand_upwards(vma, address + PAGE_SIZE);
-	}
-	return 0;
-}
-
-/*
  * We enter with non-exclusive mmap_sem (to exclude vma changes,
  * but allow concurrent faults), and pte mapped but not yet locked.
  * We return with mmap_sem still held, but pte unmapped and unlocked.
@@ -3244,10 +3202,6 @@ static int do_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma,
 	if (vma->vm_flags & VM_SHARED)
 		return VM_FAULT_SIGBUS;
 
-	/* Check if we need to add a guard page to the stack */
-	if (check_stack_guard_page(vma, address) < 0)
-		return VM_FAULT_SIGSEGV;
-
 	/* Use the zero-page for reads */
 	if (!(flags & FAULT_FLAG_WRITE)) {
 		entry = pte_mkspecial(pfn_pte(my_zero_pfn(address),
diff --git a/mm/mmap.c b/mm/mmap.c
index 70ff9b4..62d3208 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -263,6 +263,7 @@ SYSCALL_DEFINE1(brk, unsigned long, brk)
 	unsigned long rlim, retval;
 	unsigned long newbrk, oldbrk;
 	struct mm_struct *mm = current->mm;
+	struct vm_area_struct *next;
 	unsigned long min_brk;
 	bool populate;
 
@@ -308,7 +309,8 @@ SYSCALL_DEFINE1(brk, unsigned long, brk)
 	}
 
 	/* Check against existing mmap mappings. */
-	if (find_vma_intersection(mm, oldbrk, newbrk+PAGE_SIZE))
+	next = find_vma(mm, oldbrk);
+	if (next && newbrk + PAGE_SIZE > vm_start_gap(next))
 		goto out;
 
 	/* Ok, looks good - let it rip. */
@@ -331,10 +333,22 @@ out:
 
 static long vma_compute_subtree_gap(struct vm_area_struct *vma)
 {
-	unsigned long max, subtree_gap;
-	max = vma->vm_start;
-	if (vma->vm_prev)
-		max -= vma->vm_prev->vm_end;
+	unsigned long max, prev_end, subtree_gap;
+
+	/*
+	 * Note: in the rare case of a VM_GROWSDOWN above a VM_GROWSUP, we
+	 * allow two stack_guard_gaps between them here, and when choosing
+	 * an unmapped area; whereas when expanding we only require one.
+	 * That's a little inconsistent, but keeps the code here simpler.
+	 */
+	max = vm_start_gap(vma);
+	if (vma->vm_prev) {
+		prev_end = vm_end_gap(vma->vm_prev);
+		if (max > prev_end)
+			max -= prev_end;
+		else
+			max = 0;
+	}
 	if (vma->vm_rb.rb_left) {
 		subtree_gap = rb_entry(vma->vm_rb.rb_left,
 				struct vm_area_struct, vm_rb)->rb_subtree_gap;
@@ -418,7 +432,7 @@ void validate_mm(struct mm_struct *mm)
 		list_for_each_entry(avc, &vma->anon_vma_chain, same_vma)
 			anon_vma_interval_tree_verify(avc);
 		vma_unlock_anon_vma(vma);
-		highest_address = vma->vm_end;
+		highest_address = vm_end_gap(vma);
 		vma = vma->vm_next;
 		i++;
 	}
@@ -586,7 +600,7 @@ void __vma_link_rb(struct mm_struct *mm, struct vm_area_struct *vma,
 	if (vma->vm_next)
 		vma_gap_update(vma->vm_next);
 	else
-		mm->highest_vm_end = vma->vm_end;
+		mm->highest_vm_end = vm_end_gap(vma);
 
 	/*
 	 * vma->vm_prev wasn't known when we followed the rbtree to find the
@@ -835,7 +849,7 @@ again:			remove_next = 1 + (end > next->vm_end);
 			vma_gap_update(vma);
 		if (end_changed) {
 			if (!next)
-				mm->highest_vm_end = end;
+				mm->highest_vm_end = vm_end_gap(vma);
 			else if (!adjust_next)
 				vma_gap_update(next);
 		}
@@ -1670,7 +1684,7 @@ unsigned long unmapped_area(struct vm_unmapped_area_info *info)
 
 	while (true) {
 		/* Visit left subtree if it looks promising */
-		gap_end = vma->vm_start;
+		gap_end = vm_start_gap(vma);
 		if (gap_end >= low_limit && vma->vm_rb.rb_left) {
 			struct vm_area_struct *left =
 				rb_entry(vma->vm_rb.rb_left,
@@ -1681,7 +1695,7 @@ unsigned long unmapped_area(struct vm_unmapped_area_info *info)
 			}
 		}
 
-		gap_start = vma->vm_prev ? vma->vm_prev->vm_end : 0;
+		gap_start = vma->vm_prev ? vm_end_gap(vma->vm_prev) : 0;
 check_current:
 		/* Check if current node has a suitable gap */
 		if (gap_start > high_limit)
@@ -1708,8 +1722,8 @@ check_current:
 			vma = rb_entry(rb_parent(prev),
 				       struct vm_area_struct, vm_rb);
 			if (prev == vma->vm_rb.rb_left) {
-				gap_start = vma->vm_prev->vm_end;
-				gap_end = vma->vm_start;
+				gap_start = vm_end_gap(vma->vm_prev);
+				gap_end = vm_start_gap(vma);
 				goto check_current;
 			}
 		}
@@ -1773,7 +1787,7 @@ unsigned long unmapped_area_topdown(struct vm_unmapped_area_info *info)
 
 	while (true) {
 		/* Visit right subtree if it looks promising */
-		gap_start = vma->vm_prev ? vma->vm_prev->vm_end : 0;
+		gap_start = vma->vm_prev ? vm_end_gap(vma->vm_prev) : 0;
 		if (gap_start <= high_limit && vma->vm_rb.rb_right) {
 			struct vm_area_struct *right =
 				rb_entry(vma->vm_rb.rb_right,
@@ -1786,7 +1800,7 @@ unsigned long unmapped_area_topdown(struct vm_unmapped_area_info *info)
 
 check_current:
 		/* Check if current node has a suitable gap */
-		gap_end = vma->vm_start;
+		gap_end = vm_start_gap(vma);
 		if (gap_end < low_limit)
 			return -ENOMEM;
 		if (gap_start <= high_limit && gap_end - gap_start >= length)
@@ -1812,7 +1826,7 @@ check_current:
 				       struct vm_area_struct, vm_rb);
 			if (prev == vma->vm_rb.rb_right) {
 				gap_start = vma->vm_prev ?
-					vma->vm_prev->vm_end : 0;
+					vm_end_gap(vma->vm_prev) : 0;
 				goto check_current;
 			}
 		}
@@ -1850,7 +1864,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
 		unsigned long len, unsigned long pgoff, unsigned long flags)
 {
 	struct mm_struct *mm = current->mm;
-	struct vm_area_struct *vma;
+	struct vm_area_struct *vma, *prev;
 	struct vm_unmapped_area_info info;
 
 	if (len > TASK_SIZE - mmap_min_addr)
@@ -1861,9 +1875,10 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
 
 	if (addr) {
 		addr = PAGE_ALIGN(addr);
-		vma = find_vma(mm, addr);
+		vma = find_vma_prev(mm, addr, &prev);
 		if (TASK_SIZE - len >= addr && addr >= mmap_min_addr &&
-		    (!vma || addr + len <= vma->vm_start))
+		    (!vma || addr + len <= vm_start_gap(vma)) &&
+		    (!prev || addr >= vm_end_gap(prev)))
 			return addr;
 	}
 
@@ -1895,7 +1910,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
 			  const unsigned long len, const unsigned long pgoff,
 			  const unsigned long flags)
 {
-	struct vm_area_struct *vma;
+	struct vm_area_struct *vma, *prev;
 	struct mm_struct *mm = current->mm;
 	unsigned long addr = addr0;
 	struct vm_unmapped_area_info info;
@@ -1910,9 +1925,10 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
 	/* requesting a specific address */
 	if (addr) {
 		addr = PAGE_ALIGN(addr);
-		vma = find_vma(mm, addr);
+		vma = find_vma_prev(mm, addr, &prev);
 		if (TASK_SIZE - len >= addr && addr >= mmap_min_addr &&
-				(!vma || addr + len <= vma->vm_start))
+				(!vma || addr + len <= vm_start_gap(vma)) &&
+				(!prev || addr >= vm_end_gap(prev)))
 			return addr;
 	}
 
@@ -2052,21 +2068,19 @@ find_vma_prev(struct mm_struct *mm, unsigned long addr,
  * update accounting. This is shared with both the
  * grow-up and grow-down cases.
  */
-static int acct_stack_growth(struct vm_area_struct *vma, unsigned long size, unsigned long grow)
+static int acct_stack_growth(struct vm_area_struct *vma,
+			     unsigned long size, unsigned long grow)
 {
 	struct mm_struct *mm = vma->vm_mm;
 	struct rlimit *rlim = current->signal->rlim;
-	unsigned long new_start, actual_size;
+	unsigned long new_start;
 
 	/* address space limit tests */
 	if (!may_expand_vm(mm, grow))
 		return -ENOMEM;
 
 	/* Stack limit test */
-	actual_size = size;
-	if (size && (vma->vm_flags & (VM_GROWSUP | VM_GROWSDOWN)))
-		actual_size -= PAGE_SIZE;
-	if (actual_size > ACCESS_ONCE(rlim[RLIMIT_STACK].rlim_cur))
+	if (size > ACCESS_ONCE(rlim[RLIMIT_STACK].rlim_cur))
 		return -ENOMEM;
 
 	/* mlock limit tests */
@@ -2107,6 +2121,8 @@ static int acct_stack_growth(struct vm_area_struct *vma, unsigned long size, uns
  */
 int expand_upwards(struct vm_area_struct *vma, unsigned long address)
 {
+	struct vm_area_struct *next;
+	unsigned long gap_addr;
 	int error;
 
 	if (!(vma->vm_flags & VM_GROWSUP))
@@ -2126,14 +2142,29 @@ int expand_upwards(struct vm_area_struct *vma, unsigned long address)
 	 * anon_vma lock to serialize against concurrent expand_stacks.
 	 * Also guard against wrapping around to address 0.
 	 */
-	if (address < PAGE_ALIGN(address+4))
-		address = PAGE_ALIGN(address+4);
-	else {
+	address &= PAGE_MASK;
+	address += PAGE_SIZE;
+	if (!address) {
 		vma_unlock_anon_vma(vma);
 		return -ENOMEM;
 	}
 	error = 0;
 
+	/* Enforce stack_guard_gap */
+	gap_addr = address + stack_guard_gap;
+	if (gap_addr < address) {
+		vma_unlock_anon_vma(vma);
+		return -ENOMEM;
+	}
+	next = vma->vm_next;
+	if (next && next->vm_start < gap_addr) {
+		if (!(next->vm_flags & VM_GROWSUP)) {
+			vma_unlock_anon_vma(vma);
+			return -ENOMEM;
+		}
+		/* Check that both stack segments have the same anon_vma? */
+	}
+
 	/* Somebody else might have raced and expanded it already */
 	if (address > vma->vm_end) {
 		unsigned long size, grow;
@@ -2163,7 +2194,7 @@ int expand_upwards(struct vm_area_struct *vma, unsigned long address)
 				if (vma->vm_next)
 					vma_gap_update(vma->vm_next);
 				else
-					vma->vm_mm->highest_vm_end = address;
+					vma->vm_mm->highest_vm_end = vm_end_gap(vma);
 				spin_unlock(&vma->vm_mm->page_table_lock);
 
 				perf_event_mmap(vma);
@@ -2183,6 +2214,8 @@ int expand_upwards(struct vm_area_struct *vma, unsigned long address)
 int expand_downwards(struct vm_area_struct *vma,
 				   unsigned long address)
 {
+	struct vm_area_struct *prev;
+	unsigned long gap_addr;
 	int error;
 
 	/*
@@ -2199,6 +2232,27 @@ int expand_downwards(struct vm_area_struct *vma,
 
 	vma_lock_anon_vma(vma);
 
+	/* Enforce stack_guard_gap */
+	gap_addr = address - stack_guard_gap;
+	if (gap_addr > address) {
+		vma_unlock_anon_vma(vma);
+		return -ENOMEM;
+	}
+	prev = vma->vm_prev;
+	if (prev && prev->vm_end > gap_addr) {
+		if (!(prev->vm_flags & VM_GROWSDOWN)) {
+			vma_unlock_anon_vma(vma);
+			return -ENOMEM;
+		}
+		/* Check that both stack segments have the same anon_vma? */
+	}
+
+	/* We must make sure the anon_vma is allocated. */
+	if (unlikely(anon_vma_prepare(vma))) {
+		vma_unlock_anon_vma(vma);
+		return -ENOMEM;
+	}
+
 	/*
 	 * vma->vm_start/vm_end cannot change under us because the caller
 	 * is required to hold the mmap_sem in read mode.  We need the
@@ -2245,28 +2299,25 @@ int expand_downwards(struct vm_area_struct *vma,
 	return error;
 }
 
-/*
- * Note how expand_stack() refuses to expand the stack all the way to
- * abut the next virtual mapping, *unless* that mapping itself is also
- * a stack mapping. We want to leave room for a guard page, after all
- * (the guard page itself is not added here, that is done by the
- * actual page faulting logic)
- *
- * This matches the behavior of the guard page logic (see mm/memory.c:
- * check_stack_guard_page()), which only allows the guard page to be
- * removed under these circumstances.
- */
+/* enforced gap between the expanding stack and other mappings. */
+unsigned long stack_guard_gap = 256UL<<PAGE_SHIFT;
+
+static int __init cmdline_parse_stack_guard_gap(char *p)
+{
+	unsigned long val;
+	char *endptr;
+
+	val = simple_strtoul(p, &endptr, 10);
+	if (!*endptr)
+		stack_guard_gap = val << PAGE_SHIFT;
+
+	return 0;
+}
+__setup("stack_guard_gap=", cmdline_parse_stack_guard_gap);
+
 #ifdef CONFIG_STACK_GROWSUP
 int expand_stack(struct vm_area_struct *vma, unsigned long address)
 {
-	struct vm_area_struct *next;
-
-	address &= PAGE_MASK;
-	next = vma->vm_next;
-	if (next && next->vm_start == address + PAGE_SIZE) {
-		if (!(next->vm_flags & VM_GROWSUP))
-			return -ENOMEM;
-	}
 	return expand_upwards(vma, address);
 }
 
@@ -2288,14 +2339,6 @@ find_extend_vma(struct mm_struct *mm, unsigned long addr)
 #else
 int expand_stack(struct vm_area_struct *vma, unsigned long address)
 {
-	struct vm_area_struct *prev;
-
-	address &= PAGE_MASK;
-	prev = vma->vm_prev;
-	if (prev && prev->vm_end == address) {
-		if (!(prev->vm_flags & VM_GROWSDOWN))
-			return -ENOMEM;
-	}
 	return expand_downwards(vma, address);
 }
 
@@ -2392,7 +2435,7 @@ detach_vmas_to_be_unmapped(struct mm_struct *mm, struct vm_area_struct *vma,
 		vma->vm_prev = prev;
 		vma_gap_update(vma);
 	} else
-		mm->highest_vm_end = prev ? prev->vm_end : 0;
+		mm->highest_vm_end = prev ? vm_end_gap(prev) : 0;
 	tail_vma->vm_next = NULL;
 	if (mm->unmap_area == arch_unmap_area)
 		addr = prev ? prev->vm_end : mm->mmap_base;
-- 
2.8.0.rc2.1.gbe9624a

  parent reply	other threads:[~2017-06-19 19:28 UTC|newest]

Thread overview: 287+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-19 18:28 [PATCH 3.10 000/268] 3.10.107-stable review Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 001/268] Revert "Btrfs: don't delay inode ref updates during log, replay" Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 002/268] Btrfs: fix memory leak in reading btree blocks Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 003/268] ext4: use more strict checks for inodes_per_block on mount Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 004/268] ext4: fix in-superblock mount options processing Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 005/268] ext4: add sanity checking to count_overhead() Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 006/268] ext4: validate s_first_meta_bg at mount time Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 007/268] jbd2: don't leak modified metadata buffers on an aborted journal Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 008/268] ext4: fix fencepost in s_first_meta_bg validation Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 009/268] ext4: trim allocation requests to group size Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 010/268] ext4: preserve the needs_recovery flag when the journal is aborted Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 011/268] ext4: return EROFS if device is r/o and journal replay is needed Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 012/268] ext4: fix inode checksum calculation problem if i_extra_size is small Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 013/268] block: fix use-after-free in sys_ioprio_get() Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 014/268] block: allow WRITE_SAME commands with the SG_IO ioctl Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 015/268] block: fix del_gendisk() vs blkdev_ioctl crash Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 016/268] dm crypt: mark key as invalid until properly loaded Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 017/268] dm space map metadata: fix 'struct sm_metadata' leak on failed create Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 018/268] md/raid5: limit request size according to implementation limits Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 019/268] md:raid1: fix a dead loop when read from a WriteMostly disk Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 020/268] md linear: fix a race between linear_add() and linear_congested() Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 021/268] CIFS: Fix a possible memory corruption during reconnect Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 022/268] CIFS: Fix missing nls unload in smb2_reconnect() Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 023/268] CIFS: Fix a possible memory corruption in push locks Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 024/268] CIFS: remove bad_network_name flag Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 025/268] fs/cifs: make share unaccessible at root level mountable Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 026/268] cifs: Do not send echoes before Negotiate is complete Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 027/268] ocfs2: fix crash caused by stale lvb with fsdlm plugin Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 028/268] ocfs2: fix BUG_ON() in ocfs2_ci_checkpointed() Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 029/268] can: raw: raw_setsockopt: limit number of can_filter that can be set Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 030/268] can: peak: fix bad memory access and free sequence Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 031/268] can: c_can_pci: fix null-pointer-deref in c_can_start() - set device pointer Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 032/268] can: ti_hecc: add missing prepare and unprepare of the clock Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 033/268] can: bcm: fix hrtimer/tasklet termination in bcm op removal Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 034/268] can: usb_8dev: Fix memory leak of priv->cmd_msg_buffer Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 035/268] ALSA: hda - Fix up GPIO for ASUS ROG Ranger Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 036/268] ALSA: seq: Fix race at creating a queue Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 037/268] ALSA: seq: Don't handle loop timeout at snd_seq_pool_done() Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 038/268] ALSA: timer: Reject user params with too small ticks Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 039/268] ALSA: seq: Fix link corruption by event error handling Willy Tarreau
2017-06-19 18:28 ` [PATCH 3.10 040/268] ALSA: seq: Fix racy cell insertions during snd_seq_pool_done() Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 041/268] ALSA: seq: Fix race during FIFO resize Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 042/268] ALSA: seq: Don't break snd_use_lock_sync() loop by timeout Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 043/268] ALSA: usb-audio: Add QuickCam Communicate Deluxe/S7500 to volume_control_quirks Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 044/268] usb: gadgetfs: restrict upper bound on device configuration size Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 045/268] USB: gadgetfs: fix unbounded memory allocation bug Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 046/268] USB: gadgetfs: fix use-after-free bug Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 047/268] USB: gadgetfs: fix checks of wTotalLength in config descriptors Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 048/268] xhci: free xhci virtual devices with leaf nodes first Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 049/268] USB: serial: io_ti: bind to interface after fw download Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 050/268] usb: gadget: composite: always set ep->mult to a sensible value Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 051/268] USB: cdc-acm: fix double usb_autopm_put_interface() in acm_port_activate() Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 052/268] USB: cdc-acm: fix open and suspend race Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 053/268] USB: cdc-acm: fix failed open not being detected Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 054/268] usb: dwc3: gadget: make Set Endpoint Configuration macros safe Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 055/268] usb: host: xhci-plat: Fix timeout on removal of hot pluggable xhci controllers Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 056/268] usb: dwc3: gadget: delay unmap of bounced requests Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 057/268] usb: hub: Wait for connection to be reestablished after port reset Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 058/268] usb: gadget: composite: correctly initialize ep->maxpacket Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 059/268] USB: UHCI: report non-PME wakeup signalling for Intel hardware Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 060/268] xen/gntdev: Use VM_MIXEDMAP instead of VM_IO to avoid NUMA balancing Willy Tarreau
2017-06-20  2:57   ` Hugh Dickins
2017-06-20  5:34     ` Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 061/268] arm/xen: Use alloc_percpu rather than __alloc_percpu Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 062/268] xfs: set AGI buffer type in xlog_recover_clear_agi_bucket Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 063/268] xfs: clear _XBF_PAGES from buffers when readahead page Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 064/268] ssb: Fix error routine when fallback SPROM fails Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 065/268] drivers/gpu/drm/ast: Fix infinite loop if read fails Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 066/268] scsi: avoid a permanent stop of the scsi device's request queue Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 067/268] scsi: move the nr_phys_segments assert into scsi_init_io Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 068/268] scsi: don't BUG_ON() empty DMA transfers Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 069/268] scsi: storvsc: properly handle SRB_ERROR when sense message is present Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 070/268] scsi: storvsc: properly set residual data length on errors Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 071/268] target/pscsi: Fix TYPE_TAPE + TYPE_MEDIMUM_CHANGER export Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 072/268] scsi: lpfc: Add shutdown method for kexec Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 073/268] scsi: sr: Sanity check returned mode data Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 074/268] scsi: sd: Fix capacity calculation with 32-bit sector_t Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 075/268] s390/vmlogrdr: fix IUCV buffer allocation Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 076/268] libceph: verify authorize reply on connect Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 077/268] nfs_write_end(): fix handling of short copies Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 078/268] powerpc/ps3: Fix system hang with GCC 5 builds Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 079/268] sg_write()/bsg_write() is not fit to be called under KERNEL_DS Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 080/268] ftrace/x86: Set ftrace_stub to weak to prevent gcc from using short jumps to it Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 081/268] cred/userns: define current_user_ns() as a function Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 082/268] net: ti: cpmac: Fix compiler warning due to type confusion Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 083/268] tick/broadcast: Prevent NULL pointer dereference Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 084/268] netvsc: reduce maximum GSO size Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 085/268] drop_monitor: add missing call to genlmsg_end Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 086/268] drop_monitor: consider inserted data in genlmsg_end Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 087/268] igmp: Make igmp group member RFC 3376 compliant Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 088/268] HID: hid-cypress: validate length of report Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 089/268] Input: xpad - use correct product id for x360w controllers Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 090/268] Input: i8042 - add noloop quirk for Dell Embedded Box PC 3000 Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 091/268] Input: iforce - validate number of endpoints before using them Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 092/268] Input: kbtab " Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 093/268] Input: joydev - do not report stale values on first open Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 094/268] Input: tca8418 - use the interrupt trigger from the device tree Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 095/268] Input: mpr121 - handle multiple bits change of status register Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 096/268] Input: mpr121 - set missing event capability Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 097/268] Input: i8042 - add Clevo P650RS to the i8042 reset list Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 098/268] i2c: fix kernel memory disclosure in dev interface Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 099/268] vme: Fix wrong pointer utilization in ca91cx42_slave_get Willy Tarreau
2017-06-19 18:29 ` [PATCH 3.10 100/268] sysrq: attach sysrq handler correctly for 32-bit kernel Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 101/268] pinctrl: sh-pfc: Do not unconditionally support PIN_CONFIG_BIAS_DISABLE Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 102/268] x86/PCI: Ignore _CRS on Supermicro X8DTH-i/6/iF/6F Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 103/268] qla2xxx: Fix crash due to null pointer access Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 104/268] ARM: 8634/1: hw_breakpoint: blacklist Scorpion CPUs Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 105/268] ARM: dts: da850-evm: fix read access to SPI flash Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 106/268] NFSv4: Ensure nfs_atomic_open set the dentry verifier on ENOENT Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 107/268] vmxnet3: Wake queue from reset work Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 108/268] Fix memory leaks in cifs_do_mount() Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 109/268] Compare prepaths when comparing superblocks Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 110/268] Move check for prefix path to within cifs_get_root() Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 111/268] Fix regression which breaks DFS mounting Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 112/268] apparmor: fix uninitialized lsm_audit member Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 113/268] apparmor: exec should not be returning ENOENT when it denies Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 114/268] apparmor: fix disconnected bind mnts reconnection Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 115/268] apparmor: internal paths should be treated as disconnected Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 116/268] apparmor: check that xindex is in trans_table bounds Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 117/268] apparmor: add missing id bounds check on dfa verification Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 118/268] apparmor: don't check for vmalloc_addr if kvzalloc() failed Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 119/268] apparmor: fix oops in profile_unpack() when policy_db is not present Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 120/268] apparmor: fix module parameters can be changed after policy is locked Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 121/268] apparmor: do not expose kernel stack Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 122/268] vfio/pci: Fix integer overflows, bitmask check Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 123/268] bna: Add synchronization for tx ring Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 124/268] sg: Fix double-free when drives detach during SG_IO Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 125/268] move the call of __d_drop(anon) into __d_materialise_unique(dentry, anon) Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 126/268] serial: 8250_pci: Detach low-level driver during PCI error recovery Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 127/268] bnx2x: Correct ringparam estimate when DOWN Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 128/268] tile/ptrace: Preserve previous registers for short regset write Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 129/268] sysctl: fix proc_doulongvec_ms_jiffies_minmax() Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 130/268] ISDN: eicon: silence misleading array-bounds warning Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 131/268] ARC: [arcompact] handle unaligned access delay slot corner case Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 132/268] parisc: Don't use BITS_PER_LONG in userspace-exported swab.h header Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 133/268] nfs: Don't increment lock sequence ID after NFS4ERR_MOVED Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 134/268] ipv6: addrconf: Avoid addrconf_disable_change() using RCU read-side lock Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 135/268] af_unix: move unix_mknod() out of bindlock Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 136/268] drm/nouveau/nv1a,nv1f/disp: fix memory clock rate retrieval Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 137/268] crypto: api - Clear CRYPTO_ALG_DEAD bit before registering an alg Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 138/268] ata: sata_mv:- Handle return value of devm_ioremap Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 139/268] mm/memory_hotplug.c: check start_pfn in test_pages_in_a_zone() Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 140/268] mm, fs: check for fatal signals in do_generic_file_read() Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 141/268] ARC: [arcompact] brown paper bag bug in unaligned access delay slot fixup Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 142/268] sched/debug: Don't dump sched debug info in SysRq-W Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 143/268] tcp: fix 0 divide in __tcp_select_window() Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 144/268] macvtap: read vnet_hdr_size once Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 145/268] packet: round up linear to header len Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 146/268] vfs: fix uninitialized flags in splice_to_pipe() Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 147/268] siano: make it work again with CONFIG_VMAP_STACK Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 148/268] futex: Move futex_init() to core_initcall Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 149/268] rtc: interface: ignore expired timers when enqueuing new timers Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 150/268] irda: Fix lockdep annotations in hashbin_delete() Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 151/268] tty: serial: msm: Fix module autoload Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 152/268] rtlwifi: rtl_usb: Fix for URB leaking when doing ifconfig up/down Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 153/268] af_packet: remove a stray tab in packet_set_ring() Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 154/268] MIPS: Fix special case in 64 bit IP checksumming Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 155/268] mm: vmpressure: fix sending wrong events on underflow Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 156/268] ipc/shm: Fix shmat mmap nil-page protection Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 157/268] sd: get disk reference in sd_check_events() Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 158/268] samples/seccomp: fix 64-bit comparison macros Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 159/268] ath5k: drop bogus warning on drv_set_key with unsupported cipher Willy Tarreau
2017-06-19 18:30 ` [PATCH 3.10 160/268] rdma_cm: fail iwarp accepts w/o connection params Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 161/268] NFSv4: fix getacl ERANGE for some ACL buffer sizes Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 162/268] bcma: use (get|put)_device when probing/removing device driver Willy Tarreau
2017-06-20  5:12   ` Kalle Valo
2017-06-20  6:14     ` Willy Tarreau
2017-06-20  7:31       ` Rafał Miłecki
2017-06-20  7:58         ` Willy Tarreau
2017-06-20  8:14           ` Rafał Miłecki
2017-06-20  8:18             ` Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 163/268] powerpc/xmon: Fix data-breakpoint Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 164/268] KVM: VMX: use correct vmcs_read/write for guest segment selector/base Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 165/268] KVM: PPC: Book3S PR: Fix illegal opcode emulation Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 166/268] s390: TASK_SIZE for kernel threads Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 167/268] xtensa: move parse_tag_fdt out of #ifdef CONFIG_BLK_DEV_INITRD Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 168/268] mac80211: flush delayed work when entering suspend Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 169/268] drm/ast: Fix test for VGA enabled Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 170/268] drm/ttm: Make sure BOs being swapped out are cacheable Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 171/268] fat: fix using uninitialized fields of fat_inode/fsinfo_inode Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 172/268] drivers: hv: Turn off write permission on the hypercall page Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 173/268] xhci: fix 10 second timeout on removal of PCI hotpluggable xhci controllers Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 174/268] crypto: improve gcc optimization flags for serpent and wp512 Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 175/268] mtd: pmcmsp: use kstrndup instead of kmalloc+strncpy Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 176/268] cpmac: remove hopeless #warning Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 177/268] mvsas: fix misleading indentation Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 178/268] l2tp: avoid use-after-free caused by l2tp_ip_backlog_recv Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 179/268] net: don't call strlen() on the user buffer in packet_bind_spkt() Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 180/268] dccp: Unlock sock before calling sk_free() Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 181/268] tcp: fix various issues for sockets morphing to listen state Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 182/268] uapi: fix linux/packet_diag.h userspace compilation error Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 183/268] ipv6: avoid write to a possibly cloned skb Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 184/268] dccp: fix memory leak during tear-down of unsuccessful connection request Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 185/268] futex: Fix potential use-after-free in FUTEX_REQUEUE_PI Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 186/268] futex: Add missing error handling to FUTEX_REQUEUE_PI Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 187/268] give up on gcc ilog2() constant optimizations Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 188/268] cancel the setfilesize transation when io error happen Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 189/268] crypto: ghash-clmulni - Fix load failure Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 190/268] crypto: cryptd - Assign statesize properly Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 191/268] ACPI / video: skip evaluating _DOD when it does not exist Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 192/268] Drivers: hv: balloon: don't crash when memory is added in non-sorted order Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 193/268] s390/pci: fix use after free in dma_init Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 194/268] cpufreq: Fix and clean up show_cpuinfo_cur_freq() Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 195/268] igb: Workaround for igb i210 firmware issue Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 196/268] igb: add i211 to i210 PHY workaround Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 197/268] ipv4: provide stronger user input validation in nl_fib_input() Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 198/268] tcp: initialize icsk_ack.lrcvtime at session start time Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 199/268] ACM gadget: fix endianness in notifications Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 200/268] mmc: sdhci: Do not disable interrupts while waiting for clock Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 201/268] uvcvideo: uvc_scan_fallback() for webcams with broken chain Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 202/268] fbcon: Fix vc attr at deinit Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 203/268] crypto: algif_hash - avoid zero-sized array Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 204/268] virtio_balloon: init 1st buffer in stats vq Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 205/268] c6x/ptrace: Remove useless PTRACE_SETREGSET implementation Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 206/268] sparc/ptrace: Preserve previous registers for short regset write Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 207/268] metag/ptrace: " Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 208/268] metag/ptrace: Provide default TXSTATUS for short NT_PRSTATUS Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 209/268] metag/ptrace: Reject partial NT_METAG_RPIPE writes Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 210/268] libceph: force GFP_NOIO for socket allocations Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 211/268] ACPI: Fix incompatibility with mcount-based function graph tracing Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 212/268] ACPI / power: Avoid maybe-uninitialized warning Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 213/268] rtc: s35390a: make sure all members in the output are set Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 214/268] rtc: s35390a: implement reset routine as suggested by the reference Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 215/268] rtc: s35390a: improve irq handling Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 216/268] padata: avoid race in reordering Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 217/268] HID: hid-lg: Fix immediate disconnection of Logitech Rumblepad 2 Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 218/268] HID: i2c-hid: Add sleep between POWER ON and RESET Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 219/268] tty/serial: atmel: fix race condition (TX+DMA) Willy Tarreau
2017-06-20  7:04   ` Richard Genoud
2017-06-20  7:24     ` Willy Tarreau
2017-06-19 18:31 ` [PATCH 3.10 220/268] drm/vmwgfx: NULL pointer dereference in vmw_surface_define_ioctl() Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 221/268] drm/vmwgfx: avoid calling vzalloc with a 0 size in vmw_get_cap_3d_ioctl() Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 222/268] drm/vmwgfx: Remove getparam error message Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 223/268] drm/vmwgfx: fix integer overflow in vmw_surface_define_ioctl() Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 224/268] Reset TreeId to zero on SMB2 TREE_CONNECT Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 225/268] metag/usercopy: Drop unused macros Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 226/268] metag/usercopy: Zero rest of buffer from copy_from_user Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 227/268] powerpc: Don't try to fix up misaligned load-with-reservation instructions Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 228/268] mm/mempolicy.c: fix error handling in set_mempolicy and mbind Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 229/268] mtd: bcm47xxpart: fix parsing first block after aligned TRX Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 230/268] net/packet: fix overflow in check for priv area size Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 231/268] x86/vdso: Plug race between mapping and ELF header setup Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 232/268] iscsi-target: Fix TMR reference leak during session shutdown Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 233/268] iscsi-target: Drop work-around for legacy GlobalSAN initiator Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 234/268] xen, fbfront: fix connecting to backend Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 235/268] char: lack of bool string made CONFIG_DEVPORT always on Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 236/268] platform/x86: acer-wmi: setup accelerometer when machine has appropriate notify event Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 237/268] platform/x86: acer-wmi: setup accelerometer when ACPI device was found Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 238/268] mm: Tighten x86 /dev/mem with zeroing reads Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 239/268] virtio-console: avoid DMA from stack Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 240/268] catc: Combine failure cleanup code in catc_probe() Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 241/268] catc: Use heap buffer for memory size test Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 242/268] net: ipv6: check route protocol when deleting routes Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 243/268] Drivers: hv: don't leak memory in vmbus_establish_gpadl() Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 244/268] Drivers: hv: get rid of timeout in vmbus_open() Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 245/268] ubi/upd: Always flush after prepared for an update Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 246/268] x86/mce/AMD: Give a name to MCA bank 3 when accessed with legacy MSRs Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 247/268] powerpc: Reject binutils 2.24 when building little endian Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 248/268] net/packet: fix overflow in check for tp_frame_nr Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 249/268] net/packet: fix overflow in check for tp_reserve Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 250/268] tty: nozomi: avoid a harmless gcc warning Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 251/268] hostap: avoid uninitialized variable use in hfa384x_get_rid Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 252/268] gfs2: avoid uninitialized variable warning Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 253/268] net: neigh: guard against NULL solicit() method Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 254/268] sctp: listen on the sock only when it's state is listening or closed Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 255/268] ip6mr: fix notification device destruction Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 256/268] MIPS: Fix crash registers on non-crashing CPUs Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 257/268] RDS: Fix the atomicity for congestion map update Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 258/268] xen/x86: don't lose event interrupts Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 259/268] p9_client_readdir() fix Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 260/268] nfsd: check for oversized NFSv2/v3 arguments Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 261/268] ftrace/x86: Fix triple fault with graph tracing and suspend-to-ram Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 262/268] kvm: nVMX: Allow L1 to intercept software exceptions (#BP and #OF) Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 263/268] tun: read vnet_hdr_sz once Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 264/268] printk: use rcuidle console tracepoint Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 265/268] ipv6: check raw payload size correctly in ioctl Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 266/268] x86: standardize mmap_rnd() usage Willy Tarreau
2017-06-19 18:32 ` [PATCH 3.10 267/268] x86/mm/32: Enable full randomization on i386 and X86_32 Willy Tarreau
2017-06-19 18:32 ` Willy Tarreau [this message]
2017-06-21  7:05   ` [PATCH 3.10 268/268] mm: larger stack guard gap, between vmas Hugh Dickins
2017-06-21  7:18     ` Willy Tarreau
2017-06-21 16:01       ` Willy Tarreau
2017-06-19 22:46 ` [PATCH 3.10 000/268] 3.10.107-stable review Guenter Roeck
2017-06-19 22:51   ` Willy Tarreau
2017-06-20  6:17     ` Willy Tarreau
2017-06-20  9:10       ` Guenter Roeck
2017-06-20  9:26         ` Willy Tarreau

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1497897167-14556-269-git-send-email-w@1wt.eu \
    --to=w@1wt.eu \
    --cc=hughd@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@roeck-us.net \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®