Skip to content

Commit d782437

Browse files
committed
mm: fix up some user-visible effects of the stack guard page
This commit makes the stack guard page somewhat less visible to user space. It does this by: - not showing the guard page in /proc/<pid>/maps It looks like lvm-tools will actually read /proc/self/maps to figure out where all its mappings are, and effectively do a specialized "mlockall()" in user space. By not showing the guard page as part of the mapping (by just adding PAGE_SIZE to the start for grows-up pages), lvm-tools ends up not being aware of it. - by also teaching the _real_ mlock() functionality not to try to lock the guard page. That would just expand the mapping down to create a new guard page, so there really is no point in trying to lock it in place. It would perhaps be nice to show the guard page specially in /proc/<pid>/maps (or at least mark grow-down segments some way), but let's not open ourselves up to more breakage by user space from programs that depends on the exact deails of the 'maps' file. Special thanks to Henrique de Moraes Holschuh for diving into lvm-tools source code to see what was going on with the whole new warning. Reported-and-tested-by: François Valenduc <[email protected] Reported-by: Henrique de Moraes Holschuh <[email protected]> Cc: [email protected] Signed-off-by: Linus Torvalds <[email protected]>
1 parent 1b68c95 commit d782437

File tree

2 files changed

+15
-1
lines changed

2 files changed

+15
-1
lines changed

fs/proc/task_mmu.c

+7-1
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ static void show_map_vma(struct seq_file *m, struct vm_area_struct *vma)
210210
int flags = vma->vm_flags;
211211
unsigned long ino = 0;
212212
unsigned long long pgoff = 0;
213+
unsigned long start;
213214
dev_t dev = 0;
214215
int len;
215216

@@ -220,8 +221,13 @@ static void show_map_vma(struct seq_file *m, struct vm_area_struct *vma)
220221
pgoff = ((loff_t)vma->vm_pgoff) << PAGE_SHIFT;
221222
}
222223

224+
/* We don't show the stack guard page in /proc/maps */
225+
start = vma->vm_start;
226+
if (vma->vm_flags & VM_GROWSDOWN)
227+
start += PAGE_SIZE;
228+
223229
seq_printf(m, "%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu %n",
224-
vma->vm_start,
230+
start,
225231
vma->vm_end,
226232
flags & VM_READ ? 'r' : '-',
227233
flags & VM_WRITE ? 'w' : '-',

mm/mlock.c

+8
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,14 @@ static long __mlock_vma_pages_range(struct vm_area_struct *vma,
167167
if (vma->vm_flags & VM_WRITE)
168168
gup_flags |= FOLL_WRITE;
169169

170+
/* We don't try to access the guard page of a stack vma */
171+
if (vma->vm_flags & VM_GROWSDOWN) {
172+
if (start == vma->vm_start) {
173+
start += PAGE_SIZE;
174+
nr_pages--;
175+
}
176+
}
177+
170178
while (nr_pages > 0) {
171179
int i;
172180

0 commit comments

Comments
 (0)