Fixes new warnings in glocktop that appeared in Fedora 28 (gcc 8.0.1 /
glibc 2.27), e.g.:

  glocktop.c:1806:30: warning: '_waiters' directive writing 8 bytes
  into a region of size between 2 and 4091 [-Wformat-overflow=]

Signed-off-by: Andrew Price <anpr...@redhat.com>
---
 gfs2/glocktop/glocktop.c | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/gfs2/glocktop/glocktop.c b/gfs2/glocktop/glocktop.c
index 0305d3dd..7d65ac4a 100644
--- a/gfs2/glocktop/glocktop.c
+++ b/gfs2/glocktop/glocktop.c
@@ -921,7 +921,7 @@ static void show_dlm_grants(int locktype, const char 
*g_line, int dlmgrants,
                            int summary)
 {
        int i;
-       char dlm_resid[64];
+       char dlm_resid[75];
        unsigned int lkb_id, lkbnodeid, remid, ownpid, exflags, flags, status;
        unsigned int grmode, rqmode, nodeid, length;
        unsigned long long xid, us;
@@ -1596,7 +1596,7 @@ static void parse_glocks_file(int fd, const char *fsname, 
int dlmwaiters,
                              int dlmgrants, int trace_dir_path,
                              int show_held, int help, int summary)
 {
-       char fstitle[96], fsdlm[96];
+       char fstitle[96], fsdlm[105];
        char ctimestr[64];
        time_t t;
        int i;
@@ -1652,7 +1652,7 @@ int main(int argc, char **argv)
 {
        int fd;
        DIR *dir = NULL;
-       char fn[PATH_MAX];
+       char *fn;
        struct dirent *dent;
        int retval;
        int refresh_time = REFRESH_TIME;
@@ -1772,8 +1772,12 @@ int main(int argc, char **argv)
        while (!done) {
                struct timeval tv;
 
-               sprintf(fn, "%s/gfs2/", debugfs);
+               if (asprintf(&fn, "%s/gfs2/", debugfs) == -1) {
+                       perror(argv[0]);
+                       exit(-1);
+               }
                dir = opendir(fn);
+               free(fn);
 
                if (!dir) {
                        if (interactive) {
@@ -1787,7 +1791,7 @@ int main(int argc, char **argv)
                display_title_lines();
                while ((dent = readdir(dir))) {
                        const char *fsname;
-                       char dlm_fn[PATH_MAX];
+                       char dlm_fn[PATH_MAX+5+8]; /* "/dlm/" and "_waiters" */
                        FILE *dlmf;
                        int dlmfd;
 
@@ -1822,8 +1826,10 @@ int main(int argc, char **argv)
                                }
                        }
 
-                       sprintf(fn, "%s/gfs2/%s/glocks", debugfs,
-                               dent->d_name);
+                       if (asprintf(&fn, "%s/gfs2/%s/glocks", debugfs, 
dent->d_name) == -1) {
+                               perror(argv[0]);
+                               exit(-1);
+                       }
                        fd = open(fn, O_RDONLY);
                        if (fd < 0) {
                                if (interactive) {
@@ -1831,8 +1837,10 @@ int main(int argc, char **argv)
                                        endwin();
                                }
                                perror(fn);
+                               free(fn);
                                exit(-1);
                        }
+                       free(fn);
                        parse_glocks_file(fd, fsname, dlmwaiters, dlmgrants,
                                          trace_dir_path, show_held, help,
                                          summary);
-- 
2.16.2

Reply via email to