From 35d4b9f381a862f534128e4ab9e054869049ec0f Mon Sep 17 00:00:00 2001 From: Werner Almesberger Date: Wed, 16 Jan 2013 10:26:51 -0300 Subject: [PATCH] libubb/physmem.c: remove physmem_xlat; cache open pagemap fd To avoid contamination, we open the pagemap file with O_CLOEXEC. --- libubb/include/ubb/physmem.h | 1 - libubb/physmem.c | 29 +++++++++-------------------- 2 files changed, 9 insertions(+), 21 deletions(-) diff --git a/libubb/include/ubb/physmem.h b/libubb/include/ubb/physmem.h index a41d6b9..24b7e4d 100644 --- a/libubb/include/ubb/physmem.h +++ b/libubb/include/ubb/physmem.h @@ -24,7 +24,6 @@ struct physmem_vec { void *physmem_malloc(size_t size); void *physmem_calloc(size_t size); -unsigned long physmem_xlat(void *v); int physmem_xlat_vec(void *v, size_t len, struct physmem_vec *vec, int vec_len); int physmem_flush(const void *data, size_t size); diff --git a/libubb/physmem.c b/libubb/physmem.c index 104b9ff..05f6763 100644 --- a/libubb/physmem.c +++ b/libubb/physmem.c @@ -11,6 +11,8 @@ */ +#define _GNU_SOURCE /* for O_CLOEXEC */ + #include #include #include @@ -128,35 +130,22 @@ static unsigned long xlat_one(int fd, unsigned long vaddr) } -unsigned long physmem_xlat(void *v) -{ - unsigned long res; - int fd; - - fd = open(PAGEMAP_FILE, O_RDONLY); - if (fd < 0) { - perror(PAGEMAP_FILE); - exit(1); - } - res = xlat_one(fd, (unsigned long) v); - close(fd); - return res; -} - - int physmem_xlat_vec(void *v, size_t len, struct physmem_vec *vec, int vec_len) { + static int fd = -1; unsigned long vaddr = (unsigned long) v; unsigned long offset, this_len; - int fd; int n = 0; - fd = open(PAGEMAP_FILE, O_RDONLY); if (fd < 0) { - perror(PAGEMAP_FILE); - exit(1); + fd = open(PAGEMAP_FILE, O_RDONLY | O_CLOEXEC); + if (fd < 0) { + perror(PAGEMAP_FILE); + exit(1); + } } + while (len) { if (n >= vec_len) { close(fd);