Fix SSL creds file watching on kevent platforms (BSDs) for symlinks
authorJeremy Harris <jgh146exb@wizmail.org>
Sat, 5 Jun 2021 19:47:12 +0000 (20:47 +0100)
committerJeremy Harris <jgh146exb@wizmail.org>
Sat, 5 Jun 2021 19:47:12 +0000 (20:47 +0100)
src/src/tls.c

index e073eadbeb3f47a4c12ed72ce1246324a6589888..3de417eca0498ca710ab178eb3f52642ffa3e8e4 100644 (file)
@@ -158,8 +158,8 @@ return FALSE;
 # endif
 # ifdef EXIM_HAVE_KEVENT
 {
-uschar * s;
-int fd1, fd2, i, cnt = 0;
+uschar * s, * t;
+int fd1, fd2, i, j, cnt = 0;
 struct stat sb;
 #ifdef OpenBSD
 struct kevent k_dummy;
@@ -209,11 +209,14 @@ for (;;)
 
   if (!(S_ISLNK(sb.st_mode))) break;
 
-  s = store_get(1024, FALSE);
-  if ((i = readlink(CCS filename, (void *)s, 1024)) < 0) { s = US"readlink"; goto bad; }
-  filename = s;
-  *(s += i) = '\0';
-  store_release_above(s+1);
+  t = store_get(1024, FALSE);
+  Ustrncpy(t, s, 1022);
+  j = Ustrlen(s);
+  t[j++] = '/';
+  if ((i = readlink(CCS filename, (void *)(t+j), 1023-j)) < 0) { s = US"readlink"; goto bad; }
+  filename = t;
+  *(t += i+j) = '\0';
+  store_release_above(t+1);
   }
 
 #ifdef OpenBSD