]> granicus.if.org Git - procps-ng/commitdiff
0037-proc/devname.c: Use snprintf() in link_name().
authorQualys Security Advisory <qsa@qualys.com>
Thu, 1 Jan 1970 00:00:00 +0000 (00:00 +0000)
committerCraig Small <csmall@enc.com.au>
Sat, 9 Jun 2018 11:35:19 +0000 (21:35 +1000)
Found no problematic use case at the moment, but better safe than sorry.
Also, return an error on snprintf() or readlink() truncation.

proc/devname.c

index 68071c0e30b1a064648b8cbb24ea72235e2633ce..40318a96c8380de780510046bb3046fa2826446e 100644 (file)
@@ -287,10 +287,11 @@ static int guess_name(char *restrict const buf, unsigned maj, unsigned min){
 static int link_name(char *restrict const buf, unsigned maj, unsigned min, int pid, const char *restrict name){
   struct stat sbuf;
   char path[32];
-  int count;
-  sprintf(path, "/proc/%d/%s", pid, name);  /* often permission denied */
+  ssize_t count;
+  const int len = snprintf(path, sizeof path, "/proc/%d/%s", pid, name);  /* often permission denied */
+  if(len <= 0 || (size_t)len >= sizeof path) return 0;
   count = readlink(path,buf,TTY_NAME_SIZE-1);
-  if(count == -1) return 0;
+  if(count <= 0 || count >= TTY_NAME_SIZE-1) return 0;
   buf[count] = '\0';
   if(stat(buf, &sbuf) < 0) return 0;
   if(min != MINOR_OF(sbuf.st_rdev)) return 0;