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 |
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 --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);