author | Lars Hjemli <larsh@slackbox.hjemli.net> | 2009-09-06 17:33:10 (UTC) |
---|---|---|
committer | Lars Hjemli <larsh@slackbox.hjemli.net> | 2009-09-06 17:33:10 (UTC) |
commit | b507252b469333d06afff0888d466e39124a7e07 (patch) (unidiff) | |
tree | 05b98ce7a9b600679fd4fad437459e25c60d194a | |
parent | 011f2e9bdddcbfe65da397629bca87d167313a28 (diff) | |
download | cgit-b507252b469333d06afff0888d466e39124a7e07.zip cgit-b507252b469333d06afff0888d466e39124a7e07.tar.gz cgit-b507252b469333d06afff0888d466e39124a7e07.tar.bz2 |
ui-plain.c: only return the blob with the specified path
When a path to a directory was specified for the 'plain'
view, each blob in the directory used to be returned to
the client. This patch fixes the issue by matching the
path of each blob against the requested path.
Noticed-by: Lars Stoltenow <penma@penma.de>
Signed-off-by: Lars Hjemli <larsh@slackbox.hjemli.net>
-rw-r--r-- | ui-plain.c | 3 |
1 files changed, 2 insertions, 1 deletions
@@ -17,63 +17,64 @@ int match; | |||
17 | static void print_object(const unsigned char *sha1, const char *path) | 17 | static void print_object(const unsigned char *sha1, const char *path) |
18 | { | 18 | { |
19 | enum object_type type; | 19 | enum object_type type; |
20 | char *buf; | 20 | char *buf; |
21 | unsigned long size; | 21 | unsigned long size; |
22 | 22 | ||
23 | type = sha1_object_info(sha1, &size); | 23 | type = sha1_object_info(sha1, &size); |
24 | if (type == OBJ_BAD) { | 24 | if (type == OBJ_BAD) { |
25 | html_status(404, "Not found", 0); | 25 | html_status(404, "Not found", 0); |
26 | return; | 26 | return; |
27 | } | 27 | } |
28 | 28 | ||
29 | buf = read_sha1_file(sha1, &type, &size); | 29 | buf = read_sha1_file(sha1, &type, &size); |
30 | if (!buf) { | 30 | if (!buf) { |
31 | html_status(404, "Not found", 0); | 31 | html_status(404, "Not found", 0); |
32 | return; | 32 | return; |
33 | } | 33 | } |
34 | ctx.page.mimetype = "text/plain"; | 34 | ctx.page.mimetype = "text/plain"; |
35 | ctx.page.filename = fmt("%s", path); | 35 | ctx.page.filename = fmt("%s", path); |
36 | ctx.page.size = size; | 36 | ctx.page.size = size; |
37 | cgit_print_http_headers(&ctx); | 37 | cgit_print_http_headers(&ctx); |
38 | html_raw(buf, size); | 38 | html_raw(buf, size); |
39 | match = 1; | 39 | match = 1; |
40 | } | 40 | } |
41 | 41 | ||
42 | static int walk_tree(const unsigned char *sha1, const char *base, int baselen, | 42 | static int walk_tree(const unsigned char *sha1, const char *base, int baselen, |
43 | const char *pathname, unsigned mode, int stage, | 43 | const char *pathname, unsigned mode, int stage, |
44 | void *cbdata) | 44 | void *cbdata) |
45 | { | 45 | { |
46 | if (S_ISDIR(mode)) | 46 | if (S_ISDIR(mode)) |
47 | return READ_TREE_RECURSIVE; | 47 | return READ_TREE_RECURSIVE; |
48 | 48 | ||
49 | if (S_ISREG(mode)) | 49 | if (S_ISREG(mode) && !strncmp(base, match_path, baselen) && |
50 | !strcmp(pathname, match_path + baselen)) | ||
50 | print_object(sha1, pathname); | 51 | print_object(sha1, pathname); |
51 | 52 | ||
52 | return 0; | 53 | return 0; |
53 | } | 54 | } |
54 | 55 | ||
55 | void cgit_print_plain(struct cgit_context *ctx) | 56 | void cgit_print_plain(struct cgit_context *ctx) |
56 | { | 57 | { |
57 | const char *rev = ctx->qry.sha1; | 58 | const char *rev = ctx->qry.sha1; |
58 | unsigned char sha1[20]; | 59 | unsigned char sha1[20]; |
59 | struct commit *commit; | 60 | struct commit *commit; |
60 | const char *paths[] = {ctx->qry.path, NULL}; | 61 | const char *paths[] = {ctx->qry.path, NULL}; |
61 | 62 | ||
62 | if (!rev) | 63 | if (!rev) |
63 | rev = ctx->qry.head; | 64 | rev = ctx->qry.head; |
64 | 65 | ||
65 | curr_rev = xstrdup(rev); | 66 | curr_rev = xstrdup(rev); |
66 | if (get_sha1(rev, sha1)) { | 67 | if (get_sha1(rev, sha1)) { |
67 | html_status(404, "Not found", 0); | 68 | html_status(404, "Not found", 0); |
68 | return; | 69 | return; |
69 | } | 70 | } |
70 | commit = lookup_commit_reference(sha1); | 71 | commit = lookup_commit_reference(sha1); |
71 | if (!commit || parse_commit(commit)) { | 72 | if (!commit || parse_commit(commit)) { |
72 | html_status(404, "Not found", 0); | 73 | html_status(404, "Not found", 0); |
73 | return; | 74 | return; |
74 | } | 75 | } |
75 | match_path = ctx->qry.path; | 76 | match_path = ctx->qry.path; |
76 | read_tree_recursive(commit->tree, NULL, 0, 0, paths, walk_tree, NULL); | 77 | read_tree_recursive(commit->tree, NULL, 0, 0, paths, walk_tree, NULL); |
77 | if (!match) | 78 | if (!match) |
78 | html_status(404, "Not found", 0); | 79 | html_status(404, "Not found", 0); |
79 | } | 80 | } |