[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 01/38] exec: Fix memory allocation when memory p
From: |
Paolo Bonzini |
Subject: |
Re: [Qemu-devel] [PATCH 01/38] exec: Fix memory allocation when memory path names new file |
Date: |
Tue, 1 Mar 2016 12:35:18 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.0 |
On 29/02/2016 19:40, Markus Armbruster wrote:
> - if (!stat(path, &st) && S_ISDIR(st.st_mode)) {
> + ret = stat(path, &st);
> + if (!ret && S_ISDIR(st.st_mode)) {
> + /* path names a directory -> create a temporary file there */
> /* Make name safe to use with mkstemp by replacing '/' with '_'. */
> sanitized_name = g_strdup(memory_region_name(block->mr));
> for (c = sanitized_name; *c != '\0'; c++) {
> @@ -1282,13 +1271,32 @@ static void *file_ram_alloc(RAMBlock *block,
> unlink(filename);
> }
> g_free(filename);
> + } else if (!ret) {
> + /* path names an existing file -> use it */
> + fd = open(path, O_RDWR);
> } else {
> + /* create a new file */
> fd = open(path, O_RDWR | O_CREAT, 0644);
> + unlink_on_error = true;
> }
While at it, let's avoid TOCTTOU conditions:
for (;;) {
fd = open(path, O_RDWR);
if (fd != -1) {
break;
}
if (errno == ENOENT) {
fd = open(path, O_RDWR | O_CREAT | O_EXCL, 0644);
if (fd != -1) {
unlink_on_error = true;
break;
}
} else if (errno == EISDIR) {
... mkstemp ...
if (fd != -1) {
unlink_on_error = true;
break;
}
}
if (errno != EEXIST && errno != EINTR) {
goto error;
}
}
and use fstatfs in gethugepagesize.
Paolo
- Re: [Qemu-devel] [PATCH 01/38] exec: Fix memory allocation when memory path names new file,
Paolo Bonzini <=