* PATCH - bug in vfree
@ 1999-02-20 11:46 Neil Booth
1999-02-20 12:14 ` Neil Booth
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Neil Booth @ 1999-02-20 11:46 UTC (permalink / raw)
To: Linus Torvalds; +Cc: Alan Cox, linux-mm
[-- Attachment #1: Type: text/plain, Size: 1150 bytes --]
Linus,
I posted this bug on the kernel mailing list last year, but it never got
fixed, probably as I didn't include a patch. I attach a patch this time
against kernel 2.2.1. The bug is rare, but can lead to kernel virtual
memory corruption.
Quick description:- vfree forgets to subtract the extra cushion page
from the size of each virtual memory area stored in vmlist when it calls
vmfree_area_pages. This means that only the vmalloc-requested size is
allocated by vmalloc_area_pages, but the requested size PLUS the cushion
page is freed by vmfree_area_pages.
More deeply:- Close inspection of get_vm_area reveals that
(intentionally?) it does NOT insist there be a cushion page behind a VMA
that is placed in front of a previously-allocated VMA, it ONLY
guarantees that a cushion page lies in front of newly-allocated VMAs.
Thus two VMAs could be immediately adjacent without a cushion page, and
coupled with the vfree bug means that vfree-ing the first VMA also frees
the first page of the second VMA, with dire consequences.
I have described this as clearly as I can, I hope it makes sense. Alan,
this same bug also exists in 2.0.36.
Neil.
[-- Attachment #2: vfree-patch --]
[-- Type: text/plain, Size: 384 bytes --]
--- linux/mm/vmalloc.c~ Sun Jan 24 19:21:06 1999
+++ linux/mm/vmalloc.c Sat Feb 20 20:17:11 1999
@@ -187,7 +187,7 @@
for (p = &vmlist ; (tmp = *p) ; p = &tmp->next) {
if (tmp->addr == addr) {
*p = tmp->next;
- vmfree_area_pages(VMALLOC_VMADDR(tmp->addr), tmp->size);
+ vmfree_area_pages(VMALLOC_VMADDR(tmp->addr), tmp->size - PAGE_SIZE);
kfree(tmp);
return;
}
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: PATCH - bug in vfree
1999-02-20 11:46 PATCH - bug in vfree Neil Booth
@ 1999-02-20 12:14 ` Neil Booth
1999-02-27 2:39 ` Neil Booth
1999-02-22 20:31 ` Kanoj Sarcar
1999-02-25 0:47 ` Andrea Arcangeli
2 siblings, 1 reply; 5+ messages in thread
From: Neil Booth @ 1999-02-20 12:14 UTC (permalink / raw)
To: Linus Torvalds; +Cc: Alan Cox, linux-mm
Neil Booth wrote:
> More deeply:- Close inspection of get_vm_area reveals that
> (intentionally?) it does NOT insist there be a cushion page behind a VMA
> that is placed in front of a previously-allocated VMA, it ONLY
> guarantees that a cushion page lies in front of newly-allocated VMAs.
Sorry, this is not correct (mistook < for <=). The bug report is
correct, though.
Neil.
--
To unsubscribe, send a message with 'unsubscribe linux-mm my@address'
in the body to majordomo@kvack.org. For more info on Linux MM,
see: http://humbolt.geo.uu.nl/Linux-MM/
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: PATCH - bug in vfree
1999-02-20 11:46 PATCH - bug in vfree Neil Booth
1999-02-20 12:14 ` Neil Booth
@ 1999-02-22 20:31 ` Kanoj Sarcar
1999-02-25 0:47 ` Andrea Arcangeli
2 siblings, 0 replies; 5+ messages in thread
From: Kanoj Sarcar @ 1999-02-22 20:31 UTC (permalink / raw)
To: Neil Booth; +Cc: linux-mm
On Feb 20, 8:46pm, Neil Booth wrote:
> Subject: PATCH - bug in vfree
>
>
> Quick description:- vfree forgets to subtract the extra cushion page
> from the size of each virtual memory area stored in vmlist when it calls
> vmfree_area_pages. This means that only the vmalloc-requested size is
> allocated by vmalloc_area_pages, but the requested size PLUS the cushion
> page is freed by vmfree_area_pages.
>
> More deeply:- Close inspection of get_vm_area reveals that
> (intentionally?) it does NOT insist there be a cushion page behind a VMA
> that is placed in front of a previously-allocated VMA, it ONLY
> guarantees that a cushion page lies in front of newly-allocated VMAs.
> Thus two VMAs could be immediately adjacent without a cushion page, and
> coupled with the vfree bug means that vfree-ing the first VMA also frees
> the first page of the second VMA, with dire consequences.
>
> I have described this as clearly as I can, I hope it makes sense. Alan,
> this same bug also exists in 2.0.36.
>
> Neil.
>
> [ text/plain ] :
>
> --- linux/mm/vmalloc.c~ Sun Jan 24 19:21:06 1999
> +++ linux/mm/vmalloc.c Sat Feb 20 20:17:11 1999
> @@ -187,7 +187,7 @@
> for (p = &vmlist ; (tmp = *p) ; p = &tmp->next) {
> if (tmp->addr == addr) {
> *p = tmp->next;
> - vmfree_area_pages(VMALLOC_VMADDR(tmp->addr),
tmp->size);
> + vmfree_area_pages(VMALLOC_VMADDR(tmp->addr), tmp->size
- PAGE_SIZE);
> kfree(tmp);
> return;
> }
>-- End of excerpt from Neil Booth
On Feb 20, 9:14pm, Neil Booth wrote:
> Subject: Re: PATCH - bug in vfree
> Neil Booth wrote:
>
> > More deeply:- Close inspection of get_vm_area reveals that
> > (intentionally?) it does NOT insist there be a cushion page behind a VMA
> > that is placed in front of a previously-allocated VMA, it ONLY
> > guarantees that a cushion page lies in front of newly-allocated VMAs.
>
> Sorry, this is not correct (mistook < for <=). The bug report is
> correct, though.
>
> Neil.
Given that we agree that there is always one page between vm_structs,
the extra page freeing (in vfree) is probably inconsequential, given
that vmfree_area_pages/free_area_pmd/free_area_pte basically ignores
null ptes. But yes, I agree it would be nice to get the "bug" fixed
in vfree().
Kanoj
--
To unsubscribe, send a message with 'unsubscribe linux-mm my@address'
in the body to majordomo@kvack.org. For more info on Linux MM,
see: http://humbolt.geo.uu.nl/Linux-MM/
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: PATCH - bug in vfree
1999-02-20 11:46 PATCH - bug in vfree Neil Booth
1999-02-20 12:14 ` Neil Booth
1999-02-22 20:31 ` Kanoj Sarcar
@ 1999-02-25 0:47 ` Andrea Arcangeli
2 siblings, 0 replies; 5+ messages in thread
From: Andrea Arcangeli @ 1999-02-25 0:47 UTC (permalink / raw)
To: Neil Booth; +Cc: linux-mm
On Sat, 20 Feb 1999, Neil Booth wrote:
>I posted this bug on the kernel mailing list last year, but it never got
>fixed, probably as I didn't include a patch. I attach a patch this time
I included it one year ago in my tree and infact if you grab my
arca-patches you'll find it again ;).
>against kernel 2.2.1. The bug is rare, but can lead to kernel virtual
>memory corruption.
Hmm, when I checked it one year ago I didn't seen a way the bug could
corrupt memory.
>More deeply:- Close inspection of get_vm_area reveals that
>(intentionally?) it does NOT insist there be a cushion page behind a VMA
>that is placed in front of a previously-allocated VMA, it ONLY
Could you explain me better? I agree that there's no good reason trying to
free the gap-faulting page, but I don't see how there couldn't be a
page-gap between two vmalloced areas.
Andrea Arcangeli
--
To unsubscribe, send a message with 'unsubscribe linux-mm my@address'
in the body to majordomo@kvack.org. For more info on Linux MM,
see: http://humbolt.geo.uu.nl/Linux-MM/
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: PATCH - bug in vfree
1999-02-20 12:14 ` Neil Booth
@ 1999-02-27 2:39 ` Neil Booth
0 siblings, 0 replies; 5+ messages in thread
From: Neil Booth @ 1999-02-27 2:39 UTC (permalink / raw)
To: linux-mm, Andrea Arcangeli
Andrea Arcangeli wrote:
> Hmm, when I checked it one year ago I didn't seen a way the bug could
> corrupt memory.
Yes, you missed my retraction of that bit below.
Neil.
Neil Booth wrote:
>
> Neil Booth wrote:
>
> > More deeply:- Close inspection of get_vm_area reveals that
> > (intentionally?) it does NOT insist there be a cushion page behind a VMA
> > that is placed in front of a previously-allocated VMA, it ONLY
> > guarantees that a cushion page lies in front of newly-allocated VMAs.
>
> Sorry, this is not correct (mistook < for <=). The bug report is
> correct, though.
>
> Neil.
--
To unsubscribe, send a message with 'unsubscribe linux-mm my@address'
in the body to majordomo@kvack.org. For more info on Linux MM,
see: http://humbolt.geo.uu.nl/Linux-MM/
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~1999-02-27 2:37 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1999-02-20 11:46 PATCH - bug in vfree Neil Booth
1999-02-20 12:14 ` Neil Booth
1999-02-27 2:39 ` Neil Booth
1999-02-22 20:31 ` Kanoj Sarcar
1999-02-25 0:47 ` Andrea Arcangeli
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox