|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 2/2] libs/foreignmemory: do not use alloca(3)
The semantics of alloca(3) is not very nice. If the stack overflows,
program behaviour is undefined.
Remove the use of alloca(3) and always use mmap.
Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
---
tools/libs/foreignmemory/linux.c | 21 +++++++--------------
1 file changed, 7 insertions(+), 14 deletions(-)
diff --git a/tools/libs/foreignmemory/linux.c b/tools/libs/foreignmemory/linux.c
index 423c744..316d988 100644
--- a/tools/libs/foreignmemory/linux.c
+++ b/tools/libs/foreignmemory/linux.c
@@ -17,7 +17,6 @@
* Copyright 2006 Sun Microsystems, Inc. All rights reserved.
*/
-#include <alloca.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
@@ -187,18 +186,13 @@ void *osdep_xenforeignmemory_map(xenforeignmemory_handle
*fmem,
xen_pfn_t *pfn;
unsigned int pfn_arr_size = ROUNDUP((num * sizeof(*pfn)), PAGE_SHIFT);
- if ( pfn_arr_size <= PAGE_SIZE )
- pfn = alloca(num * sizeof(*pfn));
- else
+ pfn = mmap(NULL, pfn_arr_size, PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANON | MAP_POPULATE, -1, 0);
+ if ( pfn == MAP_FAILED )
{
- pfn = mmap(NULL, pfn_arr_size, PROT_READ | PROT_WRITE,
- MAP_PRIVATE | MAP_ANON | MAP_POPULATE, -1, 0);
- if ( pfn == MAP_FAILED )
- {
- PERROR("mmap of pfn array failed");
- (void)munmap(addr, num << PAGE_SHIFT);
- return NULL;
- }
+ PERROR("mmap of pfn array failed");
+ (void)munmap(addr, num << PAGE_SHIFT);
+ return NULL;
}
memcpy(pfn, arr, num * sizeof(*arr));
@@ -241,8 +235,7 @@ void *osdep_xenforeignmemory_map(xenforeignmemory_handle
*fmem,
break;
}
- if ( pfn_arr_size > PAGE_SIZE )
- munmap(pfn, pfn_arr_size);
+ munmap(pfn, pfn_arr_size);
if ( rc == -ENOENT && i == num )
rc = 0;
--
2.1.4
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |