xinstall: plug an infinite loop in directory creation

If stat continues to fail with ENOENT and mkdir with EEXIST the code wont
finish. In particular this can show up when the target path follows through
a symlink to a non-existent directory.

Reported by:	ae
MFC after:	1 week
This commit is contained in:
mjg 2017-10-12 13:59:23 +00:00
parent 851d0b97ab
commit 7c9141d948

View File

@ -1292,17 +1292,19 @@ install_dir(char *path)
{
char *p;
struct stat sb;
int ch;
int ch, tried_mkdir;
for (p = path;; ++p)
if (!*p || (p != path && *p == '/')) {
tried_mkdir = 0;
ch = *p;
*p = '\0';
again:
if (stat(path, &sb) < 0) {
if (errno != ENOENT)
if (errno != ENOENT || tried_mkdir)
err(EX_OSERR, "stat %s", path);
if (mkdir(path, 0755) < 0) {
tried_mkdir = 1;
if (errno == EEXIST)
goto again;
err(EX_OSERR, "mkdir %s", path);