x86: PAT fix
Adrian Bunk noticed the following Coverity report:
> Commit e7f260a276
> (x86: PAT use reserve free memtype in mmap of /dev/mem)
> added the following gem to arch/x86/mm/pat.c:
>
> <-- snip -->
>
> ...
> int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn,
> unsigned long size, pgprot_t *vma_prot)
> {
> u64 offset = ((u64) pfn) << PAGE_SHIFT;
> unsigned long flags = _PAGE_CACHE_UC_MINUS;
> unsigned long ret_flags;
> ...
> ... (nothing that touches ret_flags)
> ...
> if (flags != _PAGE_CACHE_UC_MINUS) {
> retval = reserve_memtype(offset, offset + size, flags, NULL);
> } else {
> retval = reserve_memtype(offset, offset + size, -1, &ret_flags);
> }
>
> if (retval < 0)
> return 0;
>
> flags = ret_flags;
>
> if (pfn <= max_pfn_mapped &&
> ioremap_change_attr((unsigned long)__va(offset), size, flags) < 0) {
> free_memtype(offset, offset + size);
> printk(KERN_INFO
> "%s:%d /dev/mem ioremap_change_attr failed %s for %Lx-%Lx\n",
> current->comm, current->pid,
> cattr_name(flags),
> offset, offset + size);
> return 0;
> }
>
> *vma_prot = __pgprot((pgprot_val(*vma_prot) & ~_PAGE_CACHE_MASK) |
> flags);
> return 1;
> }
>
> <-- snip -->
>
> If (flags != _PAGE_CACHE_UC_MINUS) we pass garbage from the stack to
> ioremap_change_attr() and/or __pgprot().
>
> Spotted by the Coverity checker.
the fix simplifies the code as we get rid of the 'ret_flags'
complication.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
86cf02f8ea
commit
f022bfd582
|
@ -510,7 +510,6 @@ int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn,
|
||||||
{
|
{
|
||||||
u64 offset = ((u64) pfn) << PAGE_SHIFT;
|
u64 offset = ((u64) pfn) << PAGE_SHIFT;
|
||||||
unsigned long flags = _PAGE_CACHE_UC_MINUS;
|
unsigned long flags = _PAGE_CACHE_UC_MINUS;
|
||||||
unsigned long ret_flags;
|
|
||||||
int retval;
|
int retval;
|
||||||
|
|
||||||
if (!range_is_allowed(pfn, size))
|
if (!range_is_allowed(pfn, size))
|
||||||
|
@ -549,14 +548,12 @@ int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn,
|
||||||
if (flags != _PAGE_CACHE_UC_MINUS) {
|
if (flags != _PAGE_CACHE_UC_MINUS) {
|
||||||
retval = reserve_memtype(offset, offset + size, flags, NULL);
|
retval = reserve_memtype(offset, offset + size, flags, NULL);
|
||||||
} else {
|
} else {
|
||||||
retval = reserve_memtype(offset, offset + size, -1, &ret_flags);
|
retval = reserve_memtype(offset, offset + size, -1, &flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (retval < 0)
|
if (retval < 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
flags = ret_flags;
|
|
||||||
|
|
||||||
if (pfn <= max_pfn_mapped &&
|
if (pfn <= max_pfn_mapped &&
|
||||||
ioremap_change_attr((unsigned long)__va(offset), size, flags) < 0) {
|
ioremap_change_attr((unsigned long)__va(offset), size, flags) < 0) {
|
||||||
free_memtype(offset, offset + size);
|
free_memtype(offset, offset + size);
|
||||||
|
|
Loading…
Reference in New Issue