about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2024-06-21 11:49:03 +0000
committerLaurent Bercot <ska@appnovation.com>2024-06-21 11:49:03 +0000
commit1640b8835a1f25d41e9768eacbeae295604b3144 (patch)
treeee8626777feb84bf8b0503040c7c23a90d322dd0
parent1d941a9afc51fce47c4b2b673184eceb539a80bc (diff)
downloadskalibs-1640b8835a1f25d41e9768eacbeae295604b3144.tar.gz
skalibs-1640b8835a1f25d41e9768eacbeae295604b3144.tar.xz
skalibs-1640b8835a1f25d41e9768eacbeae295604b3144.zip
bugfix: unixmessage_put, fd bits initialization
Signed-off-by: Laurent Bercot <ska@appnovation.com>
-rw-r--r--src/libstddjb/siovec_gather.c4
-rw-r--r--src/libunixonacid/unixmessage_bits_closeall.c11
-rw-r--r--src/libunixonacid/unixmessage_bits_closenone.c2
-rw-r--r--src/libunixonacid/unixmessage_put.c19
4 files changed, 21 insertions, 15 deletions
diff --git a/src/libstddjb/siovec_gather.c b/src/libstddjb/siovec_gather.c
index 4288141..aa73677 100644
--- a/src/libstddjb/siovec_gather.c
+++ b/src/libstddjb/siovec_gather.c
@@ -2,13 +2,13 @@
 
 #include <sys/uio.h>
 #include <string.h>
+
 #include <skalibs/siovec.h>
 
 size_t siovec_gather (struct iovec const *v, unsigned int n, char *s, size_t max)
 {
   size_t w = 0 ;
-  unsigned int i = 0 ;
-  for (; i < n && w < max ; i++)
+  for (unsigned int i = 0 ; i < n && w < max ; i++)
   {
     size_t len = v[i].iov_len ;
     if (len > max - w) len = max - w ;
diff --git a/src/libunixonacid/unixmessage_bits_closeall.c b/src/libunixonacid/unixmessage_bits_closeall.c
index 32d77d6..54c79b2 100644
--- a/src/libunixonacid/unixmessage_bits_closeall.c
+++ b/src/libunixonacid/unixmessage_bits_closeall.c
@@ -3,5 +3,14 @@
 #include <skalibs/bitarray.h>
 #include <skalibs/unixmessage.h>
 
-static unsigned char const unixmessage_bits_closeall_[bitarray_div8(UNIXMESSAGE_MAXFDS)] = "\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377\377" ;
+static unsigned char const unixmessage_bits_closeall_[bitarray_div8(UNIXMESSAGE_MAXFDS)] =
+"\377"
+// "\377" "\377" // 253 = 255 & ~2
+"\377" "\377" "\377" "\377"
+"\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377"
+"\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377"
+"\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377"
+"\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377"
+"\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377" "\377"
+ ;
 unsigned char const *const unixmessage_bits_closeall = unixmessage_bits_closeall_ ;
diff --git a/src/libunixonacid/unixmessage_bits_closenone.c b/src/libunixonacid/unixmessage_bits_closenone.c
index bacbc6a..5ed3cc6 100644
--- a/src/libunixonacid/unixmessage_bits_closenone.c
+++ b/src/libunixonacid/unixmessage_bits_closenone.c
@@ -3,5 +3,5 @@
 #include <skalibs/bitarray.h>
 #include <skalibs/unixmessage.h>
 
-static unsigned char const unixmessage_bits_closenone_[bitarray_div8(UNIXMESSAGE_MAXFDS)] = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" ;
+static unsigned char const unixmessage_bits_closenone_[bitarray_div8(UNIXMESSAGE_MAXFDS)] = { 0 } ;
 unsigned char const *const unixmessage_bits_closenone = unixmessage_bits_closenone_ ;
diff --git a/src/libunixonacid/unixmessage_put.c b/src/libunixonacid/unixmessage_put.c
index a41c5c0..59feed3 100644
--- a/src/libunixonacid/unixmessage_put.c
+++ b/src/libunixonacid/unixmessage_put.c
@@ -11,16 +11,14 @@
 #include <skalibs/unixmessage.h>
 #include <skalibs/posixishard.h>
 
-static inline int copyfds (char *s, int const *fds, unsigned int n, unsigned char const *bits, unixmessage_sender_closecb_func_ref closecb, void *closecbdata)
+static inline int copyfds (int *dst, int const *src, unsigned int n, unsigned char const *bits)
 {
-  unsigned int i = 0 ;
-  for (; i < n ; i++)
+  for (unsigned int i = 0 ; i < n ; i++)
   {
-    int fd = fds[i] ;
-    if (fd < 0) return (errno = EINVAL, -1) ;
+    int fd = src[i] ;
+    if (fd < 0) return (errno = EINVAL, 0) ;
     if (bitarray_peek(bits, i)) fd = - fd - 1 ;
-    memcpy(s, (char const *)&fd, sizeof(int)) ;
-    s += sizeof(int) ;
+    dst[i] = fd ;
   }
   return 1 ;
 }
@@ -28,15 +26,14 @@ static inline int copyfds (char *s, int const *fds, unsigned int n, unsigned cha
 static int reserve_and_copy (unixmessage_sender *b, size_t len, int const *fds, unsigned int nfds, unsigned char const *bits)
 {
   disize cur = { .left = b->data.len, .right = genalloc_len(int, &b->fds) } ;
-  if (len > UNIXMESSAGE_MAXSIZE || nfds > UNIXMESSAGE_MAXFDS)
-    return (errno = EPROTO, 0) ;
+  if (len > UNIXMESSAGE_MAXSIZE || nfds > UNIXMESSAGE_MAXFDS) return (errno = EPROTO, 0) ;
   if (!genalloc_readyplus(disize, &b->offsets, 1)
    || !genalloc_readyplus(int, &b->fds, nfds)
    || !stralloc_readyplus(&b->data, len))
     return 0 ;
-  if (!copyfds(b->fds.s + b->fds.len, fds, nfds, bits, b->closecb, b->closecbdata)) return 0 ;
+  if (!copyfds(genalloc_s(int, &b->fds) + cur.right, fds, nfds, bits)) return 0 ;
   genalloc_setlen(int, &b->fds, cur.right + nfds) ;
-  return genalloc_append(disize, &b->offsets, &cur) ;
+  return genalloc_catb(disize, &b->offsets, &cur, 1) ;
 }
 
 int unixmessage_put_and_close (unixmessage_sender *b, unixmessage const *m, unsigned char const *bits)