
On Tue, Oct 03, 2017 at 02:07:18PM +0200, Jiri Denemark wrote:
From: Luyao Huang <lhuang@redhat.com>
This is normally not an issue since the tests which use mocked open() do not create files. But once coverage build is enabled, gcov_open will use O_CREATE and real_open will read random data rather than the actual mode argument.
Signed-off-by: Jiri Denemark <jdenemar@redhat.com> --- tests/virfilewrapper.c | 13 ++++++++++++- tests/virusbmock.c | 15 ++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/tests/virfilewrapper.c b/tests/virfilewrapper.c index fede7b2e89..1d1d182708 100644 --- a/tests/virfilewrapper.c +++ b/tests/virfilewrapper.c @@ -257,10 +257,21 @@ int open(const char *path, int flags, ...) { int ret = -1; char *newpath = NULL; + va_list ap; + mode_t mode = 0;
PATH_OVERRIDE(newpath, path);
- ret = real_open(newpath, flags); + /* The mode argument is mandatory when O_CREAT is set in flags, + * otherwise the argument is ignored. + */ + if (flags & O_CREAT) { + va_start(ap, flags); + mode = va_arg(ap, mode_t); + va_end(ap); + }
This breaks the build with clang due to use of mode_t type virfilewrapper.c:270:27: error: second argument to 'va_arg' is of promotable type 'mode_t' (aka 'unsigned short'); this va_arg has undefined behavior because arguments will be promoted to 'int' [-Werror,-Wvarargs] mode = va_arg(ap, mode_t); ^~~~~~ I guess we should use 'int' as the arg to va_arg(), and then cast the result back to mode_t ? Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|