From: "Daniel P. Berrangé" <berrange@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
Ross Lagerwall <ross.lagerwall@citrix.com>,
"Daniel P . Berrange" <berrange@redhat.com>
Subject: [Qemu-devel] [PULL 3/7] io: Fix QIOChannelFile when creating and opening read-write
Date: Thu, 15 Feb 2018 17:50:40 +0000 [thread overview]
Message-ID: <20180215175044.8159-4-berrange@redhat.com> (raw)
In-Reply-To: <20180215175044.8159-1-berrange@redhat.com>
From: Ross Lagerwall <ross.lagerwall@citrix.com>
The code wrongly passes the mode to open() only if O_WRONLY is set.
Instead, the mode should be passed when O_CREAT is set (or O_TMPFILE on
Linux). Fix this by always passing the mode since open() will correctly
ignore the mode if it is not needed. Add a testcase which exercises this
bug and also change the existing testcase to check that the mode of the
created file is correct.
Signed-off-by: Ross Lagerwall <ross.lagerwall@citrix.com>
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
---
include/io/channel-file.h | 2 +-
io/channel-file.c | 6 +-----
tests/test-io-channel-file.c | 29 +++++++++++++++++++++++++----
3 files changed, 27 insertions(+), 10 deletions(-)
diff --git a/include/io/channel-file.h b/include/io/channel-file.h
index 79245f1183..ebfe54ec70 100644
--- a/include/io/channel-file.h
+++ b/include/io/channel-file.h
@@ -73,7 +73,7 @@ qio_channel_file_new_fd(int fd);
* qio_channel_file_new_path:
* @path: the file path
* @flags: the open flags (O_RDONLY|O_WRONLY|O_RDWR, etc)
- * @mode: the file creation mode if O_WRONLY is set in @flags
+ * @mode: the file creation mode if O_CREAT is set in @flags
* @errp: pointer to initialized error object
*
* Create a new IO channel object for a file represented
diff --git a/io/channel-file.c b/io/channel-file.c
index b383273201..16bf7ed270 100644
--- a/io/channel-file.c
+++ b/io/channel-file.c
@@ -50,11 +50,7 @@ qio_channel_file_new_path(const char *path,
ioc = QIO_CHANNEL_FILE(object_new(TYPE_QIO_CHANNEL_FILE));
- if (flags & O_WRONLY) {
- ioc->fd = open(path, flags, mode);
- } else {
- ioc->fd = open(path, flags);
- }
+ ioc->fd = open(path, flags, mode);
if (ioc->fd < 0) {
object_unref(OBJECT(ioc));
error_setg_errno(errp, errno,
diff --git a/tests/test-io-channel-file.c b/tests/test-io-channel-file.c
index 6bfede6bb7..2e94f638f2 100644
--- a/tests/test-io-channel-file.c
+++ b/tests/test-io-channel-file.c
@@ -24,16 +24,21 @@
#include "io-channel-helpers.h"
#include "qapi/error.h"
-static void test_io_channel_file(void)
+#define TEST_FILE "tests/test-io-channel-file.txt"
+#define TEST_MASK 0600
+
+static void test_io_channel_file_helper(int flags)
{
QIOChannel *src, *dst;
QIOChannelTest *test;
+ struct stat st;
+ mode_t mask;
+ int ret;
-#define TEST_FILE "tests/test-io-channel-file.txt"
unlink(TEST_FILE);
src = QIO_CHANNEL(qio_channel_file_new_path(
TEST_FILE,
- O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0600,
+ flags, TEST_MASK,
&error_abort));
dst = QIO_CHANNEL(qio_channel_file_new_path(
TEST_FILE,
@@ -45,18 +50,33 @@ static void test_io_channel_file(void)
qio_channel_test_run_reader(test, dst);
qio_channel_test_validate(test);
+ /* Check that the requested mode took effect. */
+ mask = umask(0);
+ umask(mask);
+ ret = stat(TEST_FILE, &st);
+ g_assert_cmpint(ret, >, -1);
+ g_assert_cmpuint(TEST_MASK & ~mask, ==, st.st_mode & 0777);
+
unlink(TEST_FILE);
object_unref(OBJECT(src));
object_unref(OBJECT(dst));
}
+static void test_io_channel_file(void)
+{
+ test_io_channel_file_helper(O_WRONLY | O_CREAT | O_TRUNC | O_BINARY);
+}
+
+static void test_io_channel_file_rdwr(void)
+{
+ test_io_channel_file_helper(O_RDWR | O_CREAT | O_TRUNC | O_BINARY);
+}
static void test_io_channel_fd(void)
{
QIOChannel *ioc;
int fd = -1;
-#define TEST_FILE "tests/test-io-channel-file.txt"
fd = open(TEST_FILE, O_CREAT | O_TRUNC | O_WRONLY, 0600);
g_assert_cmpint(fd, >, -1);
@@ -114,6 +134,7 @@ int main(int argc, char **argv)
g_test_init(&argc, &argv, NULL);
g_test_add_func("/io/channel/file", test_io_channel_file);
+ g_test_add_func("/io/channel/file/rdwr", test_io_channel_file_rdwr);
g_test_add_func("/io/channel/file/fd", test_io_channel_fd);
#ifndef _WIN32
g_test_add_func("/io/channel/pipe/sync", test_io_channel_pipe_sync);
--
2.14.3
next prev parent reply other threads:[~2018-02-15 17:51 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-02-15 17:50 [Qemu-devel] [PULL 0/7] Qio next patches Daniel P. Berrangé
2018-02-15 17:50 ` [Qemu-devel] [PULL 1/7] io: fix QIONetListener memory leak Daniel P. Berrangé
2018-02-15 17:50 ` [Qemu-devel] [PULL 2/7] io/channel-websock: handle continuous reads without any data Daniel P. Berrangé
2018-02-15 17:50 ` Daniel P. Berrangé [this message]
2018-02-15 17:50 ` [Qemu-devel] [PULL 4/7] io: Don't call close multiple times in QIOChannelFile Daniel P. Berrangé
2018-02-15 17:50 ` [Qemu-devel] [PULL 5/7] io: Add /dev/fdset/ support to QIOChannelFile Daniel P. Berrangé
2018-02-15 17:50 ` [Qemu-devel] [PULL 6/7] io/channel-command: Do not kill the child process after closing the pipe Daniel P. Berrangé
2018-02-15 17:50 ` [Qemu-devel] [PULL 7/7] allow to build with older sed Daniel P. Berrangé
2018-02-15 19:43 ` [Qemu-devel] [PULL 0/7] Qio next patches Peter Maydell
2018-02-16 8:52 ` Daniel P. Berrangé
2018-02-16 12:51 ` Peter Maydell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180215175044.8159-4-berrange@redhat.com \
--to=berrange@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=ross.lagerwall@citrix.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).