diff mbox series

[v4,39/54] tests/qtest: boot-serial-test: Close the serial file before starting QEMU

Message ID 20220927110632.1973965-40-bmeng.cn@gmail.com (mailing list archive)
State New, archived
Headers show
Series tests/qtest: Enable running qtest on Windows | expand

Commit Message

Bin Meng Sept. 27, 2022, 11:06 a.m. UTC
From: Bin Meng <bin.meng@windriver.com>

This qtest executable created a serial chardev file to be passed to
the QEMU executable. The serial file was created by g_file_open_tmp(),
which internally opens the file with FILE_SHARE_WRITE security attribute
on Windows. Based on [1], there is only one case that allows the first
call to CreateFile() with GENERIC_READ & FILE_SHARE_WRITE, and second
call to CreateFile() with GENERIC_WRITE & FILE_SHARE_READ. All other
combinations require FILE_SHARE_WRITE in the second call. But there is
no way for the second call (in this case the QEMU executable) to know
what combination was passed to the first call, unless FILE_SHARE_WRITE
is passed to the second call.

Two processes shouldn't share the same file for writing with a chardev.
Let's close the serial file before starting QEMU.

[1] https://docs.microsoft.com/en-us/windows/win32/fileio/creating-and-opening-files

Signed-off-by: Bin Meng <bin.meng@windriver.com>
---

Changes in v4:
- New patch: "tests/qtest: boot-serial-test: Close the serial file before starting QEMU"

 tests/qtest/boot-serial-test.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Marc-André Lureau Sept. 27, 2022, 2:29 p.m. UTC | #1
On Tue, Sep 27, 2022 at 3:08 PM Bin Meng <bmeng.cn@gmail.com> wrote:
>
> From: Bin Meng <bin.meng@windriver.com>
>
> This qtest executable created a serial chardev file to be passed to
> the QEMU executable. The serial file was created by g_file_open_tmp(),
> which internally opens the file with FILE_SHARE_WRITE security attribute
> on Windows. Based on [1], there is only one case that allows the first
> call to CreateFile() with GENERIC_READ & FILE_SHARE_WRITE, and second
> call to CreateFile() with GENERIC_WRITE & FILE_SHARE_READ. All other
> combinations require FILE_SHARE_WRITE in the second call. But there is
> no way for the second call (in this case the QEMU executable) to know
> what combination was passed to the first call, unless FILE_SHARE_WRITE
> is passed to the second call.
>
> Two processes shouldn't share the same file for writing with a chardev.
> Let's close the serial file before starting QEMU.
>
> [1] https://docs.microsoft.com/en-us/windows/win32/fileio/creating-and-opening-files
>
> Signed-off-by: Bin Meng <bin.meng@windriver.com>

Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>



> ---
>
> Changes in v4:
> - New patch: "tests/qtest: boot-serial-test: Close the serial file before starting QEMU"
>
>  tests/qtest/boot-serial-test.c | 3 +++
>  1 file changed, 3 insertions(+)
>
> diff --git a/tests/qtest/boot-serial-test.c b/tests/qtest/boot-serial-test.c
> index 72310ba30e..b216519b62 100644
> --- a/tests/qtest/boot-serial-test.c
> +++ b/tests/qtest/boot-serial-test.c
> @@ -233,6 +233,7 @@ static void test_machine(const void *data)
>
>      ser_fd = g_file_open_tmp("qtest-boot-serial-sXXXXXX", &serialtmp, NULL);
>      g_assert(ser_fd != -1);
> +    close(ser_fd);
>
>      if (test->kernel) {
>          code = test->kernel;
> @@ -266,6 +267,8 @@ static void test_machine(const void *data)
>          unlink(codetmp);
>      }
>
> +    ser_fd = open(serialtmp, O_RDONLY);
> +    g_assert(ser_fd != -1);
>      if (!check_guest_output(qts, test, ser_fd)) {
>          g_error("Failed to find expected string. Please check '%s'",
>                  serialtmp);
> --
> 2.34.1
>
diff mbox series

Patch

diff --git a/tests/qtest/boot-serial-test.c b/tests/qtest/boot-serial-test.c
index 72310ba30e..b216519b62 100644
--- a/tests/qtest/boot-serial-test.c
+++ b/tests/qtest/boot-serial-test.c
@@ -233,6 +233,7 @@  static void test_machine(const void *data)
 
     ser_fd = g_file_open_tmp("qtest-boot-serial-sXXXXXX", &serialtmp, NULL);
     g_assert(ser_fd != -1);
+    close(ser_fd);
 
     if (test->kernel) {
         code = test->kernel;
@@ -266,6 +267,8 @@  static void test_machine(const void *data)
         unlink(codetmp);
     }
 
+    ser_fd = open(serialtmp, O_RDONLY);
+    g_assert(ser_fd != -1);
     if (!check_guest_output(qts, test, ser_fd)) {
         g_error("Failed to find expected string. Please check '%s'",
                 serialtmp);