Commit e43dc84f authored by Rusty Russell's avatar Rusty Russell

failtest: catch mmap.

mmap can also fail on out-of-memory, and for the coming change to the
way we save and restore files we want to know about them anyway.
parent 3d99c933
......@@ -13,6 +13,7 @@
#include <sys/wait.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/mman.h>
#include <signal.h>
#include <assert.h>
#include <ccan/time/time.h>
......@@ -96,7 +97,7 @@ static unsigned int lock_num = 0;
static pid_t orig_pid;
static const char info_to_arg[] = "mceoxprwf";
static const char info_to_arg[] = "mceoxprwfa";
/* Dummy call used for failtest_undo wrappers. */
static struct failtest_call unrecorded_call;
......@@ -860,6 +861,30 @@ int failtest_open(const char *pathname,
return p->u.open.ret;
}
void *failtest_mmap(void *addr, size_t length, int prot, int flags,
int fd, off_t offset, const char *file, unsigned line)
{
struct failtest_call *p;
struct mmap_call call;
call.addr = addr;
call.length = length;
call.prot = prot;
call.flags = flags;
call.offset = offset;
call.fd = fd;
p = add_history(FAILTEST_MMAP, file, line, &call);
if (should_fail(p)) {
p->u.mmap.ret = MAP_FAILED;
p->error = ENOMEM;
} else {
p->u.mmap.ret = mmap(addr, length, prot, flags, fd, offset);
}
errno = p->error;
return p->u.mmap.ret;
}
static void cleanup_pipe(struct pipe_call *call)
{
if (!call->closed[0])
......
......@@ -47,6 +47,7 @@ enum failtest_call_type {
FAILTEST_READ,
FAILTEST_WRITE,
FAILTEST_FCNTL,
FAILTEST_MMAP,
};
struct calloc_call {
......@@ -110,6 +111,16 @@ struct fcntl_call {
} arg;
};
struct mmap_call {
void *ret;
void *addr;
size_t length;
int prot;
int flags;
int fd;
off_t offset;
};
/**
* struct failtest_call - description of a call redirected to failtest module
* @type: the call type
......@@ -151,6 +162,7 @@ struct failtest_call {
struct read_call read;
struct write_call write;
struct fcntl_call fcntl;
struct mmap_call mmap;
} u;
};
......
......@@ -29,6 +29,7 @@
/* Replacement of I/O. */
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
......@@ -62,6 +63,11 @@
#undef fcntl
#define fcntl(fd, ...) failtest_fcntl((fd), __FILE__, __LINE__, __VA_ARGS__)
#undef mmap
#define mmap(addr, length, prot, flags, fd, offset) \
failtest_mmap((addr), (length), (prot), (flags), (fd), (offset), \
__FILE__, __LINE__)
/* Replacement of getpid (since failtest will fork). */
#undef getpid
#define getpid() failtest_getpid(__FILE__, __LINE__)
......
......@@ -21,6 +21,8 @@ ssize_t failtest_pread(int fd, void *buf, size_t count, off_t offset,
const char *file, unsigned line);
ssize_t failtest_pwrite(int fd, const void *buf, size_t count, off_t offset,
const char *file, unsigned line);
void *failtest_mmap(void *addr, size_t length, int prot, int flags,
int fd, off_t offset, const char *file, unsigned line);
int failtest_close(int fd, const char *file, unsigned line);
int failtest_fcntl(int fd, const char *file, unsigned line, int cmd, ...);
pid_t failtest_getpid(const char *file, unsigned line);
......
......@@ -31,6 +31,10 @@
#define write(fd, buf, count) \
failtest_write((fd), (buf), (count), NULL, 0)
#undef mmap
#define mmap(addr, length, prot, flags, fd, offset) \
failtest_mmap((addr), (length), (prot), (flags), (fd), (offset), NULL, 0)
#undef close
#define close(fd) failtest_close(fd)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment