Paolo Bonzini <[email protected]> writes: > 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.
Good point, will do!
