commit 98f64f14c3dc52ec6afc00acc53dc9f42399d363 from: Stefan Sperling date: Tue Jan 05 17:17:58 2021 UTC work around spurious ACK responses from git servers in got-fetch-pack The Git server can apparently send duplicate ACK responses even though we do not enable the multi_ack capability. According to the Git protocol docs the server should only send ACKs after receiving 'done' from the client if multi_ack has been enabled. However, a duplicate ACK response can be triggered by running 'got fetch -a' in our fetch_update_tag test. This resulted in the following error: got-fetch-pack: unknown side-band received from server got: bad packet received commit - 132af4a5fe242aab94fc8049abfb80888c26395f commit + 98f64f14c3dc52ec6afc00acc53dc9f42399d363 blob - 9d3276731396175a544ea337396a6dad1abbe92e blob + dd739faa1ee3882e18ce87a0815acc3e0cc8e7c4 --- libexec/got-fetch-pack/got-fetch-pack.c +++ libexec/got-fetch-pack/got-fetch-pack.c @@ -991,6 +991,25 @@ fetch_pack(int fd, int packfd, uint8_t *pack_sha1, } err = fetch_error(buf, r); goto done; + } else if (buf[0] == 'A') { + err = readn(&r, fd, buf, datalen); + if (err) + goto done; + if (r != datalen) { + err = got_error_msg(GOT_ERR_BAD_PACKET, + "packet too short"); + goto done; + } + /* + * Git server responds with ACK after 'done' + * even though multi_ack is disabled?!? + */ + buf[r] = '\0'; + if (strncmp(buf, "CK ", 3) == 0) + continue; /* ignore */ + err = got_error_msg(GOT_ERR_BAD_PACKET, + "unexpected message from server"); + goto done; } else { err = got_error_msg(GOT_ERR_BAD_PACKET, "unknown side-band received from server"); blob - 06f040fb232eedbd33669ed3c736c29d8747c09f blob + 0af6ce58eaded1d0d98284d9acdf7306a7405494 --- regress/cmdline/fetch.sh +++ regress/cmdline/fetch.sh @@ -560,7 +560,7 @@ test_fetch_update_tag() { return 1 fi - got fetch -q -r $testroot/repo-clone + got fetch -a -q -r $testroot/repo-clone ret="$?" if [ "$ret" != "0" ]; then echo "got fetch command failed unexpectedly" >&2