about summary refs log tree commit diff
path: root/cgit.c
diff options
context:
space:
mode:
Diffstat (limited to 'cgit.c')
-rw-r--r--cgit.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/cgit.c b/cgit.c
index 5d6e488..6be3754 100644
--- a/cgit.c
+++ b/cgit.c
@@ -29,6 +29,7 @@ void add_mimetype(const char *name, const char *value)
 struct cgit_filter *new_filter(const char *cmd, filter_type filtertype)
 {
 	struct cgit_filter *f;
+	int args_size = 0;
 	int extra_args;
 
 	if (!cmd || !cmd[0])
@@ -48,9 +49,10 @@ struct cgit_filter *new_filter(const char *cmd, filter_type filtertype)
 
 	f = xmalloc(sizeof(struct cgit_filter));
 	f->cmd = xstrdup(cmd);
-	f->argv = xmalloc((2 + extra_args) * sizeof(char *));
+	args_size = (2 + extra_args) * sizeof(char *);
+	f->argv = xmalloc(args_size);
+	memset(f->argv, 0, args_size);
 	f->argv[0] = f->cmd;
-	f->argv[1] = NULL;
 	return f;
 }
 
@@ -158,6 +160,8 @@ void config_cb(const char *name, const char *value)
 		ctx.cfg.enable_filter_overrides = atoi(value);
 	else if (!strcmp(name, "enable-gitweb-owner"))
 		ctx.cfg.enable_gitweb_owner = atoi(value);
+	else if (!strcmp(name, "enable-http-clone"))
+		ctx.cfg.enable_http_clone = atoi(value);
 	else if (!strcmp(name, "enable-index-links"))
 		ctx.cfg.enable_index_links = atoi(value);
 	else if (!strcmp(name, "enable-commit-graph"))
@@ -323,6 +327,7 @@ static void prepare_context(struct cgit_context *ctx)
 	ctx->cfg.logo = "/cgit.png";
 	ctx->cfg.local_time = 0;
 	ctx->cfg.enable_gitweb_owner = 1;
+	ctx->cfg.enable_http_clone = 1;
 	ctx->cfg.enable_tree_linenumbers = 1;
 	ctx->cfg.max_repo_count = 50;
 	ctx->cfg.max_commit_count = 50;
@@ -450,7 +455,7 @@ static int prepare_repo_cmd(struct cgit_context *ctx)
 		tmp = xstrdup(ctx->qry.head);
 		ctx->qry.head = ctx->repo->defbranch;
 		ctx->page.status = 404;
-		ctx->page.statusmsg = "not found";
+		ctx->page.statusmsg = "Not found";
 		cgit_print_http_headers(ctx);
 		cgit_print_docstart(ctx);
 		cgit_print_pageheader(ctx);
@@ -469,6 +474,8 @@ static void process_request(void *cbdata)
 	cmd = cgit_get_cmd(ctx);
 	if (!cmd) {
 		ctx->page.title = "cgit error";
+		ctx->page.status = 404;
+		ctx->page.statusmsg = "Not found";
 		cgit_print_http_headers(ctx);
 		cgit_print_docstart(ctx);
 		cgit_print_pageheader(ctx);
@@ -477,6 +484,11 @@ static void process_request(void *cbdata)
 		return;
 	}
 
+	if (!ctx->cfg.enable_http_clone && cmd->is_clone) {
+		html_status(404, "Not found", 0);
+		return;
+	}
+
 	/* If cmd->want_vpath is set, assume ctx->qry.path contains a "virtual"
 	 * in-project path limit to be made available at ctx->qry.vpath.
 	 * Otherwise, no path limit is in effect (ctx->qry.vpath = NULL).
@@ -768,8 +780,11 @@ int main(int argc, const char **argv)
 	 * that virtual-root equals SCRIPT_NAME, minus any possibly
 	 * trailing slashes.
 	 */
-	if (!ctx.cfg.virtual_root)
+	if (!ctx.cfg.virtual_root && ctx.cfg.script_name) {
 		ctx.cfg.virtual_root = trim_end(ctx.cfg.script_name, '/');
+		if (!ctx.cfg.virtual_root)
+			ctx.cfg.virtual_root = "";
+        }
 
 	/* If no url parameter is specified on the querystring, lets
 	 * use PATH_INFO as url. This allows cgit to work with virtual