Blob Blame History Raw
From 2b1643d361274d52259820561747165af423a420 Mon Sep 17 00:00:00 2001
From: Mamoru TASAKA <mtasaka@fedoraproject.org>
Date: Mon, 28 Dec 2020 15:14:30 +0900
Subject: [PATCH 4/6] xscreensaver-systemd: fix blurb strncpy

Shut up the following gcc11 -Wall warning:
---------------------------------------------
In function 'strncpy',
    inlined from 'blurb' at ../../driver/xscreensaver-systemd.c:387:3:
/usr/include/bits/string_fortified.h:91:10: warning: 'strncpy' output may be truncated copying 8 bytes from a string of length 88 [-Wstringop-truncation]
---------------------------------------------

Note that the current blurb() implementation contains some code which is
actually not working. Currently:
---------------------------------------------
   376  blurb (void)
   377  {
   378    static char buf[255];

   386    ctime_r (&now, ct);
   387    strncpy(buf+n, ct+11, 8);
   388    strcpy(buf+n+9, ": ");
   389    return buf;
   390  }
---------------------------------------------
With the line 378, the contents of buf[] is all initialized to 0.
the line 388 strncpy() puts some string from ct to
buf[n+0], buf[n+1], ... , and buf[n+7] (8 bytes, not putting terminating
null character). Here buf[n+8] is still 0 (null character) because
buf[] is all initialized to 0.
The line 388 puts the string to buf[n+9] and buf[n+10], but as
buf[n+8] is still 0, the line 388 does essentially nothing.

Note that the other part of this file calls blurb() like:
----------------------------------------------
   402      fprintf (stderr, "%s: exec: %s\n", blurb(), buf);
----------------------------------------------
i.e. "%s" always followed by ":" which compensates for the line 388.
---
 driver/xscreensaver-systemd.c | 8 +-------
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/driver/xscreensaver-systemd.c b/driver/xscreensaver-systemd.c
index 2da99de..f6bd104 100644
--- a/driver/xscreensaver-systemd.c
+++ b/driver/xscreensaver-systemd.c
@@ -378,14 +378,8 @@ blurb (void)
   static char buf[255];
   time_t now = time ((time_t *) 0);
   char ct[100];
-  int n = strlen(progname);
-  if (n > 100) n = 99;
-  strncpy(buf, progname, n);
-  buf[n++] = ':';
-  buf[n++] = ' ';
   ctime_r (&now, ct);
-  strncpy(buf+n, ct+11, 8);
-  strcpy(buf+n+9, ": ");
+  sprintf(buf, "%.99s: %.8s", progname, ct);
   return buf;
 }
 
-- 
2.29.2