commit 729743d1bc420980f12d403c1b116dc6c7153339 from: Stefan Sperling date: Mon Mar 23 21:34:06 2020 UTC revert 520a0c97f8081e4531fc9c88cda705a92afbddaf for now due to possible bug commit - 520a0c97f8081e4531fc9c88cda705a92afbddaf commit + 729743d1bc420980f12d403c1b116dc6c7153339 blob - a13983593527e1bbf7838e8ee03329b363d6a5c7 blob + fe49bfbdb846dbdf93b1ea61211e91911f5ee571 --- libexec/got-fetch-pack/got-fetch-pack.c +++ libexec/got-fetch-pack/got-fetch-pack.c @@ -648,6 +648,7 @@ send_fetch_ref(struct imsgbuf *ibuf, struct got_object return got_privsep_flush_imsg(ibuf); } + static const struct got_error * fetch_pack(int fd, int packfd, struct got_object_id *packid, struct got_pathlist_head *have_refs, int fetch_all_branches, @@ -669,14 +670,8 @@ fetch_pack(int fd, int packfd, struct got_object_id *p struct got_pathlist_entry *pe; int sent_my_capabilites = 0, have_sidebands = 0; int found_branch = 0; - SHA1_CTX sha1_ctx; - uint8_t pack_sha1[SHA1_DIGEST_LENGTH]; - uint8_t sha1_buf[SHA1_DIGEST_LENGTH]; - size_t sha1_buf_len = 0; - ssize_t w; TAILQ_INIT(&symrefs); - SHA1Init(&sha1_ctx); have = malloc(refsz * sizeof(have[0])); if (have == NULL) @@ -930,7 +925,7 @@ fetch_pack(int fd, int packfd, struct got_object_id *p have_sidebands = 1; while (1) { - ssize_t r = 0; + ssize_t r = 0, w; int datalen = -1; if (have_sidebands) { @@ -1004,43 +999,7 @@ fetch_pack(int fd, int packfd, struct got_object_id *p if (r <= 0) break; } - - /* - * An expected SHA1 checksum sits at the end of the pack file. - * Since we don't know the file size ahead of time we have to - * keep SHA1_DIGEST_LENGTH bytes buffered and avoid mixing - * those bytes into our SHA1 checksum computation until we - * know for sure that additional pack file data bytes follow. - * - * We can assume r > 0 since otherwise the loop would exit. - */ - if (r >= SHA1_DIGEST_LENGTH) { - /* Mix in any previously buffered bytes. */ - SHA1Update(&sha1_ctx, sha1_buf, sha1_buf_len); - - /* Mix in bytes read minus potential checksum bytes. */ - SHA1Update(&sha1_ctx, buf, r - SHA1_DIGEST_LENGTH); - - /* Buffer potential checksum bytes. */ - memcpy(sha1_buf, buf + r - SHA1_DIGEST_LENGTH, - SHA1_DIGEST_LENGTH); - sha1_buf_len = SHA1_DIGEST_LENGTH; - } else if (sha1_buf_len > r) { - /* - * Mix in previously buffered bytes which - * are not part of the checksum after all. - */ - SHA1Update(&sha1_ctx, sha1_buf, r); - /* Update potential checksum buffer. */ - memmove(sha1_buf, sha1_buf + r, sha1_buf_len - r); - memcpy(sha1_buf + sha1_buf_len - r, buf, r); - } else { - /* Short initial packet. Just buffer data for now. */ - memcpy(sha1_buf, buf, r); - sha1_buf_len = r; - } - /* Write packfile data to temporary pack file. */ w = write(packfd, buf, r); if (w == -1) { @@ -1064,13 +1023,6 @@ fetch_pack(int fd, int packfd, struct got_object_id *p err = send_fetch_download_progress(ibuf, packsz); if (err) goto done; - - SHA1Final(pack_sha1, &sha1_ctx); - if (sha1_buf_len != SHA1_DIGEST_LENGTH || - memcmp(pack_sha1, sha1_buf, sha1_buf_len) != 0) { - err = got_error_msg(GOT_ERR_BAD_PACKFILE, - "pack file checksum mismatch"); - } done: TAILQ_FOREACH(pe, &symrefs, entry) { free((void *)pe->path);