about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2021-04-13 00:56:12 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2021-04-13 00:56:12 +0000
commit26155ac6792f6077550e6dd1ce60ea5d2752d43e (patch)
treeab4e7d3e6d51f33768b7928b4fa6e43c0ac4f588
parent011971a455d7dcb225d2d2611d3280ca916c098a (diff)
downloadutmps-26155ac6792f6077550e6dd1ce60ea5d2752d43e.tar.gz
utmps-26155ac6792f6077550e6dd1ce60ea5d2752d43e.tar.xz
utmps-26155ac6792f6077550e6dd1ce60ea5d2752d43e.zip
Treat utmpx's char arrays as nonstrings
-rw-r--r--src/utmps/utmps-utmpd.c8
-rw-r--r--src/utmps/utmps_getid.c6
-rw-r--r--src/utmps/utmps_getline.c6
-rw-r--r--src/utmps/utmps_utmpx_unpack.c3
4 files changed, 9 insertions, 14 deletions
diff --git a/src/utmps/utmps-utmpd.c b/src/utmps/utmps-utmpd.c
index 101e3ad..e40d244 100644
--- a/src/utmps/utmps-utmpd.c
+++ b/src/utmps/utmps-utmpd.c
@@ -99,7 +99,7 @@ static int idmatch (unsigned short type, char const *id, struct utmpx const *b)
   else if (type == INIT_PROCESS || type == LOGIN_PROCESS || type == USER_PROCESS || type == DEAD_PROCESS)
   {
     if ((b->ut_type == INIT_PROCESS || b->ut_type == LOGIN_PROCESS || b->ut_type == USER_PROCESS || b->ut_type == DEAD_PROCESS)
-      && !strncmp(id, b->ut_id, UTMPS_UT_IDSIZE - 1)) return 1 ;
+      && !strncmp(id, b->ut_id, UTMPS_UT_IDSIZE)) return 1 ;
   }
   return 0 ;
 }
@@ -135,7 +135,6 @@ static void do_getid (void)
   char sbuf[1 + sizeof(struct utmpx)] = "" ;
   get0(rbuf, USHORT_PACK + UTMPS_UT_IDSIZE) ;
   ushort_unpack_big(rbuf, &type) ;
-  rbuf[USHORT_PACK + UTMPS_UT_IDSIZE - 1] = 0 ;
   maybe_open() ;
   lockit(0) ;
   for (;;)
@@ -160,7 +159,6 @@ static void do_getline (void)
   char rbuf[UTMPS_UT_LINESIZE] ;
   char sbuf[1 + sizeof(struct utmpx)] = "" ;
   get0(rbuf, UTMPS_UT_LINESIZE) ;
-  rbuf[UTMPS_UT_LINESIZE - 1] = 0 ;
   maybe_open() ;
   lockit(0) ;
   for (;;)
@@ -174,7 +172,7 @@ static void do_getline (void)
     }
     utmps_utmpx_unpack(sbuf+1, &b) ;
     if ((b.ut_type == LOGIN_PROCESS || b.ut_type == USER_PROCESS)
-      && !strncmp(rbuf, b.ut_line, UTMPS_UT_LINESIZE - 1)) break ;
+      && !strncmp(rbuf, b.ut_line, UTMPS_UT_LINESIZE)) break ;
   }
   unlockit() ;
   buffer_putnoflush(buffer_1small, sbuf, 1 + sizeof(struct utmpx)) ;
@@ -201,7 +199,7 @@ static void do_putline (uid_t uid, gid_t gid)
     char tmp[sizeof(struct utmpx)] ;
     if (!read_utmp_entry_unlocked(tmp)) break ;
     utmps_utmpx_unpack(tmp, &b) ;
-    if (idmatch(u.ut_type, u.ut_id, &b) && !strncmp(u.ut_line, b.ut_line, UTMPS_UT_LINESIZE - 1))
+    if (idmatch(u.ut_type, u.ut_id, &b) && !strncmp(u.ut_line, b.ut_line, UTMPS_UT_LINESIZE))
     {
       if (!onestepback())
       {
diff --git a/src/utmps/utmps_getid.c b/src/utmps/utmps_getid.c
index 622fec8..f347b3e 100644
--- a/src/utmps/utmps_getid.c
+++ b/src/utmps/utmps_getid.c
@@ -12,11 +12,11 @@
 int utmps_getid (utmps *a, unsigned short type, char const *id, struct utmpx *b, tain_t const *deadline, tain_t *stamp)
 {
   ssize_t r ;
-  char sbuf[1 + USHORT_PACK + UTMPS_UT_IDSIZE] = "i" ;
+  char sbuf[1 + USHORT_PACK + UTMPS_UT_IDSIZE] __attribute__ ((nonstring)) ;
   char rbuf[1 + sizeof(struct utmpx)] ;
+  sbuf[0] = 'i' ;
   ushort_pack_big(sbuf + 1, type) ;
-  memset(sbuf + 1 + USHORT_PACK, 0, UTMPS_UT_IDSIZE) ;
-  strncpy(sbuf + 1 + USHORT_PACK, id, UTMPS_UT_IDSIZE - 1) ;
+  strncpy(sbuf + 1 + USHORT_PACK, id, UTMPS_UT_IDSIZE) ;
   if (!ipc_timed_send(a->fd, sbuf, sizeof(sbuf), deadline, stamp)) return 0 ;
   r = ipc_timed_recv(a->fd, rbuf, sizeof(rbuf), 0, deadline, stamp) ;
   if (r < 0) return 0 ;
diff --git a/src/utmps/utmps_getline.c b/src/utmps/utmps_getline.c
index 4612082..686782a 100644
--- a/src/utmps/utmps_getline.c
+++ b/src/utmps/utmps_getline.c
@@ -11,10 +11,10 @@
 int utmps_getline (utmps *a, char const *line, struct utmpx *b, tain_t const *deadline, tain_t *stamp)
 {
   ssize_t r ;
-  char sbuf[1 + UTMPS_UT_LINESIZE] = "l" ;
+  char sbuf[1 + UTMPS_UT_LINESIZE] __attribute__ ((nonstring)) ;
   char rbuf[1 + sizeof(struct utmpx)] ;
-  memset(sbuf + 1, 0, UTMPS_UT_LINESIZE) ;
-  strncpy(sbuf + 1, line, UTMPS_UT_LINESIZE - 1) ;
+  sbuf[0] = 'l' ;
+  strncpy(sbuf + 1, line, UTMPS_UT_LINESIZE) ;
   if (!ipc_timed_send(a->fd, sbuf, sizeof(sbuf), deadline, stamp)) return 0 ;
   r = ipc_timed_recv(a->fd, rbuf, sizeof(rbuf), 0, deadline, stamp) ;
   if (r < 0) return 0 ;
diff --git a/src/utmps/utmps_utmpx_unpack.c b/src/utmps/utmps_utmpx_unpack.c
index 218126b..59959cc 100644
--- a/src/utmps/utmps_utmpx_unpack.c
+++ b/src/utmps/utmps_utmpx_unpack.c
@@ -6,7 +6,4 @@
 void utmps_utmpx_unpack (char const *s, struct utmpx *b)
 {
   memcpy(b, s, sizeof(struct utmpx)) ;
-  b->ut_user[UTMPS_UT_NAMESIZE - 1] = 0 ;
-  b->ut_line[UTMPS_UT_LINESIZE - 1] = 0 ;
-  b->ut_host[UTMPS_UT_HOSTSIZE - 1] = 0 ;
 }