1 #include "cache.h"
2 #include "list.h"
3 #include "pack.h"
4 #include "repository.h"
5 #include "dir.h"
6 #include "mergesort.h"
7 #include "packfile.h"
8 #include "delta.h"
9 #include "streaming.h"
10 #include "hash-lookup.h"
11 #include "commit.h"
12 #include "object.h"
13 #include "tag.h"
14 #include "tree-walk.h"
15 #include "tree.h"
16 #include "object-store.h"
17 #include "midx.h"
18 #include "commit-graph.h"
19 #include "promisor-remote.h"
20 
odb_pack_name(struct strbuf * buf,const unsigned char * hash,const char * ext)21 char *odb_pack_name(struct strbuf *buf,
22 		    const unsigned char *hash,
23 		    const char *ext)
24 {
25 	strbuf_reset(buf);
26 	strbuf_addf(buf, "%s/pack/pack-%s.%s", get_object_directory(),
27 		    hash_to_hex(hash), ext);
28 	return buf->buf;
29 }
30 
sha1_pack_name(const unsigned char * sha1)31 char *sha1_pack_name(const unsigned char *sha1)
32 {
33 	static struct strbuf buf = STRBUF_INIT;
34 	return odb_pack_name(&buf, sha1, "pack");
35 }
36 
sha1_pack_index_name(const unsigned char * sha1)37 char *sha1_pack_index_name(const unsigned char *sha1)
38 {
39 	static struct strbuf buf = STRBUF_INIT;
40 	return odb_pack_name(&buf, sha1, "idx");
41 }
42 
43 static unsigned int pack_used_ctr;
44 static unsigned int pack_mmap_calls;
45 static unsigned int peak_pack_open_windows;
46 static unsigned int pack_open_windows;
47 static unsigned int pack_open_fds;
48 static unsigned int pack_max_fds;
49 static size_t peak_pack_mapped;
50 static size_t pack_mapped;
51 
52 #define SZ_FMT PRIuMAX
sz_fmt(size_t s)53 static inline uintmax_t sz_fmt(size_t s) { return s; }
54 
pack_report(void)55 void pack_report(void)
56 {
57 	fprintf(stderr,
58 		"pack_report: getpagesize()            = %10" SZ_FMT "\n"
59 		"pack_report: core.packedGitWindowSize = %10" SZ_FMT "\n"
60 		"pack_report: core.packedGitLimit      = %10" SZ_FMT "\n",
61 		sz_fmt(getpagesize()),
62 		sz_fmt(packed_git_window_size),
63 		sz_fmt(packed_git_limit));
64 	fprintf(stderr,
65 		"pack_report: pack_used_ctr            = %10u\n"
66 		"pack_report: pack_mmap_calls          = %10u\n"
67 		"pack_report: pack_open_windows        = %10u / %10u\n"
68 		"pack_report: pack_mapped              = "
69 			"%10" SZ_FMT " / %10" SZ_FMT "\n",
70 		pack_used_ctr,
71 		pack_mmap_calls,
72 		pack_open_windows, peak_pack_open_windows,
73 		sz_fmt(pack_mapped), sz_fmt(peak_pack_mapped));
74 }
75 
76 /*
77  * Open and mmap the index file at path, perform a couple of
78  * consistency checks, then record its information to p.  Return 0 on
79  * success.
80  */
check_packed_git_idx(const char * path,struct packed_git * p)81 static int check_packed_git_idx(const char *path, struct packed_git *p)
82 {
83 	void *idx_map;
84 	size_t idx_size;
85 	int fd = git_open(path), ret;
86 	struct stat st;
87 	const unsigned int hashsz = the_hash_algo->rawsz;
88 
89 	if (fd < 0)
90 		return -1;
91 	if (fstat(fd, &st)) {
92 		close(fd);
93 		return -1;
94 	}
95 	idx_size = xsize_t(st.st_size);
96 	if (idx_size < 4 * 256 + hashsz + hashsz) {
97 		close(fd);
98 		return error("index file %s is too small", path);
99 	}
100 	idx_map = xmmap(NULL, idx_size, PROT_READ, MAP_PRIVATE, fd, 0);
101 	close(fd);
102 
103 	ret = load_idx(path, hashsz, idx_map, idx_size, p);
104 
105 	if (ret)
106 		munmap(idx_map, idx_size);
107 
108 	return ret;
109 }
110 
load_idx(const char * path,const unsigned int hashsz,void * idx_map,size_t idx_size,struct packed_git * p)111 int load_idx(const char *path, const unsigned int hashsz, void *idx_map,
112 	     size_t idx_size, struct packed_git *p)
113 {
114 	struct pack_idx_header *hdr = idx_map;
115 	uint32_t version, nr, i, *index;
116 
117 	if (idx_size < 4 * 256 + hashsz + hashsz)
118 		return error("index file %s is too small", path);
119 	if (idx_map == NULL)
120 		return error("empty data");
121 
122 	if (hdr->idx_signature == htonl(PACK_IDX_SIGNATURE)) {
123 		version = ntohl(hdr->idx_version);
124 		if (version < 2 || version > 2)
125 			return error("index file %s is version %"PRIu32
126 				     " and is not supported by this binary"
127 				     " (try upgrading GIT to a newer version)",
128 				     path, version);
129 	} else
130 		version = 1;
131 
132 	nr = 0;
133 	index = idx_map;
134 	if (version > 1)
135 		index += 2;  /* skip index header */
136 	for (i = 0; i < 256; i++) {
137 		uint32_t n = ntohl(index[i]);
138 		if (n < nr)
139 			return error("non-monotonic index %s", path);
140 		nr = n;
141 	}
142 
143 	if (version == 1) {
144 		/*
145 		 * Total size:
146 		 *  - 256 index entries 4 bytes each
147 		 *  - 24-byte entries * nr (object ID + 4-byte offset)
148 		 *  - hash of the packfile
149 		 *  - file checksum
150 		 */
151 		if (idx_size != st_add(4 * 256 + hashsz + hashsz, st_mult(nr, hashsz + 4)))
152 			return error("wrong index v1 file size in %s", path);
153 	} else if (version == 2) {
154 		/*
155 		 * Minimum size:
156 		 *  - 8 bytes of header
157 		 *  - 256 index entries 4 bytes each
158 		 *  - object ID entry * nr
159 		 *  - 4-byte crc entry * nr
160 		 *  - 4-byte offset entry * nr
161 		 *  - hash of the packfile
162 		 *  - file checksum
163 		 * And after the 4-byte offset table might be a
164 		 * variable sized table containing 8-byte entries
165 		 * for offsets larger than 2^31.
166 		 */
167 		size_t min_size = st_add(8 + 4*256 + hashsz + hashsz, st_mult(nr, hashsz + 4 + 4));
168 		size_t max_size = min_size;
169 		if (nr)
170 			max_size = st_add(max_size, st_mult(nr - 1, 8));
171 		if (idx_size < min_size || idx_size > max_size)
172 			return error("wrong index v2 file size in %s", path);
173 		if (idx_size != min_size &&
174 		    /*
175 		     * make sure we can deal with large pack offsets.
176 		     * 31-bit signed offset won't be enough, neither
177 		     * 32-bit unsigned one will be.
178 		     */
179 		    (sizeof(off_t) <= 4))
180 			return error("pack too large for current definition of off_t in %s", path);
181 		p->crc_offset = 8 + 4 * 256 + nr * hashsz;
182 	}
183 
184 	p->index_version = version;
185 	p->index_data = idx_map;
186 	p->index_size = idx_size;
187 	p->num_objects = nr;
188 	return 0;
189 }
190 
open_pack_index(struct packed_git * p)191 int open_pack_index(struct packed_git *p)
192 {
193 	char *idx_name;
194 	size_t len;
195 	int ret;
196 
197 	if (p->index_data)
198 		return 0;
199 
200 	if (!strip_suffix(p->pack_name, ".pack", &len))
201 		BUG("pack_name does not end in .pack");
202 	idx_name = xstrfmt("%.*s.idx", (int)len, p->pack_name);
203 	ret = check_packed_git_idx(idx_name, p);
204 	free(idx_name);
205 	return ret;
206 }
207 
get_pack_fanout(struct packed_git * p,uint32_t value)208 uint32_t get_pack_fanout(struct packed_git *p, uint32_t value)
209 {
210 	const uint32_t *level1_ofs = p->index_data;
211 
212 	if (!level1_ofs) {
213 		if (open_pack_index(p))
214 			return 0;
215 		level1_ofs = p->index_data;
216 	}
217 
218 	if (p->index_version > 1) {
219 		level1_ofs += 2;
220 	}
221 
222 	return ntohl(level1_ofs[value]);
223 }
224 
alloc_packed_git(int extra)225 static struct packed_git *alloc_packed_git(int extra)
226 {
227 	struct packed_git *p = xmalloc(st_add(sizeof(*p), extra));
228 	memset(p, 0, sizeof(*p));
229 	p->pack_fd = -1;
230 	return p;
231 }
232 
parse_pack_index(unsigned char * sha1,const char * idx_path)233 struct packed_git *parse_pack_index(unsigned char *sha1, const char *idx_path)
234 {
235 	const char *path = sha1_pack_name(sha1);
236 	size_t alloc = st_add(strlen(path), 1);
237 	struct packed_git *p = alloc_packed_git(alloc);
238 
239 	memcpy(p->pack_name, path, alloc); /* includes NUL */
240 	hashcpy(p->hash, sha1);
241 	if (check_packed_git_idx(idx_path, p)) {
242 		free(p);
243 		return NULL;
244 	}
245 
246 	return p;
247 }
248 
scan_windows(struct packed_git * p,struct packed_git ** lru_p,struct pack_window ** lru_w,struct pack_window ** lru_l)249 static void scan_windows(struct packed_git *p,
250 	struct packed_git **lru_p,
251 	struct pack_window **lru_w,
252 	struct pack_window **lru_l)
253 {
254 	struct pack_window *w, *w_l;
255 
256 	for (w_l = NULL, w = p->windows; w; w = w->next) {
257 		if (!w->inuse_cnt) {
258 			if (!*lru_w || w->last_used < (*lru_w)->last_used) {
259 				*lru_p = p;
260 				*lru_w = w;
261 				*lru_l = w_l;
262 			}
263 		}
264 		w_l = w;
265 	}
266 }
267 
unuse_one_window(struct packed_git * current)268 static int unuse_one_window(struct packed_git *current)
269 {
270 	struct packed_git *p, *lru_p = NULL;
271 	struct pack_window *lru_w = NULL, *lru_l = NULL;
272 
273 	if (current)
274 		scan_windows(current, &lru_p, &lru_w, &lru_l);
275 	for (p = the_repository->objects->packed_git; p; p = p->next)
276 		scan_windows(p, &lru_p, &lru_w, &lru_l);
277 	if (lru_p) {
278 		munmap(lru_w->base, lru_w->len);
279 		pack_mapped -= lru_w->len;
280 		if (lru_l)
281 			lru_l->next = lru_w->next;
282 		else
283 			lru_p->windows = lru_w->next;
284 		free(lru_w);
285 		pack_open_windows--;
286 		return 1;
287 	}
288 	return 0;
289 }
290 
close_pack_windows(struct packed_git * p)291 void close_pack_windows(struct packed_git *p)
292 {
293 	while (p->windows) {
294 		struct pack_window *w = p->windows;
295 
296 		if (w->inuse_cnt)
297 			die("pack '%s' still has open windows to it",
298 			    p->pack_name);
299 		munmap(w->base, w->len);
300 		pack_mapped -= w->len;
301 		pack_open_windows--;
302 		p->windows = w->next;
303 		free(w);
304 	}
305 }
306 
close_pack_fd(struct packed_git * p)307 int close_pack_fd(struct packed_git *p)
308 {
309 	if (p->pack_fd < 0)
310 		return 0;
311 
312 	close(p->pack_fd);
313 	pack_open_fds--;
314 	p->pack_fd = -1;
315 
316 	return 1;
317 }
318 
close_pack_index(struct packed_git * p)319 void close_pack_index(struct packed_git *p)
320 {
321 	if (p->index_data) {
322 		munmap((void *)p->index_data, p->index_size);
323 		p->index_data = NULL;
324 	}
325 }
326 
close_pack_revindex(struct packed_git * p)327 void close_pack_revindex(struct packed_git *p) {
328 	if (!p->revindex_map)
329 		return;
330 
331 	munmap((void *)p->revindex_map, p->revindex_size);
332 	p->revindex_map = NULL;
333 	p->revindex_data = NULL;
334 }
335 
close_pack(struct packed_git * p)336 void close_pack(struct packed_git *p)
337 {
338 	close_pack_windows(p);
339 	close_pack_fd(p);
340 	close_pack_index(p);
341 	close_pack_revindex(p);
342 	oidset_clear(&p->bad_objects);
343 }
344 
close_object_store(struct raw_object_store * o)345 void close_object_store(struct raw_object_store *o)
346 {
347 	struct packed_git *p;
348 
349 	for (p = o->packed_git; p; p = p->next)
350 		if (p->do_not_close)
351 			BUG("want to close pack marked 'do-not-close'");
352 		else
353 			close_pack(p);
354 
355 	if (o->multi_pack_index) {
356 		close_midx(o->multi_pack_index);
357 		o->multi_pack_index = NULL;
358 	}
359 
360 	close_commit_graph(o);
361 }
362 
unlink_pack_path(const char * pack_name,int force_delete)363 void unlink_pack_path(const char *pack_name, int force_delete)
364 {
365 	static const char *exts[] = {".pack", ".idx", ".rev", ".keep", ".bitmap", ".promisor"};
366 	int i;
367 	struct strbuf buf = STRBUF_INIT;
368 	size_t plen;
369 
370 	strbuf_addstr(&buf, pack_name);
371 	strip_suffix_mem(buf.buf, &buf.len, ".pack");
372 	plen = buf.len;
373 
374 	if (!force_delete) {
375 		strbuf_addstr(&buf, ".keep");
376 		if (!access(buf.buf, F_OK)) {
377 			strbuf_release(&buf);
378 			return;
379 		}
380 	}
381 
382 	for (i = 0; i < ARRAY_SIZE(exts); i++) {
383 		strbuf_setlen(&buf, plen);
384 		strbuf_addstr(&buf, exts[i]);
385 		unlink(buf.buf);
386 	}
387 
388 	strbuf_release(&buf);
389 }
390 
391 /*
392  * The LRU pack is the one with the oldest MRU window, preferring packs
393  * with no used windows, or the oldest mtime if it has no windows allocated.
394  */
find_lru_pack(struct packed_git * p,struct packed_git ** lru_p,struct pack_window ** mru_w,int * accept_windows_inuse)395 static void find_lru_pack(struct packed_git *p, struct packed_git **lru_p, struct pack_window **mru_w, int *accept_windows_inuse)
396 {
397 	struct pack_window *w, *this_mru_w;
398 	int has_windows_inuse = 0;
399 
400 	/*
401 	 * Reject this pack if it has windows and the previously selected
402 	 * one does not.  If this pack does not have windows, reject
403 	 * it if the pack file is newer than the previously selected one.
404 	 */
405 	if (*lru_p && !*mru_w && (p->windows || p->mtime > (*lru_p)->mtime))
406 		return;
407 
408 	for (w = this_mru_w = p->windows; w; w = w->next) {
409 		/*
410 		 * Reject this pack if any of its windows are in use,
411 		 * but the previously selected pack did not have any
412 		 * inuse windows.  Otherwise, record that this pack
413 		 * has windows in use.
414 		 */
415 		if (w->inuse_cnt) {
416 			if (*accept_windows_inuse)
417 				has_windows_inuse = 1;
418 			else
419 				return;
420 		}
421 
422 		if (w->last_used > this_mru_w->last_used)
423 			this_mru_w = w;
424 
425 		/*
426 		 * Reject this pack if it has windows that have been
427 		 * used more recently than the previously selected pack.
428 		 * If the previously selected pack had windows inuse and
429 		 * we have not encountered a window in this pack that is
430 		 * inuse, skip this check since we prefer a pack with no
431 		 * inuse windows to one that has inuse windows.
432 		 */
433 		if (*mru_w && *accept_windows_inuse == has_windows_inuse &&
434 		    this_mru_w->last_used > (*mru_w)->last_used)
435 			return;
436 	}
437 
438 	/*
439 	 * Select this pack.
440 	 */
441 	*mru_w = this_mru_w;
442 	*lru_p = p;
443 	*accept_windows_inuse = has_windows_inuse;
444 }
445 
close_one_pack(void)446 static int close_one_pack(void)
447 {
448 	struct packed_git *p, *lru_p = NULL;
449 	struct pack_window *mru_w = NULL;
450 	int accept_windows_inuse = 1;
451 
452 	for (p = the_repository->objects->packed_git; p; p = p->next) {
453 		if (p->pack_fd == -1)
454 			continue;
455 		find_lru_pack(p, &lru_p, &mru_w, &accept_windows_inuse);
456 	}
457 
458 	if (lru_p)
459 		return close_pack_fd(lru_p);
460 
461 	return 0;
462 }
463 
get_max_fd_limit(void)464 static unsigned int get_max_fd_limit(void)
465 {
466 #ifdef RLIMIT_NOFILE
467 	{
468 		struct rlimit lim;
469 
470 		if (!getrlimit(RLIMIT_NOFILE, &lim))
471 			return lim.rlim_cur;
472 	}
473 #endif
474 
475 #ifdef _SC_OPEN_MAX
476 	{
477 		long open_max = sysconf(_SC_OPEN_MAX);
478 		if (0 < open_max)
479 			return open_max;
480 		/*
481 		 * Otherwise, we got -1 for one of the two
482 		 * reasons:
483 		 *
484 		 * (1) sysconf() did not understand _SC_OPEN_MAX
485 		 *     and signaled an error with -1; or
486 		 * (2) sysconf() said there is no limit.
487 		 *
488 		 * We _could_ clear errno before calling sysconf() to
489 		 * tell these two cases apart and return a huge number
490 		 * in the latter case to let the caller cap it to a
491 		 * value that is not so selfish, but letting the
492 		 * fallback OPEN_MAX codepath take care of these cases
493 		 * is a lot simpler.
494 		 */
495 	}
496 #endif
497 
498 #ifdef OPEN_MAX
499 	return OPEN_MAX;
500 #else
501 	return 1; /* see the caller ;-) */
502 #endif
503 }
504 
pack_basename(struct packed_git * p)505 const char *pack_basename(struct packed_git *p)
506 {
507 	const char *ret = strrchr(p->pack_name, '/');
508 	if (ret)
509 		ret = ret + 1; /* skip past slash */
510 	else
511 		ret = p->pack_name; /* we only have a base */
512 	return ret;
513 }
514 
515 /*
516  * Do not call this directly as this leaks p->pack_fd on error return;
517  * call open_packed_git() instead.
518  */
open_packed_git_1(struct packed_git * p)519 static int open_packed_git_1(struct packed_git *p)
520 {
521 	struct stat st;
522 	struct pack_header hdr;
523 	unsigned char hash[GIT_MAX_RAWSZ];
524 	unsigned char *idx_hash;
525 	ssize_t read_result;
526 	const unsigned hashsz = the_hash_algo->rawsz;
527 
528 	if (open_pack_index(p))
529 		return error("packfile %s index unavailable", p->pack_name);
530 
531 	if (!pack_max_fds) {
532 		unsigned int max_fds = get_max_fd_limit();
533 
534 		/* Save 3 for stdin/stdout/stderr, 22 for work */
535 		if (25 < max_fds)
536 			pack_max_fds = max_fds - 25;
537 		else
538 			pack_max_fds = 1;
539 	}
540 
541 	while (pack_max_fds <= pack_open_fds && close_one_pack())
542 		; /* nothing */
543 
544 	p->pack_fd = git_open(p->pack_name);
545 	if (p->pack_fd < 0 || fstat(p->pack_fd, &st))
546 		return -1;
547 	pack_open_fds++;
548 
549 	/* If we created the struct before we had the pack we lack size. */
550 	if (!p->pack_size) {
551 		if (!S_ISREG(st.st_mode))
552 			return error("packfile %s not a regular file", p->pack_name);
553 		p->pack_size = st.st_size;
554 	} else if (p->pack_size != st.st_size)
555 		return error("packfile %s size changed", p->pack_name);
556 
557 	/* Verify we recognize this pack file format. */
558 	read_result = read_in_full(p->pack_fd, &hdr, sizeof(hdr));
559 	if (read_result < 0)
560 		return error_errno("error reading from %s", p->pack_name);
561 	if (read_result != sizeof(hdr))
562 		return error("file %s is far too short to be a packfile", p->pack_name);
563 	if (hdr.hdr_signature != htonl(PACK_SIGNATURE))
564 		return error("file %s is not a GIT packfile", p->pack_name);
565 	if (!pack_version_ok(hdr.hdr_version))
566 		return error("packfile %s is version %"PRIu32" and not"
567 			" supported (try upgrading GIT to a newer version)",
568 			p->pack_name, ntohl(hdr.hdr_version));
569 
570 	/* Verify the pack matches its index. */
571 	if (p->num_objects != ntohl(hdr.hdr_entries))
572 		return error("packfile %s claims to have %"PRIu32" objects"
573 			     " while index indicates %"PRIu32" objects",
574 			     p->pack_name, ntohl(hdr.hdr_entries),
575 			     p->num_objects);
576 	read_result = pread_in_full(p->pack_fd, hash, hashsz,
577 					p->pack_size - hashsz);
578 	if (read_result < 0)
579 		return error_errno("error reading from %s", p->pack_name);
580 	if (read_result != hashsz)
581 		return error("packfile %s signature is unavailable", p->pack_name);
582 	idx_hash = ((unsigned char *)p->index_data) + p->index_size - hashsz * 2;
583 	if (!hasheq(hash, idx_hash))
584 		return error("packfile %s does not match index", p->pack_name);
585 	return 0;
586 }
587 
open_packed_git(struct packed_git * p)588 static int open_packed_git(struct packed_git *p)
589 {
590 	if (!open_packed_git_1(p))
591 		return 0;
592 	close_pack_fd(p);
593 	return -1;
594 }
595 
in_window(struct pack_window * win,off_t offset)596 static int in_window(struct pack_window *win, off_t offset)
597 {
598 	/* We must promise at least one full hash after the
599 	 * offset is available from this window, otherwise the offset
600 	 * is not actually in this window and a different window (which
601 	 * has that one hash excess) must be used.  This is to support
602 	 * the object header and delta base parsing routines below.
603 	 */
604 	off_t win_off = win->offset;
605 	return win_off <= offset
606 		&& (offset + the_hash_algo->rawsz) <= (win_off + win->len);
607 }
608 
use_pack(struct packed_git * p,struct pack_window ** w_cursor,off_t offset,unsigned long * left)609 unsigned char *use_pack(struct packed_git *p,
610 		struct pack_window **w_cursor,
611 		off_t offset,
612 		unsigned long *left)
613 {
614 	struct pack_window *win = *w_cursor;
615 
616 	/* Since packfiles end in a hash of their content and it's
617 	 * pointless to ask for an offset into the middle of that
618 	 * hash, and the in_window function above wouldn't match
619 	 * don't allow an offset too close to the end of the file.
620 	 */
621 	if (!p->pack_size && p->pack_fd == -1 && open_packed_git(p))
622 		die("packfile %s cannot be accessed", p->pack_name);
623 	if (offset > (p->pack_size - the_hash_algo->rawsz))
624 		die("offset beyond end of packfile (truncated pack?)");
625 	if (offset < 0)
626 		die(_("offset before end of packfile (broken .idx?)"));
627 
628 	if (!win || !in_window(win, offset)) {
629 		if (win)
630 			win->inuse_cnt--;
631 		for (win = p->windows; win; win = win->next) {
632 			if (in_window(win, offset))
633 				break;
634 		}
635 		if (!win) {
636 			size_t window_align = packed_git_window_size / 2;
637 			off_t len;
638 
639 			if (p->pack_fd == -1 && open_packed_git(p))
640 				die("packfile %s cannot be accessed", p->pack_name);
641 
642 			CALLOC_ARRAY(win, 1);
643 			win->offset = (offset / window_align) * window_align;
644 			len = p->pack_size - win->offset;
645 			if (len > packed_git_window_size)
646 				len = packed_git_window_size;
647 			win->len = (size_t)len;
648 			pack_mapped += win->len;
649 			while (packed_git_limit < pack_mapped
650 				&& unuse_one_window(p))
651 				; /* nothing */
652 			win->base = xmmap_gently(NULL, win->len,
653 				PROT_READ, MAP_PRIVATE,
654 				p->pack_fd, win->offset);
655 			if (win->base == MAP_FAILED)
656 				die_errno(_("packfile %s cannot be mapped%s"),
657 					  p->pack_name, mmap_os_err());
658 			if (!win->offset && win->len == p->pack_size
659 				&& !p->do_not_close)
660 				close_pack_fd(p);
661 			pack_mmap_calls++;
662 			pack_open_windows++;
663 			if (pack_mapped > peak_pack_mapped)
664 				peak_pack_mapped = pack_mapped;
665 			if (pack_open_windows > peak_pack_open_windows)
666 				peak_pack_open_windows = pack_open_windows;
667 			win->next = p->windows;
668 			p->windows = win;
669 		}
670 	}
671 	if (win != *w_cursor) {
672 		win->last_used = pack_used_ctr++;
673 		win->inuse_cnt++;
674 		*w_cursor = win;
675 	}
676 	offset -= win->offset;
677 	if (left)
678 		*left = win->len - xsize_t(offset);
679 	return win->base + offset;
680 }
681 
unuse_pack(struct pack_window ** w_cursor)682 void unuse_pack(struct pack_window **w_cursor)
683 {
684 	struct pack_window *w = *w_cursor;
685 	if (w) {
686 		w->inuse_cnt--;
687 		*w_cursor = NULL;
688 	}
689 }
690 
add_packed_git(const char * path,size_t path_len,int local)691 struct packed_git *add_packed_git(const char *path, size_t path_len, int local)
692 {
693 	struct stat st;
694 	size_t alloc;
695 	struct packed_git *p;
696 
697 	/*
698 	 * Make sure a corresponding .pack file exists and that
699 	 * the index looks sane.
700 	 */
701 	if (!strip_suffix_mem(path, &path_len, ".idx"))
702 		return NULL;
703 
704 	/*
705 	 * ".promisor" is long enough to hold any suffix we're adding (and
706 	 * the use xsnprintf double-checks that)
707 	 */
708 	alloc = st_add3(path_len, strlen(".promisor"), 1);
709 	p = alloc_packed_git(alloc);
710 	memcpy(p->pack_name, path, path_len);
711 
712 	xsnprintf(p->pack_name + path_len, alloc - path_len, ".keep");
713 	if (!access(p->pack_name, F_OK))
714 		p->pack_keep = 1;
715 
716 	xsnprintf(p->pack_name + path_len, alloc - path_len, ".promisor");
717 	if (!access(p->pack_name, F_OK))
718 		p->pack_promisor = 1;
719 
720 	xsnprintf(p->pack_name + path_len, alloc - path_len, ".pack");
721 	if (stat(p->pack_name, &st) || !S_ISREG(st.st_mode)) {
722 		free(p);
723 		return NULL;
724 	}
725 
726 	/* ok, it looks sane as far as we can check without
727 	 * actually mapping the pack file.
728 	 */
729 	p->pack_size = st.st_size;
730 	p->pack_local = local;
731 	p->mtime = st.st_mtime;
732 	if (path_len < the_hash_algo->hexsz ||
733 	    get_sha1_hex(path + path_len - the_hash_algo->hexsz, p->hash))
734 		hashclr(p->hash);
735 	return p;
736 }
737 
install_packed_git(struct repository * r,struct packed_git * pack)738 void install_packed_git(struct repository *r, struct packed_git *pack)
739 {
740 	if (pack->pack_fd != -1)
741 		pack_open_fds++;
742 
743 	pack->next = r->objects->packed_git;
744 	r->objects->packed_git = pack;
745 
746 	hashmap_entry_init(&pack->packmap_ent, strhash(pack->pack_name));
747 	hashmap_add(&r->objects->pack_map, &pack->packmap_ent);
748 }
749 
750 void (*report_garbage)(unsigned seen_bits, const char *path);
751 
report_helper(const struct string_list * list,int seen_bits,int first,int last)752 static void report_helper(const struct string_list *list,
753 			  int seen_bits, int first, int last)
754 {
755 	if (seen_bits == (PACKDIR_FILE_PACK|PACKDIR_FILE_IDX))
756 		return;
757 
758 	for (; first < last; first++)
759 		report_garbage(seen_bits, list->items[first].string);
760 }
761 
report_pack_garbage(struct string_list * list)762 static void report_pack_garbage(struct string_list *list)
763 {
764 	int i, baselen = -1, first = 0, seen_bits = 0;
765 
766 	if (!report_garbage)
767 		return;
768 
769 	string_list_sort(list);
770 
771 	for (i = 0; i < list->nr; i++) {
772 		const char *path = list->items[i].string;
773 		if (baselen != -1 &&
774 		    strncmp(path, list->items[first].string, baselen)) {
775 			report_helper(list, seen_bits, first, i);
776 			baselen = -1;
777 			seen_bits = 0;
778 		}
779 		if (baselen == -1) {
780 			const char *dot = strrchr(path, '.');
781 			if (!dot) {
782 				report_garbage(PACKDIR_FILE_GARBAGE, path);
783 				continue;
784 			}
785 			baselen = dot - path + 1;
786 			first = i;
787 		}
788 		if (!strcmp(path + baselen, "pack"))
789 			seen_bits |= 1;
790 		else if (!strcmp(path + baselen, "idx"))
791 			seen_bits |= 2;
792 	}
793 	report_helper(list, seen_bits, first, list->nr);
794 }
795 
for_each_file_in_pack_dir(const char * objdir,each_file_in_pack_dir_fn fn,void * data)796 void for_each_file_in_pack_dir(const char *objdir,
797 			       each_file_in_pack_dir_fn fn,
798 			       void *data)
799 {
800 	struct strbuf path = STRBUF_INIT;
801 	size_t dirnamelen;
802 	DIR *dir;
803 	struct dirent *de;
804 
805 	strbuf_addstr(&path, objdir);
806 	strbuf_addstr(&path, "/pack");
807 	dir = opendir(path.buf);
808 	if (!dir) {
809 		if (errno != ENOENT)
810 			error_errno("unable to open object pack directory: %s",
811 				    path.buf);
812 		strbuf_release(&path);
813 		return;
814 	}
815 	strbuf_addch(&path, '/');
816 	dirnamelen = path.len;
817 	while ((de = readdir_skip_dot_and_dotdot(dir)) != NULL) {
818 		strbuf_setlen(&path, dirnamelen);
819 		strbuf_addstr(&path, de->d_name);
820 
821 		fn(path.buf, path.len, de->d_name, data);
822 	}
823 
824 	closedir(dir);
825 	strbuf_release(&path);
826 }
827 
828 struct prepare_pack_data {
829 	struct repository *r;
830 	struct string_list *garbage;
831 	int local;
832 	struct multi_pack_index *m;
833 };
834 
prepare_pack(const char * full_name,size_t full_name_len,const char * file_name,void * _data)835 static void prepare_pack(const char *full_name, size_t full_name_len,
836 			 const char *file_name, void *_data)
837 {
838 	struct prepare_pack_data *data = (struct prepare_pack_data *)_data;
839 	struct packed_git *p;
840 	size_t base_len = full_name_len;
841 
842 	if (strip_suffix_mem(full_name, &base_len, ".idx") &&
843 	    !(data->m && midx_contains_pack(data->m, file_name))) {
844 		struct hashmap_entry hent;
845 		char *pack_name = xstrfmt("%.*s.pack", (int)base_len, full_name);
846 		unsigned int hash = strhash(pack_name);
847 		hashmap_entry_init(&hent, hash);
848 
849 		/* Don't reopen a pack we already have. */
850 		if (!hashmap_get(&data->r->objects->pack_map, &hent, pack_name)) {
851 			p = add_packed_git(full_name, full_name_len, data->local);
852 			if (p)
853 				install_packed_git(data->r, p);
854 		}
855 		free(pack_name);
856 	}
857 
858 	if (!report_garbage)
859 		return;
860 
861 	if (!strcmp(file_name, "multi-pack-index"))
862 		return;
863 	if (starts_with(file_name, "multi-pack-index") &&
864 	    (ends_with(file_name, ".bitmap") || ends_with(file_name, ".rev")))
865 		return;
866 	if (ends_with(file_name, ".idx") ||
867 	    ends_with(file_name, ".rev") ||
868 	    ends_with(file_name, ".pack") ||
869 	    ends_with(file_name, ".bitmap") ||
870 	    ends_with(file_name, ".keep") ||
871 	    ends_with(file_name, ".promisor"))
872 		string_list_append(data->garbage, full_name);
873 	else
874 		report_garbage(PACKDIR_FILE_GARBAGE, full_name);
875 }
876 
prepare_packed_git_one(struct repository * r,char * objdir,int local)877 static void prepare_packed_git_one(struct repository *r, char *objdir, int local)
878 {
879 	struct prepare_pack_data data;
880 	struct string_list garbage = STRING_LIST_INIT_DUP;
881 
882 	data.m = r->objects->multi_pack_index;
883 
884 	/* look for the multi-pack-index for this object directory */
885 	while (data.m && strcmp(data.m->object_dir, objdir))
886 		data.m = data.m->next;
887 
888 	data.r = r;
889 	data.garbage = &garbage;
890 	data.local = local;
891 
892 	for_each_file_in_pack_dir(objdir, prepare_pack, &data);
893 
894 	report_pack_garbage(data.garbage);
895 	string_list_clear(data.garbage, 0);
896 }
897 
898 static void prepare_packed_git(struct repository *r);
899 /*
900  * Give a fast, rough count of the number of objects in the repository. This
901  * ignores loose objects completely. If you have a lot of them, then either
902  * you should repack because your performance will be awful, or they are
903  * all unreachable objects about to be pruned, in which case they're not really
904  * interesting as a measure of repo size in the first place.
905  */
repo_approximate_object_count(struct repository * r)906 unsigned long repo_approximate_object_count(struct repository *r)
907 {
908 	if (!r->objects->approximate_object_count_valid) {
909 		unsigned long count;
910 		struct multi_pack_index *m;
911 		struct packed_git *p;
912 
913 		prepare_packed_git(r);
914 		count = 0;
915 		for (m = get_multi_pack_index(r); m; m = m->next)
916 			count += m->num_objects;
917 		for (p = r->objects->packed_git; p; p = p->next) {
918 			if (open_pack_index(p))
919 				continue;
920 			count += p->num_objects;
921 		}
922 		r->objects->approximate_object_count = count;
923 		r->objects->approximate_object_count_valid = 1;
924 	}
925 	return r->objects->approximate_object_count;
926 }
927 
get_next_packed_git(const void * p)928 static void *get_next_packed_git(const void *p)
929 {
930 	return ((const struct packed_git *)p)->next;
931 }
932 
set_next_packed_git(void * p,void * next)933 static void set_next_packed_git(void *p, void *next)
934 {
935 	((struct packed_git *)p)->next = next;
936 }
937 
sort_pack(const void * a_,const void * b_)938 static int sort_pack(const void *a_, const void *b_)
939 {
940 	const struct packed_git *a = a_;
941 	const struct packed_git *b = b_;
942 	int st;
943 
944 	/*
945 	 * Local packs tend to contain objects specific to our
946 	 * variant of the project than remote ones.  In addition,
947 	 * remote ones could be on a network mounted filesystem.
948 	 * Favor local ones for these reasons.
949 	 */
950 	st = a->pack_local - b->pack_local;
951 	if (st)
952 		return -st;
953 
954 	/*
955 	 * Younger packs tend to contain more recent objects,
956 	 * and more recent objects tend to get accessed more
957 	 * often.
958 	 */
959 	if (a->mtime < b->mtime)
960 		return 1;
961 	else if (a->mtime == b->mtime)
962 		return 0;
963 	return -1;
964 }
965 
rearrange_packed_git(struct repository * r)966 static void rearrange_packed_git(struct repository *r)
967 {
968 	r->objects->packed_git = llist_mergesort(
969 		r->objects->packed_git, get_next_packed_git,
970 		set_next_packed_git, sort_pack);
971 }
972 
prepare_packed_git_mru(struct repository * r)973 static void prepare_packed_git_mru(struct repository *r)
974 {
975 	struct packed_git *p;
976 
977 	INIT_LIST_HEAD(&r->objects->packed_git_mru);
978 
979 	for (p = r->objects->packed_git; p; p = p->next)
980 		list_add_tail(&p->mru, &r->objects->packed_git_mru);
981 }
982 
prepare_packed_git(struct repository * r)983 static void prepare_packed_git(struct repository *r)
984 {
985 	struct object_directory *odb;
986 
987 	if (r->objects->packed_git_initialized)
988 		return;
989 
990 	prepare_alt_odb(r);
991 	for (odb = r->objects->odb; odb; odb = odb->next) {
992 		int local = (odb == r->objects->odb);
993 		prepare_multi_pack_index_one(r, odb->path, local);
994 		prepare_packed_git_one(r, odb->path, local);
995 	}
996 	rearrange_packed_git(r);
997 
998 	prepare_packed_git_mru(r);
999 	r->objects->packed_git_initialized = 1;
1000 }
1001 
reprepare_packed_git(struct repository * r)1002 void reprepare_packed_git(struct repository *r)
1003 {
1004 	struct object_directory *odb;
1005 
1006 	obj_read_lock();
1007 	for (odb = r->objects->odb; odb; odb = odb->next)
1008 		odb_clear_loose_cache(odb);
1009 
1010 	r->objects->approximate_object_count_valid = 0;
1011 	r->objects->packed_git_initialized = 0;
1012 	prepare_packed_git(r);
1013 	obj_read_unlock();
1014 }
1015 
get_packed_git(struct repository * r)1016 struct packed_git *get_packed_git(struct repository *r)
1017 {
1018 	prepare_packed_git(r);
1019 	return r->objects->packed_git;
1020 }
1021 
get_multi_pack_index(struct repository * r)1022 struct multi_pack_index *get_multi_pack_index(struct repository *r)
1023 {
1024 	prepare_packed_git(r);
1025 	return r->objects->multi_pack_index;
1026 }
1027 
get_local_multi_pack_index(struct repository * r)1028 struct multi_pack_index *get_local_multi_pack_index(struct repository *r)
1029 {
1030 	struct multi_pack_index *m = get_multi_pack_index(r);
1031 
1032 	/* no need to iterate; we always put the local one first (if any) */
1033 	if (m && m->local)
1034 		return m;
1035 
1036 	return NULL;
1037 }
1038 
get_all_packs(struct repository * r)1039 struct packed_git *get_all_packs(struct repository *r)
1040 {
1041 	struct multi_pack_index *m;
1042 
1043 	prepare_packed_git(r);
1044 	for (m = r->objects->multi_pack_index; m; m = m->next) {
1045 		uint32_t i;
1046 		for (i = 0; i < m->num_packs; i++)
1047 			prepare_midx_pack(r, m, i);
1048 	}
1049 
1050 	return r->objects->packed_git;
1051 }
1052 
get_packed_git_mru(struct repository * r)1053 struct list_head *get_packed_git_mru(struct repository *r)
1054 {
1055 	prepare_packed_git(r);
1056 	return &r->objects->packed_git_mru;
1057 }
1058 
unpack_object_header_buffer(const unsigned char * buf,unsigned long len,enum object_type * type,unsigned long * sizep)1059 unsigned long unpack_object_header_buffer(const unsigned char *buf,
1060 		unsigned long len, enum object_type *type, unsigned long *sizep)
1061 {
1062 	unsigned shift;
1063 	unsigned long size, c;
1064 	unsigned long used = 0;
1065 
1066 	c = buf[used++];
1067 	*type = (c >> 4) & 7;
1068 	size = c & 15;
1069 	shift = 4;
1070 	while (c & 0x80) {
1071 		if (len <= used || bitsizeof(long) <= shift) {
1072 			error("bad object header");
1073 			size = used = 0;
1074 			break;
1075 		}
1076 		c = buf[used++];
1077 		size += (c & 0x7f) << shift;
1078 		shift += 7;
1079 	}
1080 	*sizep = size;
1081 	return used;
1082 }
1083 
get_size_from_delta(struct packed_git * p,struct pack_window ** w_curs,off_t curpos)1084 unsigned long get_size_from_delta(struct packed_git *p,
1085 				  struct pack_window **w_curs,
1086 				  off_t curpos)
1087 {
1088 	const unsigned char *data;
1089 	unsigned char delta_head[20], *in;
1090 	git_zstream stream;
1091 	int st;
1092 
1093 	memset(&stream, 0, sizeof(stream));
1094 	stream.next_out = delta_head;
1095 	stream.avail_out = sizeof(delta_head);
1096 
1097 	git_inflate_init(&stream);
1098 	do {
1099 		in = use_pack(p, w_curs, curpos, &stream.avail_in);
1100 		stream.next_in = in;
1101 		/*
1102 		 * Note: the window section returned by use_pack() must be
1103 		 * available throughout git_inflate()'s unlocked execution. To
1104 		 * ensure no other thread will modify the window in the
1105 		 * meantime, we rely on the packed_window.inuse_cnt. This
1106 		 * counter is incremented before window reading and checked
1107 		 * before window disposal.
1108 		 *
1109 		 * Other worrying sections could be the call to close_pack_fd(),
1110 		 * which can close packs even with in-use windows, and to
1111 		 * reprepare_packed_git(). Regarding the former, mmap doc says:
1112 		 * "closing the file descriptor does not unmap the region". And
1113 		 * for the latter, it won't re-open already available packs.
1114 		 */
1115 		obj_read_unlock();
1116 		st = git_inflate(&stream, Z_FINISH);
1117 		obj_read_lock();
1118 		curpos += stream.next_in - in;
1119 	} while ((st == Z_OK || st == Z_BUF_ERROR) &&
1120 		 stream.total_out < sizeof(delta_head));
1121 	git_inflate_end(&stream);
1122 	if ((st != Z_STREAM_END) && stream.total_out != sizeof(delta_head)) {
1123 		error("delta data unpack-initial failed");
1124 		return 0;
1125 	}
1126 
1127 	/* Examine the initial part of the delta to figure out
1128 	 * the result size.
1129 	 */
1130 	data = delta_head;
1131 
1132 	/* ignore base size */
1133 	get_delta_hdr_size(&data, delta_head+sizeof(delta_head));
1134 
1135 	/* Read the result size */
1136 	return get_delta_hdr_size(&data, delta_head+sizeof(delta_head));
1137 }
1138 
unpack_object_header(struct packed_git * p,struct pack_window ** w_curs,off_t * curpos,unsigned long * sizep)1139 int unpack_object_header(struct packed_git *p,
1140 			 struct pack_window **w_curs,
1141 			 off_t *curpos,
1142 			 unsigned long *sizep)
1143 {
1144 	unsigned char *base;
1145 	unsigned long left;
1146 	unsigned long used;
1147 	enum object_type type;
1148 
1149 	/* use_pack() assures us we have [base, base + 20) available
1150 	 * as a range that we can look at.  (Its actually the hash
1151 	 * size that is assured.)  With our object header encoding
1152 	 * the maximum deflated object size is 2^137, which is just
1153 	 * insane, so we know won't exceed what we have been given.
1154 	 */
1155 	base = use_pack(p, w_curs, *curpos, &left);
1156 	used = unpack_object_header_buffer(base, left, &type, sizep);
1157 	if (!used) {
1158 		type = OBJ_BAD;
1159 	} else
1160 		*curpos += used;
1161 
1162 	return type;
1163 }
1164 
mark_bad_packed_object(struct packed_git * p,const struct object_id * oid)1165 void mark_bad_packed_object(struct packed_git *p, const struct object_id *oid)
1166 {
1167 	oidset_insert(&p->bad_objects, oid);
1168 }
1169 
has_packed_and_bad(struct repository * r,const struct object_id * oid)1170 const struct packed_git *has_packed_and_bad(struct repository *r,
1171 					    const struct object_id *oid)
1172 {
1173 	struct packed_git *p;
1174 
1175 	for (p = r->objects->packed_git; p; p = p->next)
1176 		if (oidset_contains(&p->bad_objects, oid))
1177 			return p;
1178 	return NULL;
1179 }
1180 
get_delta_base(struct packed_git * p,struct pack_window ** w_curs,off_t * curpos,enum object_type type,off_t delta_obj_offset)1181 off_t get_delta_base(struct packed_git *p,
1182 		     struct pack_window **w_curs,
1183 		     off_t *curpos,
1184 		     enum object_type type,
1185 		     off_t delta_obj_offset)
1186 {
1187 	unsigned char *base_info = use_pack(p, w_curs, *curpos, NULL);
1188 	off_t base_offset;
1189 
1190 	/* use_pack() assured us we have [base_info, base_info + 20)
1191 	 * as a range that we can look at without walking off the
1192 	 * end of the mapped window.  Its actually the hash size
1193 	 * that is assured.  An OFS_DELTA longer than the hash size
1194 	 * is stupid, as then a REF_DELTA would be smaller to store.
1195 	 */
1196 	if (type == OBJ_OFS_DELTA) {
1197 		unsigned used = 0;
1198 		unsigned char c = base_info[used++];
1199 		base_offset = c & 127;
1200 		while (c & 128) {
1201 			base_offset += 1;
1202 			if (!base_offset || MSB(base_offset, 7))
1203 				return 0;  /* overflow */
1204 			c = base_info[used++];
1205 			base_offset = (base_offset << 7) + (c & 127);
1206 		}
1207 		base_offset = delta_obj_offset - base_offset;
1208 		if (base_offset <= 0 || base_offset >= delta_obj_offset)
1209 			return 0;  /* out of bound */
1210 		*curpos += used;
1211 	} else if (type == OBJ_REF_DELTA) {
1212 		/* The base entry _must_ be in the same pack */
1213 		base_offset = find_pack_entry_one(base_info, p);
1214 		*curpos += the_hash_algo->rawsz;
1215 	} else
1216 		die("I am totally screwed");
1217 	return base_offset;
1218 }
1219 
1220 /*
1221  * Like get_delta_base above, but we return the sha1 instead of the pack
1222  * offset. This means it is cheaper for REF deltas (we do not have to do
1223  * the final object lookup), but more expensive for OFS deltas (we
1224  * have to load the revidx to convert the offset back into a sha1).
1225  */
get_delta_base_oid(struct packed_git * p,struct pack_window ** w_curs,off_t curpos,struct object_id * oid,enum object_type type,off_t delta_obj_offset)1226 static int get_delta_base_oid(struct packed_git *p,
1227 			      struct pack_window **w_curs,
1228 			      off_t curpos,
1229 			      struct object_id *oid,
1230 			      enum object_type type,
1231 			      off_t delta_obj_offset)
1232 {
1233 	if (type == OBJ_REF_DELTA) {
1234 		unsigned char *base = use_pack(p, w_curs, curpos, NULL);
1235 		oidread(oid, base);
1236 		return 0;
1237 	} else if (type == OBJ_OFS_DELTA) {
1238 		uint32_t base_pos;
1239 		off_t base_offset = get_delta_base(p, w_curs, &curpos,
1240 						   type, delta_obj_offset);
1241 
1242 		if (!base_offset)
1243 			return -1;
1244 
1245 		if (offset_to_pack_pos(p, base_offset, &base_pos) < 0)
1246 			return -1;
1247 
1248 		return nth_packed_object_id(oid, p,
1249 					    pack_pos_to_index(p, base_pos));
1250 	} else
1251 		return -1;
1252 }
1253 
retry_bad_packed_offset(struct repository * r,struct packed_git * p,off_t obj_offset)1254 static int retry_bad_packed_offset(struct repository *r,
1255 				   struct packed_git *p,
1256 				   off_t obj_offset)
1257 {
1258 	int type;
1259 	uint32_t pos;
1260 	struct object_id oid;
1261 	if (offset_to_pack_pos(p, obj_offset, &pos) < 0)
1262 		return OBJ_BAD;
1263 	nth_packed_object_id(&oid, p, pack_pos_to_index(p, pos));
1264 	mark_bad_packed_object(p, &oid);
1265 	type = oid_object_info(r, &oid, NULL);
1266 	if (type <= OBJ_NONE)
1267 		return OBJ_BAD;
1268 	return type;
1269 }
1270 
1271 #define POI_STACK_PREALLOC 64
1272 
packed_to_object_type(struct repository * r,struct packed_git * p,off_t obj_offset,enum object_type type,struct pack_window ** w_curs,off_t curpos)1273 static enum object_type packed_to_object_type(struct repository *r,
1274 					      struct packed_git *p,
1275 					      off_t obj_offset,
1276 					      enum object_type type,
1277 					      struct pack_window **w_curs,
1278 					      off_t curpos)
1279 {
1280 	off_t small_poi_stack[POI_STACK_PREALLOC];
1281 	off_t *poi_stack = small_poi_stack;
1282 	int poi_stack_nr = 0, poi_stack_alloc = POI_STACK_PREALLOC;
1283 
1284 	while (type == OBJ_OFS_DELTA || type == OBJ_REF_DELTA) {
1285 		off_t base_offset;
1286 		unsigned long size;
1287 		/* Push the object we're going to leave behind */
1288 		if (poi_stack_nr >= poi_stack_alloc && poi_stack == small_poi_stack) {
1289 			poi_stack_alloc = alloc_nr(poi_stack_nr);
1290 			ALLOC_ARRAY(poi_stack, poi_stack_alloc);
1291 			COPY_ARRAY(poi_stack, small_poi_stack, poi_stack_nr);
1292 		} else {
1293 			ALLOC_GROW(poi_stack, poi_stack_nr+1, poi_stack_alloc);
1294 		}
1295 		poi_stack[poi_stack_nr++] = obj_offset;
1296 		/* If parsing the base offset fails, just unwind */
1297 		base_offset = get_delta_base(p, w_curs, &curpos, type, obj_offset);
1298 		if (!base_offset)
1299 			goto unwind;
1300 		curpos = obj_offset = base_offset;
1301 		type = unpack_object_header(p, w_curs, &curpos, &size);
1302 		if (type <= OBJ_NONE) {
1303 			/* If getting the base itself fails, we first
1304 			 * retry the base, otherwise unwind */
1305 			type = retry_bad_packed_offset(r, p, base_offset);
1306 			if (type > OBJ_NONE)
1307 				goto out;
1308 			goto unwind;
1309 		}
1310 	}
1311 
1312 	switch (type) {
1313 	case OBJ_BAD:
1314 	case OBJ_COMMIT:
1315 	case OBJ_TREE:
1316 	case OBJ_BLOB:
1317 	case OBJ_TAG:
1318 		break;
1319 	default:
1320 		error("unknown object type %i at offset %"PRIuMAX" in %s",
1321 		      type, (uintmax_t)obj_offset, p->pack_name);
1322 		type = OBJ_BAD;
1323 	}
1324 
1325 out:
1326 	if (poi_stack != small_poi_stack)
1327 		free(poi_stack);
1328 	return type;
1329 
1330 unwind:
1331 	while (poi_stack_nr) {
1332 		obj_offset = poi_stack[--poi_stack_nr];
1333 		type = retry_bad_packed_offset(r, p, obj_offset);
1334 		if (type > OBJ_NONE)
1335 			goto out;
1336 	}
1337 	type = OBJ_BAD;
1338 	goto out;
1339 }
1340 
1341 static struct hashmap delta_base_cache;
1342 static size_t delta_base_cached;
1343 
1344 static LIST_HEAD(delta_base_cache_lru);
1345 
1346 struct delta_base_cache_key {
1347 	struct packed_git *p;
1348 	off_t base_offset;
1349 };
1350 
1351 struct delta_base_cache_entry {
1352 	struct hashmap_entry ent;
1353 	struct delta_base_cache_key key;
1354 	struct list_head lru;
1355 	void *data;
1356 	unsigned long size;
1357 	enum object_type type;
1358 };
1359 
pack_entry_hash(struct packed_git * p,off_t base_offset)1360 static unsigned int pack_entry_hash(struct packed_git *p, off_t base_offset)
1361 {
1362 	unsigned int hash;
1363 
1364 	hash = (unsigned int)(intptr_t)p + (unsigned int)base_offset;
1365 	hash += (hash >> 8) + (hash >> 16);
1366 	return hash;
1367 }
1368 
1369 static struct delta_base_cache_entry *
get_delta_base_cache_entry(struct packed_git * p,off_t base_offset)1370 get_delta_base_cache_entry(struct packed_git *p, off_t base_offset)
1371 {
1372 	struct hashmap_entry entry, *e;
1373 	struct delta_base_cache_key key;
1374 
1375 	if (!delta_base_cache.cmpfn)
1376 		return NULL;
1377 
1378 	hashmap_entry_init(&entry, pack_entry_hash(p, base_offset));
1379 	key.p = p;
1380 	key.base_offset = base_offset;
1381 	e = hashmap_get(&delta_base_cache, &entry, &key);
1382 	return e ? container_of(e, struct delta_base_cache_entry, ent) : NULL;
1383 }
1384 
delta_base_cache_key_eq(const struct delta_base_cache_key * a,const struct delta_base_cache_key * b)1385 static int delta_base_cache_key_eq(const struct delta_base_cache_key *a,
1386 				   const struct delta_base_cache_key *b)
1387 {
1388 	return a->p == b->p && a->base_offset == b->base_offset;
1389 }
1390 
delta_base_cache_hash_cmp(const void * unused_cmp_data,const struct hashmap_entry * va,const struct hashmap_entry * vb,const void * vkey)1391 static int delta_base_cache_hash_cmp(const void *unused_cmp_data,
1392 				     const struct hashmap_entry *va,
1393 				     const struct hashmap_entry *vb,
1394 				     const void *vkey)
1395 {
1396 	const struct delta_base_cache_entry *a, *b;
1397 	const struct delta_base_cache_key *key = vkey;
1398 
1399 	a = container_of(va, const struct delta_base_cache_entry, ent);
1400 	b = container_of(vb, const struct delta_base_cache_entry, ent);
1401 
1402 	if (key)
1403 		return !delta_base_cache_key_eq(&a->key, key);
1404 	else
1405 		return !delta_base_cache_key_eq(&a->key, &b->key);
1406 }
1407 
in_delta_base_cache(struct packed_git * p,off_t base_offset)1408 static int in_delta_base_cache(struct packed_git *p, off_t base_offset)
1409 {
1410 	return !!get_delta_base_cache_entry(p, base_offset);
1411 }
1412 
1413 /*
1414  * Remove the entry from the cache, but do _not_ free the associated
1415  * entry data. The caller takes ownership of the "data" buffer, and
1416  * should copy out any fields it wants before detaching.
1417  */
detach_delta_base_cache_entry(struct delta_base_cache_entry * ent)1418 static void detach_delta_base_cache_entry(struct delta_base_cache_entry *ent)
1419 {
1420 	hashmap_remove(&delta_base_cache, &ent->ent, &ent->key);
1421 	list_del(&ent->lru);
1422 	delta_base_cached -= ent->size;
1423 	free(ent);
1424 }
1425 
cache_or_unpack_entry(struct repository * r,struct packed_git * p,off_t base_offset,unsigned long * base_size,enum object_type * type)1426 static void *cache_or_unpack_entry(struct repository *r, struct packed_git *p,
1427 				   off_t base_offset, unsigned long *base_size,
1428 				   enum object_type *type)
1429 {
1430 	struct delta_base_cache_entry *ent;
1431 
1432 	ent = get_delta_base_cache_entry(p, base_offset);
1433 	if (!ent)
1434 		return unpack_entry(r, p, base_offset, type, base_size);
1435 
1436 	if (type)
1437 		*type = ent->type;
1438 	if (base_size)
1439 		*base_size = ent->size;
1440 	return xmemdupz(ent->data, ent->size);
1441 }
1442 
release_delta_base_cache(struct delta_base_cache_entry * ent)1443 static inline void release_delta_base_cache(struct delta_base_cache_entry *ent)
1444 {
1445 	free(ent->data);
1446 	detach_delta_base_cache_entry(ent);
1447 }
1448 
clear_delta_base_cache(void)1449 void clear_delta_base_cache(void)
1450 {
1451 	struct list_head *lru, *tmp;
1452 	list_for_each_safe(lru, tmp, &delta_base_cache_lru) {
1453 		struct delta_base_cache_entry *entry =
1454 			list_entry(lru, struct delta_base_cache_entry, lru);
1455 		release_delta_base_cache(entry);
1456 	}
1457 }
1458 
add_delta_base_cache(struct packed_git * p,off_t base_offset,void * base,unsigned long base_size,enum object_type type)1459 static void add_delta_base_cache(struct packed_git *p, off_t base_offset,
1460 	void *base, unsigned long base_size, enum object_type type)
1461 {
1462 	struct delta_base_cache_entry *ent;
1463 	struct list_head *lru, *tmp;
1464 
1465 	/*
1466 	 * Check required to avoid redundant entries when more than one thread
1467 	 * is unpacking the same object, in unpack_entry() (since its phases I
1468 	 * and III might run concurrently across multiple threads).
1469 	 */
1470 	if (in_delta_base_cache(p, base_offset)) {
1471 		free(base);
1472 		return;
1473 	}
1474 
1475 	delta_base_cached += base_size;
1476 
1477 	list_for_each_safe(lru, tmp, &delta_base_cache_lru) {
1478 		struct delta_base_cache_entry *f =
1479 			list_entry(lru, struct delta_base_cache_entry, lru);
1480 		if (delta_base_cached <= delta_base_cache_limit)
1481 			break;
1482 		release_delta_base_cache(f);
1483 	}
1484 
1485 	ent = xmalloc(sizeof(*ent));
1486 	ent->key.p = p;
1487 	ent->key.base_offset = base_offset;
1488 	ent->type = type;
1489 	ent->data = base;
1490 	ent->size = base_size;
1491 	list_add_tail(&ent->lru, &delta_base_cache_lru);
1492 
1493 	if (!delta_base_cache.cmpfn)
1494 		hashmap_init(&delta_base_cache, delta_base_cache_hash_cmp, NULL, 0);
1495 	hashmap_entry_init(&ent->ent, pack_entry_hash(p, base_offset));
1496 	hashmap_add(&delta_base_cache, &ent->ent);
1497 }
1498 
packed_object_info(struct repository * r,struct packed_git * p,off_t obj_offset,struct object_info * oi)1499 int packed_object_info(struct repository *r, struct packed_git *p,
1500 		       off_t obj_offset, struct object_info *oi)
1501 {
1502 	struct pack_window *w_curs = NULL;
1503 	unsigned long size;
1504 	off_t curpos = obj_offset;
1505 	enum object_type type;
1506 
1507 	/*
1508 	 * We always get the representation type, but only convert it to
1509 	 * a "real" type later if the caller is interested.
1510 	 */
1511 	if (oi->contentp) {
1512 		*oi->contentp = cache_or_unpack_entry(r, p, obj_offset, oi->sizep,
1513 						      &type);
1514 		if (!*oi->contentp)
1515 			type = OBJ_BAD;
1516 	} else {
1517 		type = unpack_object_header(p, &w_curs, &curpos, &size);
1518 	}
1519 
1520 	if (!oi->contentp && oi->sizep) {
1521 		if (type == OBJ_OFS_DELTA || type == OBJ_REF_DELTA) {
1522 			off_t tmp_pos = curpos;
1523 			off_t base_offset = get_delta_base(p, &w_curs, &tmp_pos,
1524 							   type, obj_offset);
1525 			if (!base_offset) {
1526 				type = OBJ_BAD;
1527 				goto out;
1528 			}
1529 			*oi->sizep = get_size_from_delta(p, &w_curs, tmp_pos);
1530 			if (*oi->sizep == 0) {
1531 				type = OBJ_BAD;
1532 				goto out;
1533 			}
1534 		} else {
1535 			*oi->sizep = size;
1536 		}
1537 	}
1538 
1539 	if (oi->disk_sizep) {
1540 		uint32_t pos;
1541 		if (offset_to_pack_pos(p, obj_offset, &pos) < 0) {
1542 			error("could not find object at offset %"PRIuMAX" "
1543 			      "in pack %s", (uintmax_t)obj_offset, p->pack_name);
1544 			type = OBJ_BAD;
1545 			goto out;
1546 		}
1547 
1548 		*oi->disk_sizep = pack_pos_to_offset(p, pos + 1) - obj_offset;
1549 	}
1550 
1551 	if (oi->typep || oi->type_name) {
1552 		enum object_type ptot;
1553 		ptot = packed_to_object_type(r, p, obj_offset,
1554 					     type, &w_curs, curpos);
1555 		if (oi->typep)
1556 			*oi->typep = ptot;
1557 		if (oi->type_name) {
1558 			const char *tn = type_name(ptot);
1559 			if (tn)
1560 				strbuf_addstr(oi->type_name, tn);
1561 		}
1562 		if (ptot < 0) {
1563 			type = OBJ_BAD;
1564 			goto out;
1565 		}
1566 	}
1567 
1568 	if (oi->delta_base_oid) {
1569 		if (type == OBJ_OFS_DELTA || type == OBJ_REF_DELTA) {
1570 			if (get_delta_base_oid(p, &w_curs, curpos,
1571 					       oi->delta_base_oid,
1572 					       type, obj_offset) < 0) {
1573 				type = OBJ_BAD;
1574 				goto out;
1575 			}
1576 		} else
1577 			oidclr(oi->delta_base_oid);
1578 	}
1579 
1580 	oi->whence = in_delta_base_cache(p, obj_offset) ? OI_DBCACHED :
1581 							  OI_PACKED;
1582 
1583 out:
1584 	unuse_pack(&w_curs);
1585 	return type;
1586 }
1587 
unpack_compressed_entry(struct packed_git * p,struct pack_window ** w_curs,off_t curpos,unsigned long size)1588 static void *unpack_compressed_entry(struct packed_git *p,
1589 				    struct pack_window **w_curs,
1590 				    off_t curpos,
1591 				    unsigned long size)
1592 {
1593 	int st;
1594 	git_zstream stream;
1595 	unsigned char *buffer, *in;
1596 
1597 	buffer = xmallocz_gently(size);
1598 	if (!buffer)
1599 		return NULL;
1600 	memset(&stream, 0, sizeof(stream));
1601 	stream.next_out = buffer;
1602 	stream.avail_out = size + 1;
1603 
1604 	git_inflate_init(&stream);
1605 	do {
1606 		in = use_pack(p, w_curs, curpos, &stream.avail_in);
1607 		stream.next_in = in;
1608 		/*
1609 		 * Note: we must ensure the window section returned by
1610 		 * use_pack() will be available throughout git_inflate()'s
1611 		 * unlocked execution. Please refer to the comment at
1612 		 * get_size_from_delta() to see how this is done.
1613 		 */
1614 		obj_read_unlock();
1615 		st = git_inflate(&stream, Z_FINISH);
1616 		obj_read_lock();
1617 		if (!stream.avail_out)
1618 			break; /* the payload is larger than it should be */
1619 		curpos += stream.next_in - in;
1620 	} while (st == Z_OK || st == Z_BUF_ERROR);
1621 	git_inflate_end(&stream);
1622 	if ((st != Z_STREAM_END) || stream.total_out != size) {
1623 		free(buffer);
1624 		return NULL;
1625 	}
1626 
1627 	/* versions of zlib can clobber unconsumed portion of outbuf */
1628 	buffer[size] = '\0';
1629 
1630 	return buffer;
1631 }
1632 
write_pack_access_log(struct packed_git * p,off_t obj_offset)1633 static void write_pack_access_log(struct packed_git *p, off_t obj_offset)
1634 {
1635 	static struct trace_key pack_access = TRACE_KEY_INIT(PACK_ACCESS);
1636 	trace_printf_key(&pack_access, "%s %"PRIuMAX"\n",
1637 			 p->pack_name, (uintmax_t)obj_offset);
1638 }
1639 
1640 int do_check_packed_object_crc;
1641 
1642 #define UNPACK_ENTRY_STACK_PREALLOC 64
1643 struct unpack_entry_stack_ent {
1644 	off_t obj_offset;
1645 	off_t curpos;
1646 	unsigned long size;
1647 };
1648 
read_object(struct repository * r,const struct object_id * oid,enum object_type * type,unsigned long * size)1649 static void *read_object(struct repository *r,
1650 			 const struct object_id *oid,
1651 			 enum object_type *type,
1652 			 unsigned long *size)
1653 {
1654 	struct object_info oi = OBJECT_INFO_INIT;
1655 	void *content;
1656 	oi.typep = type;
1657 	oi.sizep = size;
1658 	oi.contentp = &content;
1659 
1660 	if (oid_object_info_extended(r, oid, &oi, 0) < 0)
1661 		return NULL;
1662 	return content;
1663 }
1664 
unpack_entry(struct repository * r,struct packed_git * p,off_t obj_offset,enum object_type * final_type,unsigned long * final_size)1665 void *unpack_entry(struct repository *r, struct packed_git *p, off_t obj_offset,
1666 		   enum object_type *final_type, unsigned long *final_size)
1667 {
1668 	struct pack_window *w_curs = NULL;
1669 	off_t curpos = obj_offset;
1670 	void *data = NULL;
1671 	unsigned long size;
1672 	enum object_type type;
1673 	struct unpack_entry_stack_ent small_delta_stack[UNPACK_ENTRY_STACK_PREALLOC];
1674 	struct unpack_entry_stack_ent *delta_stack = small_delta_stack;
1675 	int delta_stack_nr = 0, delta_stack_alloc = UNPACK_ENTRY_STACK_PREALLOC;
1676 	int base_from_cache = 0;
1677 
1678 	write_pack_access_log(p, obj_offset);
1679 
1680 	/* PHASE 1: drill down to the innermost base object */
1681 	for (;;) {
1682 		off_t base_offset;
1683 		int i;
1684 		struct delta_base_cache_entry *ent;
1685 
1686 		ent = get_delta_base_cache_entry(p, curpos);
1687 		if (ent) {
1688 			type = ent->type;
1689 			data = ent->data;
1690 			size = ent->size;
1691 			detach_delta_base_cache_entry(ent);
1692 			base_from_cache = 1;
1693 			break;
1694 		}
1695 
1696 		if (do_check_packed_object_crc && p->index_version > 1) {
1697 			uint32_t pack_pos, index_pos;
1698 			off_t len;
1699 
1700 			if (offset_to_pack_pos(p, obj_offset, &pack_pos) < 0) {
1701 				error("could not find object at offset %"PRIuMAX" in pack %s",
1702 				      (uintmax_t)obj_offset, p->pack_name);
1703 				data = NULL;
1704 				goto out;
1705 			}
1706 
1707 			len = pack_pos_to_offset(p, pack_pos + 1) - obj_offset;
1708 			index_pos = pack_pos_to_index(p, pack_pos);
1709 			if (check_pack_crc(p, &w_curs, obj_offset, len, index_pos)) {
1710 				struct object_id oid;
1711 				nth_packed_object_id(&oid, p, index_pos);
1712 				error("bad packed object CRC for %s",
1713 				      oid_to_hex(&oid));
1714 				mark_bad_packed_object(p, &oid);
1715 				data = NULL;
1716 				goto out;
1717 			}
1718 		}
1719 
1720 		type = unpack_object_header(p, &w_curs, &curpos, &size);
1721 		if (type != OBJ_OFS_DELTA && type != OBJ_REF_DELTA)
1722 			break;
1723 
1724 		base_offset = get_delta_base(p, &w_curs, &curpos, type, obj_offset);
1725 		if (!base_offset) {
1726 			error("failed to validate delta base reference "
1727 			      "at offset %"PRIuMAX" from %s",
1728 			      (uintmax_t)curpos, p->pack_name);
1729 			/* bail to phase 2, in hopes of recovery */
1730 			data = NULL;
1731 			break;
1732 		}
1733 
1734 		/* push object, proceed to base */
1735 		if (delta_stack_nr >= delta_stack_alloc
1736 		    && delta_stack == small_delta_stack) {
1737 			delta_stack_alloc = alloc_nr(delta_stack_nr);
1738 			ALLOC_ARRAY(delta_stack, delta_stack_alloc);
1739 			COPY_ARRAY(delta_stack, small_delta_stack,
1740 				   delta_stack_nr);
1741 		} else {
1742 			ALLOC_GROW(delta_stack, delta_stack_nr+1, delta_stack_alloc);
1743 		}
1744 		i = delta_stack_nr++;
1745 		delta_stack[i].obj_offset = obj_offset;
1746 		delta_stack[i].curpos = curpos;
1747 		delta_stack[i].size = size;
1748 
1749 		curpos = obj_offset = base_offset;
1750 	}
1751 
1752 	/* PHASE 2: handle the base */
1753 	switch (type) {
1754 	case OBJ_OFS_DELTA:
1755 	case OBJ_REF_DELTA:
1756 		if (data)
1757 			BUG("unpack_entry: left loop at a valid delta");
1758 		break;
1759 	case OBJ_COMMIT:
1760 	case OBJ_TREE:
1761 	case OBJ_BLOB:
1762 	case OBJ_TAG:
1763 		if (!base_from_cache)
1764 			data = unpack_compressed_entry(p, &w_curs, curpos, size);
1765 		break;
1766 	default:
1767 		data = NULL;
1768 		error("unknown object type %i at offset %"PRIuMAX" in %s",
1769 		      type, (uintmax_t)obj_offset, p->pack_name);
1770 	}
1771 
1772 	/* PHASE 3: apply deltas in order */
1773 
1774 	/* invariants:
1775 	 *   'data' holds the base data, or NULL if there was corruption
1776 	 */
1777 	while (delta_stack_nr) {
1778 		void *delta_data;
1779 		void *base = data;
1780 		void *external_base = NULL;
1781 		unsigned long delta_size, base_size = size;
1782 		int i;
1783 		off_t base_obj_offset = obj_offset;
1784 
1785 		data = NULL;
1786 
1787 		if (!base) {
1788 			/*
1789 			 * We're probably in deep shit, but let's try to fetch
1790 			 * the required base anyway from another pack or loose.
1791 			 * This is costly but should happen only in the presence
1792 			 * of a corrupted pack, and is better than failing outright.
1793 			 */
1794 			uint32_t pos;
1795 			struct object_id base_oid;
1796 			if (!(offset_to_pack_pos(p, obj_offset, &pos))) {
1797 				nth_packed_object_id(&base_oid, p,
1798 						     pack_pos_to_index(p, pos));
1799 				error("failed to read delta base object %s"
1800 				      " at offset %"PRIuMAX" from %s",
1801 				      oid_to_hex(&base_oid), (uintmax_t)obj_offset,
1802 				      p->pack_name);
1803 				mark_bad_packed_object(p, &base_oid);
1804 				base = read_object(r, &base_oid, &type, &base_size);
1805 				external_base = base;
1806 			}
1807 		}
1808 
1809 		i = --delta_stack_nr;
1810 		obj_offset = delta_stack[i].obj_offset;
1811 		curpos = delta_stack[i].curpos;
1812 		delta_size = delta_stack[i].size;
1813 
1814 		if (!base)
1815 			continue;
1816 
1817 		delta_data = unpack_compressed_entry(p, &w_curs, curpos, delta_size);
1818 
1819 		if (!delta_data) {
1820 			error("failed to unpack compressed delta "
1821 			      "at offset %"PRIuMAX" from %s",
1822 			      (uintmax_t)curpos, p->pack_name);
1823 			data = NULL;
1824 		} else {
1825 			data = patch_delta(base, base_size, delta_data,
1826 					   delta_size, &size);
1827 
1828 			/*
1829 			 * We could not apply the delta; warn the user, but
1830 			 * keep going. Our failure will be noticed either in
1831 			 * the next iteration of the loop, or if this is the
1832 			 * final delta, in the caller when we return NULL.
1833 			 * Those code paths will take care of making a more
1834 			 * explicit warning and retrying with another copy of
1835 			 * the object.
1836 			 */
1837 			if (!data)
1838 				error("failed to apply delta");
1839 		}
1840 
1841 		/*
1842 		 * We delay adding `base` to the cache until the end of the loop
1843 		 * because unpack_compressed_entry() momentarily releases the
1844 		 * obj_read_mutex, giving another thread the chance to access
1845 		 * the cache. Therefore, if `base` was already there, this other
1846 		 * thread could free() it (e.g. to make space for another entry)
1847 		 * before we are done using it.
1848 		 */
1849 		if (!external_base)
1850 			add_delta_base_cache(p, base_obj_offset, base, base_size, type);
1851 
1852 		free(delta_data);
1853 		free(external_base);
1854 	}
1855 
1856 	if (final_type)
1857 		*final_type = type;
1858 	if (final_size)
1859 		*final_size = size;
1860 
1861 out:
1862 	unuse_pack(&w_curs);
1863 
1864 	if (delta_stack != small_delta_stack)
1865 		free(delta_stack);
1866 
1867 	return data;
1868 }
1869 
bsearch_pack(const struct object_id * oid,const struct packed_git * p,uint32_t * result)1870 int bsearch_pack(const struct object_id *oid, const struct packed_git *p, uint32_t *result)
1871 {
1872 	const unsigned char *index_fanout = p->index_data;
1873 	const unsigned char *index_lookup;
1874 	const unsigned int hashsz = the_hash_algo->rawsz;
1875 	int index_lookup_width;
1876 
1877 	if (!index_fanout)
1878 		BUG("bsearch_pack called without a valid pack-index");
1879 
1880 	index_lookup = index_fanout + 4 * 256;
1881 	if (p->index_version == 1) {
1882 		index_lookup_width = hashsz + 4;
1883 		index_lookup += 4;
1884 	} else {
1885 		index_lookup_width = hashsz;
1886 		index_fanout += 8;
1887 		index_lookup += 8;
1888 	}
1889 
1890 	return bsearch_hash(oid->hash, (const uint32_t*)index_fanout,
1891 			    index_lookup, index_lookup_width, result);
1892 }
1893 
nth_packed_object_id(struct object_id * oid,struct packed_git * p,uint32_t n)1894 int nth_packed_object_id(struct object_id *oid,
1895 			 struct packed_git *p,
1896 			 uint32_t n)
1897 {
1898 	const unsigned char *index = p->index_data;
1899 	const unsigned int hashsz = the_hash_algo->rawsz;
1900 	if (!index) {
1901 		if (open_pack_index(p))
1902 			return -1;
1903 		index = p->index_data;
1904 	}
1905 	if (n >= p->num_objects)
1906 		return -1;
1907 	index += 4 * 256;
1908 	if (p->index_version == 1) {
1909 		oidread(oid, index + (hashsz + 4) * n + 4);
1910 	} else {
1911 		index += 8;
1912 		oidread(oid, index + hashsz * n);
1913 	}
1914 	return 0;
1915 }
1916 
check_pack_index_ptr(const struct packed_git * p,const void * vptr)1917 void check_pack_index_ptr(const struct packed_git *p, const void *vptr)
1918 {
1919 	const unsigned char *ptr = vptr;
1920 	const unsigned char *start = p->index_data;
1921 	const unsigned char *end = start + p->index_size;
1922 	if (ptr < start)
1923 		die(_("offset before start of pack index for %s (corrupt index?)"),
1924 		    p->pack_name);
1925 	/* No need to check for underflow; .idx files must be at least 8 bytes */
1926 	if (ptr >= end - 8)
1927 		die(_("offset beyond end of pack index for %s (truncated index?)"),
1928 		    p->pack_name);
1929 }
1930 
nth_packed_object_offset(const struct packed_git * p,uint32_t n)1931 off_t nth_packed_object_offset(const struct packed_git *p, uint32_t n)
1932 {
1933 	const unsigned char *index = p->index_data;
1934 	const unsigned int hashsz = the_hash_algo->rawsz;
1935 	index += 4 * 256;
1936 	if (p->index_version == 1) {
1937 		return ntohl(*((uint32_t *)(index + (hashsz + 4) * (size_t)n)));
1938 	} else {
1939 		uint32_t off;
1940 		index += 8 + (size_t)p->num_objects * (hashsz + 4);
1941 		off = ntohl(*((uint32_t *)(index + 4 * n)));
1942 		if (!(off & 0x80000000))
1943 			return off;
1944 		index += (size_t)p->num_objects * 4 + (off & 0x7fffffff) * 8;
1945 		check_pack_index_ptr(p, index);
1946 		return get_be64(index);
1947 	}
1948 }
1949 
find_pack_entry_one(const unsigned char * sha1,struct packed_git * p)1950 off_t find_pack_entry_one(const unsigned char *sha1,
1951 				  struct packed_git *p)
1952 {
1953 	const unsigned char *index = p->index_data;
1954 	struct object_id oid;
1955 	uint32_t result;
1956 
1957 	if (!index) {
1958 		if (open_pack_index(p))
1959 			return 0;
1960 	}
1961 
1962 	hashcpy(oid.hash, sha1);
1963 	if (bsearch_pack(&oid, p, &result))
1964 		return nth_packed_object_offset(p, result);
1965 	return 0;
1966 }
1967 
is_pack_valid(struct packed_git * p)1968 int is_pack_valid(struct packed_git *p)
1969 {
1970 	/* An already open pack is known to be valid. */
1971 	if (p->pack_fd != -1)
1972 		return 1;
1973 
1974 	/* If the pack has one window completely covering the
1975 	 * file size, the pack is known to be valid even if
1976 	 * the descriptor is not currently open.
1977 	 */
1978 	if (p->windows) {
1979 		struct pack_window *w = p->windows;
1980 
1981 		if (!w->offset && w->len == p->pack_size)
1982 			return 1;
1983 	}
1984 
1985 	/* Force the pack to open to prove its valid. */
1986 	return !open_packed_git(p);
1987 }
1988 
find_sha1_pack(const unsigned char * sha1,struct packed_git * packs)1989 struct packed_git *find_sha1_pack(const unsigned char *sha1,
1990 				  struct packed_git *packs)
1991 {
1992 	struct packed_git *p;
1993 
1994 	for (p = packs; p; p = p->next) {
1995 		if (find_pack_entry_one(sha1, p))
1996 			return p;
1997 	}
1998 	return NULL;
1999 
2000 }
2001 
fill_pack_entry(const struct object_id * oid,struct pack_entry * e,struct packed_git * p)2002 static int fill_pack_entry(const struct object_id *oid,
2003 			   struct pack_entry *e,
2004 			   struct packed_git *p)
2005 {
2006 	off_t offset;
2007 
2008 	if (oidset_size(&p->bad_objects) &&
2009 	    oidset_contains(&p->bad_objects, oid))
2010 		return 0;
2011 
2012 	offset = find_pack_entry_one(oid->hash, p);
2013 	if (!offset)
2014 		return 0;
2015 
2016 	/*
2017 	 * We are about to tell the caller where they can locate the
2018 	 * requested object.  We better make sure the packfile is
2019 	 * still here and can be accessed before supplying that
2020 	 * answer, as it may have been deleted since the index was
2021 	 * loaded!
2022 	 */
2023 	if (!is_pack_valid(p))
2024 		return 0;
2025 	e->offset = offset;
2026 	e->p = p;
2027 	return 1;
2028 }
2029 
find_pack_entry(struct repository * r,const struct object_id * oid,struct pack_entry * e)2030 int find_pack_entry(struct repository *r, const struct object_id *oid, struct pack_entry *e)
2031 {
2032 	struct list_head *pos;
2033 	struct multi_pack_index *m;
2034 
2035 	prepare_packed_git(r);
2036 	if (!r->objects->packed_git && !r->objects->multi_pack_index)
2037 		return 0;
2038 
2039 	for (m = r->objects->multi_pack_index; m; m = m->next) {
2040 		if (fill_midx_entry(r, oid, e, m))
2041 			return 1;
2042 	}
2043 
2044 	list_for_each(pos, &r->objects->packed_git_mru) {
2045 		struct packed_git *p = list_entry(pos, struct packed_git, mru);
2046 		if (!p->multi_pack_index && fill_pack_entry(oid, e, p)) {
2047 			list_move(&p->mru, &r->objects->packed_git_mru);
2048 			return 1;
2049 		}
2050 	}
2051 	return 0;
2052 }
2053 
maybe_invalidate_kept_pack_cache(struct repository * r,unsigned flags)2054 static void maybe_invalidate_kept_pack_cache(struct repository *r,
2055 					     unsigned flags)
2056 {
2057 	if (!r->objects->kept_pack_cache.packs)
2058 		return;
2059 	if (r->objects->kept_pack_cache.flags == flags)
2060 		return;
2061 	FREE_AND_NULL(r->objects->kept_pack_cache.packs);
2062 	r->objects->kept_pack_cache.flags = 0;
2063 }
2064 
kept_pack_cache(struct repository * r,unsigned flags)2065 static struct packed_git **kept_pack_cache(struct repository *r, unsigned flags)
2066 {
2067 	maybe_invalidate_kept_pack_cache(r, flags);
2068 
2069 	if (!r->objects->kept_pack_cache.packs) {
2070 		struct packed_git **packs = NULL;
2071 		size_t nr = 0, alloc = 0;
2072 		struct packed_git *p;
2073 
2074 		/*
2075 		 * We want "all" packs here, because we need to cover ones that
2076 		 * are used by a midx, as well. We need to look in every one of
2077 		 * them (instead of the midx itself) to cover duplicates. It's
2078 		 * possible that an object is found in two packs that the midx
2079 		 * covers, one kept and one not kept, but the midx returns only
2080 		 * the non-kept version.
2081 		 */
2082 		for (p = get_all_packs(r); p; p = p->next) {
2083 			if ((p->pack_keep && (flags & ON_DISK_KEEP_PACKS)) ||
2084 			    (p->pack_keep_in_core && (flags & IN_CORE_KEEP_PACKS))) {
2085 				ALLOC_GROW(packs, nr + 1, alloc);
2086 				packs[nr++] = p;
2087 			}
2088 		}
2089 		ALLOC_GROW(packs, nr + 1, alloc);
2090 		packs[nr] = NULL;
2091 
2092 		r->objects->kept_pack_cache.packs = packs;
2093 		r->objects->kept_pack_cache.flags = flags;
2094 	}
2095 
2096 	return r->objects->kept_pack_cache.packs;
2097 }
2098 
find_kept_pack_entry(struct repository * r,const struct object_id * oid,unsigned flags,struct pack_entry * e)2099 int find_kept_pack_entry(struct repository *r,
2100 			 const struct object_id *oid,
2101 			 unsigned flags,
2102 			 struct pack_entry *e)
2103 {
2104 	struct packed_git **cache;
2105 
2106 	for (cache = kept_pack_cache(r, flags); *cache; cache++) {
2107 		struct packed_git *p = *cache;
2108 		if (fill_pack_entry(oid, e, p))
2109 			return 1;
2110 	}
2111 
2112 	return 0;
2113 }
2114 
has_object_pack(const struct object_id * oid)2115 int has_object_pack(const struct object_id *oid)
2116 {
2117 	struct pack_entry e;
2118 	return find_pack_entry(the_repository, oid, &e);
2119 }
2120 
has_object_kept_pack(const struct object_id * oid,unsigned flags)2121 int has_object_kept_pack(const struct object_id *oid, unsigned flags)
2122 {
2123 	struct pack_entry e;
2124 	return find_kept_pack_entry(the_repository, oid, flags, &e);
2125 }
2126 
has_pack_index(const unsigned char * sha1)2127 int has_pack_index(const unsigned char *sha1)
2128 {
2129 	struct stat st;
2130 	if (stat(sha1_pack_index_name(sha1), &st))
2131 		return 0;
2132 	return 1;
2133 }
2134 
for_each_object_in_pack(struct packed_git * p,each_packed_object_fn cb,void * data,enum for_each_object_flags flags)2135 int for_each_object_in_pack(struct packed_git *p,
2136 			    each_packed_object_fn cb, void *data,
2137 			    enum for_each_object_flags flags)
2138 {
2139 	uint32_t i;
2140 	int r = 0;
2141 
2142 	if (flags & FOR_EACH_OBJECT_PACK_ORDER) {
2143 		if (load_pack_revindex(p))
2144 			return -1;
2145 	}
2146 
2147 	for (i = 0; i < p->num_objects; i++) {
2148 		uint32_t index_pos;
2149 		struct object_id oid;
2150 
2151 		/*
2152 		 * We are iterating "i" from 0 up to num_objects, but its
2153 		 * meaning may be different, depending on the requested output
2154 		 * order:
2155 		 *
2156 		 *   - in object-name order, it is the same as the index order
2157 		 *     used by nth_packed_object_id(), so we can pass it
2158 		 *     directly
2159 		 *
2160 		 *   - in pack-order, it is pack position, which we must
2161 		 *     convert to an index position in order to get the oid.
2162 		 */
2163 		if (flags & FOR_EACH_OBJECT_PACK_ORDER)
2164 			index_pos = pack_pos_to_index(p, i);
2165 		else
2166 			index_pos = i;
2167 
2168 		if (nth_packed_object_id(&oid, p, index_pos) < 0)
2169 			return error("unable to get sha1 of object %u in %s",
2170 				     index_pos, p->pack_name);
2171 
2172 		r = cb(&oid, p, index_pos, data);
2173 		if (r)
2174 			break;
2175 	}
2176 	return r;
2177 }
2178 
for_each_packed_object(each_packed_object_fn cb,void * data,enum for_each_object_flags flags)2179 int for_each_packed_object(each_packed_object_fn cb, void *data,
2180 			   enum for_each_object_flags flags)
2181 {
2182 	struct packed_git *p;
2183 	int r = 0;
2184 	int pack_errors = 0;
2185 
2186 	prepare_packed_git(the_repository);
2187 	for (p = get_all_packs(the_repository); p; p = p->next) {
2188 		if ((flags & FOR_EACH_OBJECT_LOCAL_ONLY) && !p->pack_local)
2189 			continue;
2190 		if ((flags & FOR_EACH_OBJECT_PROMISOR_ONLY) &&
2191 		    !p->pack_promisor)
2192 			continue;
2193 		if ((flags & FOR_EACH_OBJECT_SKIP_IN_CORE_KEPT_PACKS) &&
2194 		    p->pack_keep_in_core)
2195 			continue;
2196 		if ((flags & FOR_EACH_OBJECT_SKIP_ON_DISK_KEPT_PACKS) &&
2197 		    p->pack_keep)
2198 			continue;
2199 		if (open_pack_index(p)) {
2200 			pack_errors = 1;
2201 			continue;
2202 		}
2203 		r = for_each_object_in_pack(p, cb, data, flags);
2204 		if (r)
2205 			break;
2206 	}
2207 	return r ? r : pack_errors;
2208 }
2209 
add_promisor_object(const struct object_id * oid,struct packed_git * pack,uint32_t pos,void * set_)2210 static int add_promisor_object(const struct object_id *oid,
2211 			       struct packed_git *pack,
2212 			       uint32_t pos,
2213 			       void *set_)
2214 {
2215 	struct oidset *set = set_;
2216 	struct object *obj = parse_object(the_repository, oid);
2217 	if (!obj)
2218 		return 1;
2219 
2220 	oidset_insert(set, oid);
2221 
2222 	/*
2223 	 * If this is a tree, commit, or tag, the objects it refers
2224 	 * to are also promisor objects. (Blobs refer to no objects->)
2225 	 */
2226 	if (obj->type == OBJ_TREE) {
2227 		struct tree *tree = (struct tree *)obj;
2228 		struct tree_desc desc;
2229 		struct name_entry entry;
2230 		if (init_tree_desc_gently(&desc, tree->buffer, tree->size))
2231 			/*
2232 			 * Error messages are given when packs are
2233 			 * verified, so do not print any here.
2234 			 */
2235 			return 0;
2236 		while (tree_entry_gently(&desc, &entry))
2237 			oidset_insert(set, &entry.oid);
2238 		free_tree_buffer(tree);
2239 	} else if (obj->type == OBJ_COMMIT) {
2240 		struct commit *commit = (struct commit *) obj;
2241 		struct commit_list *parents = commit->parents;
2242 
2243 		oidset_insert(set, get_commit_tree_oid(commit));
2244 		for (; parents; parents = parents->next)
2245 			oidset_insert(set, &parents->item->object.oid);
2246 	} else if (obj->type == OBJ_TAG) {
2247 		struct tag *tag = (struct tag *) obj;
2248 		oidset_insert(set, get_tagged_oid(tag));
2249 	}
2250 	return 0;
2251 }
2252 
is_promisor_object(const struct object_id * oid)2253 int is_promisor_object(const struct object_id *oid)
2254 {
2255 	static struct oidset promisor_objects;
2256 	static int promisor_objects_prepared;
2257 
2258 	if (!promisor_objects_prepared) {
2259 		if (has_promisor_remote()) {
2260 			for_each_packed_object(add_promisor_object,
2261 					       &promisor_objects,
2262 					       FOR_EACH_OBJECT_PROMISOR_ONLY);
2263 		}
2264 		promisor_objects_prepared = 1;
2265 	}
2266 	return oidset_contains(&promisor_objects, oid);
2267 }
2268