On Monday, February 26, 2024 6:51 PM, Junio C Hamano wrote: >"Randall S. Becker" <the.n.e.key@xxxxxxxxx> writes: > >> From: "Randall S. Becker" <rsbecker@xxxxxxxxxxxxx> >> >> This change is required because some platforms do not support file >> writes of arbitrary sizes (e.g, NonStop). xwrite ends up truncating >> the output to the maximum single I/O size possible for the destination device. > >As msg[] here is 4k on-stack buffer, if the I/O size is small enough, the above may happen, and I think write-in-full is warranted here. If >your I/O must be done in 1k chunks, it would be very slow to run things like writing a pack stream to clone any non-toy projects, >though X-<. On the x86 platform, we get a size large enough not to trigger the failure in t7704. However, on ia64, the limit is 56Kb, which apparently does. I'm hoping no one else has a 1Kb limit - although some TCP stacks might experience it. Either way, truncating a package is bad. Fortunately the I/O subsystem on NonStop is very fast (basically DMA) between process memory space. > >> Signed-off-by: Randall S. Becker <rsbecker@xxxxxxxxxxxxx> >> --- >> builtin/receive-pack.c | 5 +++-- >> 1 file changed, 3 insertions(+), 2 deletions(-) >> >> diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c index >> db65607485..5064f3d300 100644 >> --- a/builtin/receive-pack.c >> +++ b/builtin/receive-pack.c >> @@ -455,8 +455,9 @@ static void report_message(const char *prefix, >> const char *err, va_list params) >> >> if (use_sideband) >> send_sideband(1, 2, msg, sz, use_sideband); >> - else >> - xwrite(2, msg, sz); >> + else { >> + write_in_full(2, msg, sz); >> + } >> } >> >> __attribute__((format (printf, 1, 2)))