From 2e4e1ffe620d48454983a717e73881f63cc64801 Mon Sep 17 00:00:00 2001 From: Brian Somers Date: Fri, 6 Aug 1999 08:34:42 +0000 Subject: [PATCH] Set the close-on-exec flag when we lock the file we're editing. This prevents any background sub-command executed from inheriting the descriptor & lock (and making vi think that someone else is editing the file when it re-edits). Remembered from: An OpenBSD commit message from May '99 --- contrib/nvi/common/exf.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/contrib/nvi/common/exf.c b/contrib/nvi/common/exf.c index 2993b0f4a8a5..6f0e160f272c 100644 --- a/contrib/nvi/common/exf.c +++ b/contrib/nvi/common/exf.c @@ -1438,11 +1438,15 @@ file_lock(sp, name, fdp, fd, iswrite) * they are the former. There's no portable way to do this. */ errno = 0; - return (flock(fd, LOCK_EX | LOCK_NB) ? errno == EAGAIN + if (!flock(fd, LOCK_EX | LOCK_NB)) { + fcntl(fd, F_SETFD, 1); + return (LOCK_SUCCESS); + } + return (errno == EAGAIN #ifdef EWOULDBLOCK || errno == EWOULDBLOCK #endif - ? LOCK_UNAVAIL : LOCK_FAILED : LOCK_SUCCESS); + ? LOCK_UNAVAIL : LOCK_FAILED); #endif #ifdef HAVE_LOCK_FCNTL /* Gag me. We've got fcntl(2). */ { @@ -1470,8 +1474,11 @@ file_lock(sp, name, fdp, fd, iswrite) } errno = 0; - if (!fcntl(fd, F_SETLK, &arg)) + if (!fcntl(fd, F_SETLK, &arg)) { + fcntl(fd, F_SETFD, 1); return (LOCK_SUCCESS); + } + if (didopen) { sverrno = errno; (void)close(fd);