From: Linus Torvalds Date: Fri, 23 Nov 2007 20:09:12 +0000 (-0500) Subject: Very small patch to 0.99pl12 X-Git-Tag: 0.99.12-patch1 X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=9dab425e93490661cccb666249ffd6f6147e7950;p=history.git Very small patch to 0.99pl12 I hate to put out patches this soon after a release, but there is one potentially major problem in pl12 which is very simple to fix.. I'm including patches: both in plain ascii and as a uuencoded gzip file (it's the same patch - the uuencoded one is in case there is any newsserver that messes up whitespace). The main patch is just the change from __get_free_page(GFP_BUFFER) into get_free_page(GFP_KERNEL), and the two minor patches just add checks that actually enforce the read-only nature of current file mmap'ings so that any program that tries to do a write mapping at least will be told that it won't work. I'd suggest anybody compiling pl12 should add at least the file_table.c patch: thanks to Alexandre Julliard for noticing this one. Linus --- diff --git a/fs/file_table.c b/fs/file_table.c index 8542dd90bbc1..df0ae4ae6033 100644 --- a/fs/file_table.c +++ b/fs/file_table.c @@ -45,7 +45,7 @@ void grow_files(void) struct file * file; int i; - file = (struct file*) __get_free_page(GFP_BUFFER); + file = (struct file *) get_free_page(GFP_KERNEL); if (!file) return; diff --git a/fs/nfs/mmap.c b/fs/nfs/mmap.c index e1b13fb1a0eb..24df306af76f 100644 --- a/fs/nfs/mmap.c +++ b/fs/nfs/mmap.c @@ -50,6 +50,8 @@ int nfs_mmap(struct inode * inode, struct file * file, { struct vm_area_struct * mpnt; + if (prot & PAGE_RW) /* only PAGE_COW or read-only supported now */ + return -EINVAL; if (off & (inode->i_sb->s_blocksize - 1)) return -EINVAL; if (len > high_memory || off > high_memory - len) /* avoid overflow */ diff --git a/mm/mmap.c b/mm/mmap.c index 60942beaf4c4..cec3eb270f5f 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -197,6 +197,8 @@ int generic_mmap(struct inode * inode, struct file * file, extern struct vm_operations_struct file_mmap; struct buffer_head * bh; + if (prot & PAGE_RW) /* only PAGE_COW or read-only supported right now */ + return -EINVAL; if (off & (inode->i_sb->s_blocksize - 1)) return -EINVAL; if (len > high_memory || off > high_memory - len) /* avoid overflow */