From: Junio C Hamano <gitster@pobox.com>
To: Patrick Steinhardt <ps@pks.im>
Cc: git@vger.kernel.org, Christian Couder <christian.couder@gmail.com>
Subject: Re: [PATCH v3 2/5] fetch: use strbuf to format FETCH_HEAD updates
Date: Mon, 11 Jan 2021 15:21:35 -0800 [thread overview]
Message-ID: <xmqqsg775abk.fsf@gitster.c.googlers.com> (raw)
In-Reply-To: <a19762690eb7f9957ac31d73e110f0103aeb2307.1610362744.git.ps@pks.im> (Patrick Steinhardt's message of "Mon, 11 Jan 2021 12:05:20 +0100")
Patrick Steinhardt <ps@pks.im> writes:
> @@ -909,6 +910,7 @@ static int open_fetch_head(struct fetch_head *fetch_head)
> fetch_head->fp = fopen(filename, "a");
> if (!fetch_head->fp)
> return error_errno(_("cannot open %s"), filename);
> + strbuf_init(&fetch_head->buf, 0);
> } else {
> fetch_head->fp = NULL;
> }
Leaving fetch_head->buf uninitialized is probably OK as the caller
of open_fetch_head() would (or at least should) immediately barf
upon seeing an error return?
Ah, no. Under dry-run mode, we will return success but leave buf
uninitializesd. It is safe because we do not use the strbuf when fp
is NULL. OK.
> @@ -941,14 +943,17 @@ static void append_fetch_head(struct fetch_head *fetch_head,
> return;
> }
>
> - fprintf(fetch_head->fp, "%s\t%s\t%s",
> - oid_to_hex_r(old_oid_hex, old_oid), merge_status_marker, note);
> + strbuf_addf(&fetch_head->buf, "%s\t%s\t%s",
> + oid_to_hex_r(old_oid_hex, old_oid), merge_status_marker, note);
> for (i = 0; i < url_len; ++i)
> if ('\n' == url[i])
> - fputs("\\n", fetch_head->fp);
> + strbuf_addstr(&fetch_head->buf, "\\n");
> else
> - fputc(url[i], fetch_head->fp);
> - fputc('\n', fetch_head->fp);
> + strbuf_addch(&fetch_head->buf, url[i]);
> + strbuf_addch(&fetch_head->buf, '\n');
> +
> + strbuf_write(&fetch_head->buf, fetch_head->fp);
> + strbuf_reset(&fetch_head->buf);
This gets us closer to fixing the "one record can be written out
with multiple write(2) calls, allowing parallel fetches to corrupt
FETCH_HEAD file by intermixed records" problem (even though this
change alone would not solve it---for that we need to do write
ourselves, not letting stdio do the flushing).
> }
>
> static void commit_fetch_head(struct fetch_head *fetch_head)
> @@ -962,6 +967,7 @@ static void close_fetch_head(struct fetch_head *fetch_head)
> return;
>
> fclose(fetch_head->fp);
> + strbuf_release(&fetch_head->buf);
> }
>
> static const char warn_show_forced_updates[] =
next prev parent reply other threads:[~2021-01-12 0:28 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-07 13:51 [PATCH 0/2] fetch: implement support for atomic reference updates Patrick Steinhardt
2021-01-07 13:51 ` [PATCH 1/2] fetch: allow passing a transaction to `s_update_ref()` Patrick Steinhardt
2021-01-07 22:59 ` Junio C Hamano
2021-01-08 0:45 ` Christian Couder
2021-01-08 7:18 ` Junio C Hamano
2021-01-07 13:51 ` [PATCH 2/2] fetch: implement support for atomic reference updates Patrick Steinhardt
2021-01-08 0:19 ` Junio C Hamano
2021-01-08 12:11 ` [PATCH v2 0/4] " Patrick Steinhardt
2021-01-08 12:11 ` [PATCH v2 1/4] fetch: extract writing to FETCH_HEAD Patrick Steinhardt
2021-01-08 23:40 ` Junio C Hamano
2021-01-11 10:26 ` Patrick Steinhardt
2021-01-11 19:24 ` Junio C Hamano
2021-01-08 12:11 ` [PATCH v2 2/4] fetch: refactor `s_update_ref` to use common exit path Patrick Steinhardt
2021-01-08 23:50 ` Junio C Hamano
2021-01-11 10:28 ` Patrick Steinhardt
2021-01-08 12:11 ` [PATCH v2 3/4] fetch: allow passing a transaction to `s_update_ref()` Patrick Steinhardt
2021-01-08 23:53 ` Junio C Hamano
2021-01-08 12:11 ` [PATCH v2 4/4] fetch: implement support for atomic reference updates Patrick Steinhardt
2021-01-09 0:05 ` Junio C Hamano
2021-01-11 10:42 ` Patrick Steinhardt
2021-01-11 19:47 ` Junio C Hamano
2021-01-12 12:22 ` Patrick Steinhardt
2021-01-12 12:29 ` Patrick Steinhardt
2021-01-12 19:19 ` Junio C Hamano
2021-01-11 11:05 ` [PATCH v3 0/5] " Patrick Steinhardt
2021-01-11 11:05 ` [PATCH v3 1/5] fetch: extract writing to FETCH_HEAD Patrick Steinhardt
2021-01-11 23:16 ` Junio C Hamano
2021-01-11 11:05 ` [PATCH v3 2/5] fetch: use strbuf to format FETCH_HEAD updates Patrick Steinhardt
2021-01-11 11:10 ` Patrick Steinhardt
2021-01-11 11:17 ` Christian Couder
2021-01-11 23:21 ` Junio C Hamano [this message]
2021-01-11 11:05 ` [PATCH v3 3/5] fetch: refactor `s_update_ref` to use common exit path Patrick Steinhardt
2021-01-11 11:05 ` [PATCH v3 4/5] fetch: allow passing a transaction to `s_update_ref()` Patrick Steinhardt
2021-01-11 11:05 ` [PATCH v3 5/5] fetch: implement support for atomic reference updates Patrick Steinhardt
2021-01-12 0:04 ` [PATCH v3 0/5] " Junio C Hamano
2021-01-12 12:27 ` [PATCH v4 " Patrick Steinhardt
2021-01-12 12:27 ` [PATCH v4 1/5] fetch: extract writing to FETCH_HEAD Patrick Steinhardt
2021-01-12 12:27 ` [PATCH v4 2/5] fetch: use strbuf to format FETCH_HEAD updates Patrick Steinhardt
2021-01-12 12:27 ` [PATCH v4 3/5] fetch: refactor `s_update_ref` to use common exit path Patrick Steinhardt
2021-01-12 12:27 ` [PATCH v4 4/5] fetch: allow passing a transaction to `s_update_ref()` Patrick Steinhardt
2021-01-12 12:27 ` [PATCH v4 5/5] fetch: implement support for atomic reference updates Patrick Steinhardt
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqsg775abk.fsf@gitster.c.googlers.com \
--to=gitster@pobox.com \
--cc=christian.couder@gmail.com \
--cc=git@vger.kernel.org \
--cc=ps@pks.im \
/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.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.