From: Pavel Hrdina Date: Sun, 10 Apr 2016 18:22:20 +0200 Subject: [PATCH] build: add GCC 6.0 -Wlogical-op workaround fdstream.c: In function 'virFDStreamWrite': fdstream.c:390:29: error: logical 'or' of equal expressions [-Werror=logical-op] if (errno == EAGAIN || errno == EWOULDBLOCK) { ^~ Fedora rawhide now uses gcc 6.0 and there is a bug with -Wlogical-op producing false warnings. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69602 Use GCC pragma push/pop and ignore -Wlogical-op for GCC that supports push/pop pragma and also has this bug. Signed-off-by: Pavel Hrdina (cherry picked from commit d713a6b120904c488170e7920c482b2fade70ae1) --- m4/virt-compile-warnings.m4 | 20 ++++++++++++++++++++ src/fdstream.c | 4 ++++ src/internal.h | 12 ++++++++++++ src/rpc/virnetsshsession.c | 6 ++++++ src/security/security_selinux.c | 2 ++ 5 files changed, 44 insertions(+) diff --git a/m4/virt-compile-warnings.m4 b/m4/virt-compile-warnings.m4 index 1b0a2cf..eb689e2 100644 --- a/m4/virt-compile-warnings.m4 +++ b/m4/virt-compile-warnings.m4 @@ -117,6 +117,20 @@ AC_DEFUN([LIBVIRT_COMPILE_WARNINGS],[ [lv_cv_gcc_wlogical_op_broken=yes]) CFLAGS="$save_CFLAGS"]) + AC_CACHE_CHECK([whether gcc gives bogus warnings for -Wlogical-op], + [lv_cv_gcc_wlogical_op_equal_expr_broken], [ + save_CFLAGS="$CFLAGS" + CFLAGS="-O2 -Wlogical-op -Werror" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #define TEST1 1 + #define TEST2 TEST1 + ]], [[ + int test = 0; + return test == TEST1 || test == TEST2;]])], + [lv_cv_gcc_wlogical_op_equal_expr_broken=no], + [lv_cv_gcc_wlogical_op_equal_expr_broken=yes]) + CFLAGS="$save_CFLAGS"]) + # We might fundamentally need some of these disabled forever, but # ideally we'd turn many of them on dontwarn="$dontwarn -Wfloat-equal" @@ -239,4 +253,10 @@ AC_DEFUN([LIBVIRT_COMPILE_WARNINGS],[ AC_DEFINE_UNQUOTED([BROKEN_GCC_WLOGICALOP_STRCHR], 1, [Define to 1 if gcc -Wlogical-op reports false positives on strchr]) fi + + if test "$gl_cv_warn_c__Wlogical_op" = yes && + test "$lv_cv_gcc_wlogical_op_equal_expr_broken" = yes; then + AC_DEFINE_UNQUOTED([BROKEN_GCC_WLOGICALOP_EQUAL_EXPR], 1, + [Define to 1 if gcc -Wlogical-op reports false positive 'or' equal expr]) + fi ]) diff --git a/src/fdstream.c b/src/fdstream.c index a85cf9d..ef118b5 100644 --- a/src/fdstream.c +++ b/src/fdstream.c @@ -387,7 +387,9 @@ static int virFDStreamWrite(virStreamPtr st, const char *bytes, size_t nbytes) retry: ret = write(fdst->fd, bytes, nbytes); if (ret < 0) { + VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR if (errno == EAGAIN || errno == EWOULDBLOCK) { + VIR_WARNINGS_RESET ret = -2; } else if (errno == EINTR) { goto retry; @@ -437,7 +439,9 @@ static int virFDStreamRead(virStreamPtr st, char *bytes, size_t nbytes) retry: ret = read(fdst->fd, bytes, nbytes); if (ret < 0) { + VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR if (errno == EAGAIN || errno == EWOULDBLOCK) { + VIR_WARNINGS_RESET ret = -2; } else if (errno == EINTR) { goto retry; diff --git a/src/internal.h b/src/internal.h index 35cc6d4..926e990 100644 --- a/src/internal.h +++ b/src/internal.h @@ -245,11 +245,23 @@ _Pragma ("GCC diagnostic push") # endif +/* Workaround bogus GCC 6.0 for logical 'or' equal expression warnings. + * (GCC bz 69602) */ +# if BROKEN_GCC_WLOGICALOP_EQUAL_EXPR +# define VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wlogical-op\"") +# else +# define VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR \ + _Pragma ("GCC diagnostic push") +# endif + # define VIR_WARNINGS_RESET \ _Pragma ("GCC diagnostic pop") # else # define VIR_WARNINGS_NO_CAST_ALIGN # define VIR_WARNINGS_NO_PRINTF +# define VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR # define VIR_WARNINGS_RESET # endif diff --git a/src/rpc/virnetsshsession.c b/src/rpc/virnetsshsession.c index 406a831..e742175 100644 --- a/src/rpc/virnetsshsession.c +++ b/src/rpc/virnetsshsession.c @@ -545,9 +545,11 @@ virNetSSHAuthenticateAgent(virNetSSHSessionPtr sess, agent_identity))) return 0; /* key accepted */ + VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR if (ret != LIBSSH2_ERROR_AUTHENTICATION_FAILED && ret != LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED && ret != LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED) { + VIR_WARNINGS_RESET libssh2_session_last_error(sess->session, &errmsg, NULL, 0); virReportError(VIR_ERR_AUTH_FAILED, _("failed to authenticate using SSH agent: %s"), @@ -605,9 +607,11 @@ virNetSSHAuthenticatePrivkey(virNetSSHSessionPtr sess, priv->password)) == 0) return 0; /* success */ + VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR if (priv->password || ret == LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED || ret == LIBSSH2_ERROR_AUTHENTICATION_FAILED) { + VIR_WARNINGS_RESET libssh2_session_last_error(sess->session, &errmsg, NULL, 0); virReportError(VIR_ERR_AUTH_FAILED, _("authentication with private key '%s' " @@ -673,11 +677,13 @@ virNetSSHAuthenticatePrivkey(virNetSSHSessionPtr sess, "has failed: %s"), priv->filename, errmsg); + VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR if (ret == LIBSSH2_ERROR_PUBLICKEY_UNRECOGNIZED || ret == LIBSSH2_ERROR_AUTHENTICATION_FAILED) return 1; else return -1; + VIR_WARNINGS_RESET } return 0; diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c index 26d95d1..04760a1 100644 --- a/src/security/security_selinux.c +++ b/src/security/security_selinux.c @@ -911,8 +911,10 @@ virSecuritySELinuxSetFileconHelper(const char *path, char *tcon, * hopefully sets one of the necessary SELinux virt_use_{nfs,usb,pci} * boolean tunables to allow it ... */ + VIR_WARNINGS_NO_WLOGICALOP_EQUAL_EXPR if (setfilecon_errno != EOPNOTSUPP && setfilecon_errno != ENOTSUP && setfilecon_errno != EROFS) { + VIR_WARNINGS_RESET virReportSystemError(setfilecon_errno, _("unable to set security context '%s' on '%s'"), tcon, path);