Fix -Wsizeof-pointer-memaccess better.
authorSascha Wildner <saw@online.de>
Fri, 23 Mar 2018 09:19:01 +0000 (10:19 +0100)
committerSascha Wildner <saw@online.de>
Sun, 1 Apr 2018 11:25:10 +0000 (13:25 +0200)
My previous commits:

56267d362d5769c8df07bf26d5e322610e0d24b4
562a180a58780b719830629307e6283c30c85229

caused out of bounds write by one byte. This commit fixes the
warning and restores the code what was there before.

contrib/opie/libopie/insecure.c
libexec/comsat/comsat.c
usr.bin/who/utmpentry.c

index f76661b..314d7af 100644 (file)
@@ -135,7 +135,8 @@ int opieinsecure FUNCTION_NOARGS
        char host[sizeof(utmp.ut_host) + 1];
        insecure = 1;
 
        char host[sizeof(utmp.ut_host) + 1];
        insecure = 1;
 
-       strncpy(host, utmp.ut_host, sizeof(host));
+       strncpy(host, utmp.ut_host, sizeof(host) - 1);
+       host[sizeof(host) - 1] = '\0';
 
        if ((s = strchr(host, ':')) != NULL) {
          int n = s - host;
 
        if ((s = strchr(host, ':')) != NULL) {
          int n = s - host;
index 706135c..07ecb93 100644 (file)
@@ -212,7 +212,8 @@ notify(struct utmp *utp, char *file, off_t offset, int folder)
        }
        tcgetattr(fileno(tp), &tio);
        cr = ((tio.c_oflag & (OPOST|ONLCR)) == (OPOST|ONLCR)) ?  "\n" : "\n\r";
        }
        tcgetattr(fileno(tp), &tio);
        cr = ((tio.c_oflag & (OPOST|ONLCR)) == (OPOST|ONLCR)) ?  "\n" : "\n\r";
-       strncpy(name, utp->ut_name, sizeof(name));
+       strncpy(name, utp->ut_name, sizeof(name) - 1);
+       name[sizeof(name) - 1] = '\0';
        switch (stb.st_mode & (S_IXUSR | S_IXGRP)) {
        case S_IXUSR:
        case (S_IXUSR | S_IXGRP):
        switch (stb.st_mode & (S_IXUSR | S_IXGRP)) {
        case S_IXUSR:
        case (S_IXUSR | S_IXGRP):
index f4227cb..b4f23b8 100644 (file)
@@ -310,9 +310,9 @@ getentry(struct utmpentry *e, struct utmp *up)
         * reason we use the size of the _source_ as the length
         * argument.
         */
         * reason we use the size of the _source_ as the length
         * argument.
         */
-       (void)strncpy(e->name, up->ut_name, sizeof(e->name));
-       (void)strncpy(e->line, up->ut_line, sizeof(e->line));
-       (void)strncpy(e->host, up->ut_host, sizeof(e->host));
+       (void)strncpy(e->name, up->ut_name, sizeof(e->name) - 1);
+       (void)strncpy(e->line, up->ut_line, sizeof(e->line) - 1);
+       (void)strncpy(e->host, up->ut_host, sizeof(e->host) - 1);
 
        e->tv.tv_sec = up->ut_time;
        e->tv.tv_usec = 0;
 
        e->tv.tv_sec = up->ut_time;
        e->tv.tv_usec = 0;
@@ -343,9 +343,9 @@ getentryx(struct utmpentry *e, struct utmpx *up)
         * reason we use the size of the _source_ as the length
         * argument.
         */
         * reason we use the size of the _source_ as the length
         * argument.
         */
-       (void)strncpy(e->name, up->ut_name, sizeof(e->name));
-       (void)strncpy(e->line, up->ut_line, sizeof(e->line));
-       (void)strncpy(e->host, up->ut_host, sizeof(e->host));
+       (void)strncpy(e->name, up->ut_name, sizeof(e->name) - 1);
+       (void)strncpy(e->line, up->ut_line, sizeof(e->line) - 1);
+       (void)strncpy(e->host, up->ut_host, sizeof(e->host) - 1);
 
        e->tv = up->ut_tv;
        e->pid = up->ut_pid;
 
        e->tv = up->ut_tv;
        e->pid = up->ut_pid;