This squashes the last race condition I was actively hitting while running
`test-concurrency.py` in a loop. The race is when process A finds a tmpdir to
reuse, and goes to lock it. Meanwhile process B deletes it and unlocks the lock.
Process A then succeeds at grabbing a lock, but the tmpdir is deleted.
Closes: #1352
Approved by: dbnicholson
}
else
{
- did_lock = TRUE;
+ /* It's possible that we got a lock after seeing the directory, but
+ * another process deleted the tmpdir, so verify it still exists.
+ */
+ struct stat stbuf;
+ if (!glnx_fstatat_allow_noent (tmpdir_dfd, tmpdir_name, &stbuf, AT_SYMLINK_NOFOLLOW, error))
+ return FALSE;
+ if (errno == 0 && S_ISDIR (stbuf.st_mode))
+ did_lock = TRUE;
+ else
+ glnx_release_lock_file (file_lock_out);
}
*out_did_lock = did_lock;