One suggestion here: On Sun, Aug 2, 2020 at 7:41 AM René Scharfe <l.s.r@xxxxxx> wrote: > Like f0bca72dc77 (send-pack: use buffered I/O to talk to pack-objects, > 2016-06-08), significantly reduce the number of system calls and > simplify the code for sending object IDs to rev-list by using stdio's > buffering and handling errors after the loops. > > Signed-off-by: René Scharfe <l.s.r@xxxxxx> > --- > upload-pack.c | 21 +++++++-------------- > 1 file changed, 7 insertions(+), 14 deletions(-) > > diff --git a/upload-pack.c b/upload-pack.c > index 86737410709..9f616c2c6a6 100644 > --- a/upload-pack.c > +++ b/upload-pack.c [snip] > @@ -640,12 +636,11 @@ static int do_reachable_revlist(struct child_process *cmd, > } > if (reachable && o->type == OBJ_COMMIT) > o->flags |= TMP_MARK; > - memcpy(namebuf, oid_to_hex(&o->oid), hexsz); > - if (write_in_full(cmd->in, namebuf, hexsz + 1) < 0) > - goto error; > + fprintf(cmd_in, "%s\n", oid_to_hex(&o->oid)); The fprintf() call here *can* return an error, e.g., if the connection has died. If it does, it should set things up so that a later ferror(cmd_in) returns true. > } > - close(cmd->in); > cmd->in = -1; > + if (fclose(cmd_in)) > + goto error; The fclose() call doesn't necessarily check ferror(). (The FreeBSD stdio in particular definitely does not.) It might be better to use: failure = ferror(cmd_in); failure |= fclose(cmd_in); if (failure) ... here, or similar. (The temporary variable is not needed, but someone might assume `if (ferror(fp) | fclose(fp))` is a typo for `if (ferror(fp) || fclose(fp))`.) (Note: my sample isn't properly indented as gmail does not let me insert tabs easily) Chris