git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Jeff King <peff@peff.net>
To: "René Scharfe" <l.s.r@web.de>
Cc: Git List <git@vger.kernel.org>, Junio C Hamano <gitster@pobox.com>
Subject: Re: [PATCH] notes-merge: use O_EXCL to avoid overwriting existing files
Date: Fri, 8 Jul 2016 05:37:33 -0400	[thread overview]
Message-ID: <20160708093733.GA20528@sigill.intra.peff.net> (raw)
In-Reply-To: <577EB6BE.6090504@web.de>

On Thu, Jul 07, 2016 at 10:08:30PM +0200, René Scharfe wrote:

> diff --git a/notes-merge.c b/notes-merge.c
> index b7814c9..2b29fc4 100644
> --- a/notes-merge.c
> +++ b/notes-merge.c
> @@ -298,12 +298,8 @@ static void write_buf_to_worktree(const unsigned char *obj,
>  	char *path = git_pathdup(NOTES_MERGE_WORKTREE "/%s", sha1_to_hex(obj));
>  	if (safe_create_leading_directories_const(path))
>  		die_errno("unable to create directory for '%s'", path);
> -	if (file_exists(path))
> -		die("found existing file at '%s'", path);
>  
> -	fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, 0666);
> -	if (fd < 0)
> -		die_errno("failed to open '%s'", path);
> +	fd = xopen(path, O_WRONLY | O_EXCL | O_CREAT, 0666);

While working on write_file_buf() elsewhere, I wondered if this was a
good candidate for conversion. But it's not because of the O_EXCL.

I was tempted by something like:

  write_file_buf(path, O_EXCL, buf, len);

but I think that just makes the interface more cluttered for the other
callers. If you are doing something clever with O_EXCL, you probably
should just do it by hand.

However, we can make the loop less painful, as below (on top of your
patch).

-- >8 --
Subject: [PATCH] notes-merge: use write_or_die()

This output loop is overkill. For one thing, we do not need
to loop on write_in_full(); it's entire purpose is to avoid
looping, and it even includes the "disk full?" check itself.

Secondly, the check for EPIPE is pointless. We know this is
an on-disk file that we just opened, so short of somebody
sneaking a FIFO into our notes-merge working tree, it will
not be a pipe. And even if it is, we would generally die of
SIGPIPE before hitting this code. And even if we somehow
ignored SIGPIPE, dying (rather than silently ignoring the
error) seems like the only sensible action anyway.

So what we're left with is calling write_in_full() and dying
if it fails. And that's exactly what write_or_die() does.

Signed-off-by: Jeff King <peff@peff.net>
---
 notes-merge.c | 16 +---------------
 1 file changed, 1 insertion(+), 15 deletions(-)

diff --git a/notes-merge.c b/notes-merge.c
index 2b29fc4..a659a62 100644
--- a/notes-merge.c
+++ b/notes-merge.c
@@ -300,21 +300,7 @@ static void write_buf_to_worktree(const unsigned char *obj,
 		die_errno("unable to create directory for '%s'", path);
 
 	fd = xopen(path, O_WRONLY | O_EXCL | O_CREAT, 0666);
-
-	while (size > 0) {
-		long ret = write_in_full(fd, buf, size);
-		if (ret < 0) {
-			/* Ignore epipe */
-			if (errno == EPIPE)
-				break;
-			die_errno("notes-merge");
-		} else if (!ret) {
-			die("notes-merge: disk full?");
-		}
-		size -= ret;
-		buf += ret;
-	}
-
+	write_or_die(fd, buf, size);
 	close(fd);
 	free(path);
 }
-- 
2.9.0.393.g704e522


      parent reply	other threads:[~2016-07-08  9:43 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-07-07 20:08 [PATCH] notes-merge: use O_EXCL to avoid overwriting existing files René Scharfe
2016-07-07 20:38 ` Jeff King
2016-07-07 21:10   ` Junio C Hamano
2016-07-08  9:37 ` Jeff King [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160708093733.GA20528@sigill.intra.peff.net \
    --to=peff@peff.net \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    --cc=l.s.r@web.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).