[Libguestfs] [libnbd PATCH v3 13/29] socket activation: avoid manipulating the sign bit

Laszlo Ersek lersek at redhat.com
Wed Feb 15 14:11:42 UTC 2023


F_SETFD takes an "int", so it stands to reason that FD_CLOEXEC expands to
an "int". In turn, it's bad hygiene to manipulate the sign bit of (signed)
integers with bit operations:

  ~FD_CLOEXEC

Convert FD_CLOEXEC to "unsigned int" for the bitwise complement operator:

  ~(unsigned)FD_CLOEXEC

The bitwise complement then results in an "unsigned int". "Flags" (of type
"int", and having, per POSIX, a non-negative value returned by
fcntl(F_GETFD)) will be automatically converted to "unsigned int" by the
usual arithmetic conversions for the bitwise AND operator:

  flags & ~(unsigned)FD_CLOEXEC

We could pass the result of *that* to fcntl(), due to (a) the value being
in range for "signed int" ("flags" is a non-negative "int", and we're only
clearing a value bit), and (b) non-negative "int" values being represented
identically by "unsigned int" (C99 6.2.5 p9). But, for clarity, let's cast
the result to "int" explicitly:

  (int)(flags & ~(unsigned)FD_CLOEXEC)

Signed-off-by: Laszlo Ersek <lersek at redhat.com>
---

Notes:
    context:-U5

 generator/states-connect-socket-activation.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/generator/states-connect-socket-activation.c b/generator/states-connect-socket-activation.c
index b5e146539cc8..729f37d897fb 100644
--- a/generator/states-connect-socket-activation.c
+++ b/generator/states-connect-socket-activation.c
@@ -181,11 +181,11 @@  CONNECT_SA.START:
       int flags = fcntl (s, F_GETFD, 0);
       if (flags == -1) {
         nbd_internal_fork_safe_perror ("fcntl: F_GETFD");
         _exit (126);
       }
-      if (fcntl (s, F_SETFD, flags & ~FD_CLOEXEC) == -1) {
+      if (fcntl (s, F_SETFD, (int)(flags & ~(unsigned)FD_CLOEXEC)) == -1) {
         nbd_internal_fork_safe_perror ("fcntl: F_SETFD");
         _exit (126);
       }
     }
 



More information about the Libguestfs mailing list