qemu-devel
[Top][All Lists]
Advanced

[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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]