Commit cc6d9cc7fc010db9be6c2d90fd054fb2d189d629

Parents: e10159691e799d0f31f5314c73f47511cc974f46

From: June McEnroe <june@causal.agency>
Date: Wed Dec 18 21:30:12 2019 +0700

ui-tree,ui-blame: bail from blame if blob is binary
This avoids piping binary blobs through the source-filter. Also prevent
robots from crawling it, since it's expensive.

Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>

Stats

robots.txt +1/-0
ui-blame.c +4/-0
ui-tree.c +4/-2

Changeset

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
diff --git a/robots.txt b/robots.txt
index 4ce948fec2c9f85897d29a9d892b5113006d1328..1b33266d534a29cb51f60022604ed85369f43917 100644
--- a/robots.txt
+++ b/robots.txt
@@ -1,3 +1,4 @@
 User-agent: *
 Disallow: /*/snapshot/*
+Disallow: /*/blame/*
 Allow: /
diff --git a/ui-blame.c b/ui-blame.c
index 03136f78de3283a2d0632acf3847071624fe363b..4adec2b99e5f19af19109f92677def0e635e5e9a 100644
--- a/ui-blame.c
+++ b/ui-blame.c
@@ -152,6 +152,10 @@ 	html(") (");
 	cgit_tree_link("tree", NULL, NULL, ctx.qry.head, rev, path);
 	html(")\n");
 
+	if (buffer_is_binary(buf, size)) {
+		html("<div class='error'>blob is binary.</div>");
+		goto cleanup;
+	}
 	if (ctx.cfg.max_blob_size && size / 1024 > ctx.cfg.max_blob_size) {
 		htmlf("<div class='error'>blob size (%ldKB)"
 		      " exceeds display size limit (%dKB).</div>",
diff --git a/ui-tree.c b/ui-tree.c
index b61f6f5433976202ea277bfa7bf5fd9aed4c4808..034c4c89474fdb7ecd6e491ab6b0e15f2529834b 100644
--- a/ui-tree.c
+++ b/ui-tree.c
@@ -89,6 +89,7 @@ {
 	enum object_type type;
 	char *buf;
 	unsigned long size;
+	bool is_binary;
 
 	type = oid_object_info(the_repository, oid, &size);
 	if (type == OBJ_BAD) {
@@ -103,6 +104,7 @@ 		cgit_print_error_page(500, "Internal server error",
 			"Error reading object %s", oid_to_hex(oid));
 		return;
 	}
+	is_binary = buffer_is_binary(buf, size);
 
 	cgit_set_title_from_path(path);
 
@@ -110,7 +112,7 @@ 	cgit_print_layout_start();
 	htmlf("blob: %s (", oid_to_hex(oid));
 	cgit_plain_link("plain", NULL, NULL, ctx.qry.head,
 		        rev, path);
-	if (ctx.repo->enable_blame) {
+	if (ctx.repo->enable_blame && !is_binary) {
 		html(") (");
 		cgit_blame_link("blame", NULL, NULL, ctx.qry.head,
 			        rev, path);
@@ -123,7 +125,7 @@ 				size / 1024, ctx.cfg.max_blob_size);
 		return;
 	}
 
-	if (buffer_is_binary(buf, size))
+	if (is_binary)
 		print_binary_buffer(buf, size);
 	else
 		print_text_buffer(basename, buf, size);