summaryrefslogtreecommitdiffabout
authorLars 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)
commitb507252b469333d06afff0888d466e39124a7e07 (patch) (side-by-side diff)
tree05b98ce7a9b600679fd4fad437459e25c60d194a
parent011f2e9bdddcbfe65da397629bca87d167313a28 (diff)
downloadcgit-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>
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--ui-plain.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/ui-plain.c b/ui-plain.c
index 5addd9e..e08b15b 100644
--- a/ui-plain.c
+++ b/ui-plain.c
@@ -1,79 +1,80 @@
/* ui-plain.c: functions for output of plain blobs by path
*
* Copyright (C) 2008 Lars Hjemli
*
* Licensed under GNU General Public License v2
* (see COPYING for full license text)
*/
#include "cgit.h"
#include "html.h"
#include "ui-shared.h"
char *curr_rev;
char *match_path;
int match;
static void print_object(const unsigned char *sha1, const char *path)
{
enum object_type type;
char *buf;
unsigned long size;
type = sha1_object_info(sha1, &size);
if (type == OBJ_BAD) {
html_status(404, "Not found", 0);
return;
}
buf = read_sha1_file(sha1, &type, &size);
if (!buf) {
html_status(404, "Not found", 0);
return;
}
ctx.page.mimetype = "text/plain";
ctx.page.filename = fmt("%s", path);
ctx.page.size = size;
cgit_print_http_headers(&ctx);
html_raw(buf, size);
match = 1;
}
static int walk_tree(const unsigned char *sha1, const char *base, int baselen,
const char *pathname, unsigned mode, int stage,
void *cbdata)
{
if (S_ISDIR(mode))
return READ_TREE_RECURSIVE;
- if (S_ISREG(mode))
+ if (S_ISREG(mode) && !strncmp(base, match_path, baselen) &&
+ !strcmp(pathname, match_path + baselen))
print_object(sha1, pathname);
return 0;
}
void cgit_print_plain(struct cgit_context *ctx)
{
const char *rev = ctx->qry.sha1;
unsigned char sha1[20];
struct commit *commit;
const char *paths[] = {ctx->qry.path, NULL};
if (!rev)
rev = ctx->qry.head;
curr_rev = xstrdup(rev);
if (get_sha1(rev, sha1)) {
html_status(404, "Not found", 0);
return;
}
commit = lookup_commit_reference(sha1);
if (!commit || parse_commit(commit)) {
html_status(404, "Not found", 0);
return;
}
match_path = ctx->qry.path;
read_tree_recursive(commit->tree, NULL, 0, 0, paths, walk_tree, NULL);
if (!match)
html_status(404, "Not found", 0);
}