Merge branch 'jk/cap-exclude-file-size'
An overly large ".gitignore" files are now rejected silently. * jk/cap-exclude-file-size: dir.c: reduce max pattern file size to 100MB dir.c: skip .gitignore, etc larger than INT_MAXmaint
						commit
						c2f79440ac
					
				
							
								
								
									
										20
									
								
								dir.c
								
								
								
								
							
							
						
						
									
										20
									
								
								dir.c
								
								
								
								
							|  | @ -30,6 +30,13 @@ | ||||||
| #include "symlinks.h" | #include "symlinks.h" | ||||||
| #include "trace2.h" | #include "trace2.h" | ||||||
| #include "tree.h" | #include "tree.h" | ||||||
|  | #include "hex.h" | ||||||
|  |  | ||||||
|  |  /* | ||||||
|  |   * The maximum size of a pattern/exclude file. If the file exceeds this size | ||||||
|  |   * we will ignore it. | ||||||
|  |   */ | ||||||
|  | #define PATTERN_MAX_FILE_SIZE (100 * 1024 * 1024) | ||||||
|  |  | ||||||
| /* | /* | ||||||
|  * Tells read_directory_recursive how a file or directory should be treated. |  * Tells read_directory_recursive how a file or directory should be treated. | ||||||
|  | @ -1148,6 +1155,12 @@ static int add_patterns(const char *fname, const char *base, int baselen, | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	if (size > PATTERN_MAX_FILE_SIZE) { | ||||||
|  | 		warning("ignoring excessively large pattern file: %s", fname); | ||||||
|  | 		free(buf); | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	add_patterns_from_buffer(buf, size, base, baselen, pl); | 	add_patterns_from_buffer(buf, size, base, baselen, pl); | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  | @ -1204,6 +1217,13 @@ int add_patterns_from_blob_to_list( | ||||||
| 	if (r != 1) | 	if (r != 1) | ||||||
| 		return r; | 		return r; | ||||||
|  |  | ||||||
|  | 	if (size > PATTERN_MAX_FILE_SIZE) { | ||||||
|  | 		warning("ignoring excessively large pattern blob: %s", | ||||||
|  | 			oid_to_hex(oid)); | ||||||
|  | 		free(buf); | ||||||
|  | 		return -1; | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	add_patterns_from_buffer(buf, size, base, baselen, pl); | 	add_patterns_from_buffer(buf, size, base, baselen, pl); | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -945,4 +945,12 @@ test_expect_success SYMLINKS 'symlinks not respected in-tree' ' | ||||||
| 	test_grep "unable to access.*gitignore" err | 	test_grep "unable to access.*gitignore" err | ||||||
| ' | ' | ||||||
|  |  | ||||||
|  | test_expect_success EXPENSIVE 'large exclude file ignored in tree' ' | ||||||
|  | 	test_when_finished "rm .gitignore" && | ||||||
|  | 	dd if=/dev/zero of=.gitignore bs=101M count=1 && | ||||||
|  | 	git ls-files -o --exclude-standard 2>err && | ||||||
|  | 	echo "warning: ignoring excessively large pattern file: .gitignore" >expect && | ||||||
|  | 	test_cmp expect err | ||||||
|  | ' | ||||||
|  |  | ||||||
| test_done | test_done | ||||||
|  |  | ||||||
|  | @ -701,4 +701,16 @@ test_expect_success 'expand blob limit in protocol' ' | ||||||
| 	grep "blob:limit=1024" trace | 	grep "blob:limit=1024" trace | ||||||
| ' | ' | ||||||
|  |  | ||||||
|  | test_expect_success EXPENSIVE 'large sparse filter file ignored' ' | ||||||
|  | 	blob=$(dd if=/dev/zero bs=101M count=1 | | ||||||
|  | 	       git hash-object -w --stdin) && | ||||||
|  | 	test_must_fail \ | ||||||
|  | 		git rev-list --all --objects --filter=sparse:oid=$blob 2>err && | ||||||
|  | 	cat >expect <<-EOF && | ||||||
|  | 	warning: ignoring excessively large pattern blob: $blob | ||||||
|  | 	fatal: unable to parse sparse filter data in $blob | ||||||
|  | 	EOF | ||||||
|  | 	test_cmp expect err | ||||||
|  | ' | ||||||
|  |  | ||||||
| test_done | test_done | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Junio C Hamano
						Junio C Hamano