{"schema":"libjg2-1",
"vpath":"/git/",
"avatar":"/git/avatar/",
"alang":"",
"gen_ut":1745907196,
"reponame":"cgit",
"desc":"CGI gitweb",
"owner": { "name": "Andy Green", "email": "andy@warmcat.com", "md5": "c50933ca2aa61e0fe2c43d46bb6b59cb" },"url":"https://warmcat.com/repo/cgit",
"f":3,
"items": [
{"schema":"libjg2-1",
"cid":"b04b767d3e05c50de02df0264f9aed14",
"commit": {"type":"commit",
"time": 1530578607,
"time_ofs": 480,
"oid_tree": { "oid": "84ac685c630699814afeb425e31b42c0ada81c1d", "alias": []},
"oid":{ "oid": "7e3c9c387d077efda69f84077fff4ce7fee3a1ad", "alias": []},
"msg": "cgit_repobasename: convert to allocated result",
"sig_commit": { "git_time": { "time": 1530578607, "offset": 480 }, "name": "Andy Green", "email": "andy@warmcat.com", "md5": "c50933ca2aa61e0fe2c43d46bb6b59cb" },
"sig_author": { "git_time": { "time": 1530010641, "offset": 480 }, "name": "Andy Green", "email": "andy@warmcat.com", "md5": "c50933ca2aa61e0fe2c43d46bb6b59cb" }},
"body": "cgit_repobasename: convert to allocated result\n\ncgit_repobasename has one user also in ui-shared.c. Make it static\nand remove the declaration from cgit.h.\n\nInstead of the gnarly return pointer to now deallocated stack,\ncompute the valid part of the string using the incoming pointer,\nthen just allocate the right amount and copy it in. Drop the\nconst on the return type now it's allocated.\n\nCover the fact the input may be garbage by returning NULL if so.\n\nComment the function at the start that the result may be NULL or\nmust be freed now.\n\nConvert the only user, cgit_snapshot_prefix(), to the same return\nconvention and also comment him at the start that the result may\nbe NULL or must be freed. Also change the return type to char *.\n\nConvert his only users, get_ref_from_filename() and\ncgit_print_snapshot()in ui-snapshot.c, to deal with the new\nresult convention. cgit_print_snapshot() already did an\nxstrdup() on him anyway, just remove it and check for NULL.\n\nThe reason triggering all this was\n\n../ui-shared.c: In function ‘cgit_repobasename’:\n../ui-shared.c:135:2: warning: ‘strncpy’ specified bound 1024 equals destination size [-Wstringop-truncation]\n strncpy(rvbuf, reponame, sizeof(rvbuf));\n ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n+ comment from John Keeping.\n\nSigned-off-by: Andy Green \u003candy@warmcat.com\u003e"
,
"diff": "diff --git a/cgit.h b/cgit.h\nindex 6feca68..6e6750c 100644\n--- a/cgit.h\n+++ b/cgit.h\n@@ -369,8 +369,6 @@ extern struct commitinfo *cgit_parse_commit(struct commit *commit);\n extern struct taginfo *cgit_parse_tag(struct tag *tag);\n extern void cgit_parse_url(const char *url);\n \n-extern const char *cgit_repobasename(const char *reponame);\n-\n extern int cgit_parse_snapshots_mask(const char *str);\n extern const struct object_id *cgit_snapshot_get_sig(const char *ref,\n \t\t\t\t\t\t const struct cgit_snapshot_format *f);\ndiff --git a/ui-shared.c b/ui-shared.c\nindex a63dcb0..24fa9f7 100644\n--- a/ui-shared.c\n+++ b/ui-shared.c\n@@ -127,35 +127,40 @@ char *cgit_pageurl(const char *reponame, const char *pagename,\n \treturn cgit_fileurl(reponame, pagename, NULL, query);\n }\n \n-const char *cgit_repobasename(const char *reponame)\n+/* result is NULL or must be freed */\n+static char *cgit_repobasename(const char *reponame)\n {\n-\t/* I assume we don't need to store more than one repo basename */\n-\tstatic char rvbuf[1024];\n-\tint p;\n-\tconst char *rv;\n-\tstrncpy(rvbuf, reponame, sizeof(rvbuf));\n-\tif (rvbuf[sizeof(rvbuf)-1])\n-\t\tdie(\u0022cgit_repobasename: truncated repository name '%s'\u0022, reponame);\n-\tp \u003d strlen(rvbuf)-1;\n-\t/* strip trailing slashes */\n-\twhile (p \u0026\u0026 rvbuf[p] \u003d\u003d '/') rvbuf[p--] \u003d 0;\n-\t/* strip trailing .git */\n-\tif (p \u003e\u003d 3 \u0026\u0026 starts_with(\u0026rvbuf[p-3], \u0022.git\u0022)) {\n-\t\tp -\u003d 3; rvbuf[p--] \u003d 0;\n-\t}\n-\t/* strip more trailing slashes if any */\n-\twhile ( p \u0026\u0026 rvbuf[p] \u003d\u003d '/') rvbuf[p--] \u003d 0;\n-\t/* find last slash in the remaining string */\n-\trv \u003d strrchr(rvbuf,'/');\n-\tif (rv)\n-\t\treturn ++rv;\n-\treturn rvbuf;\n+\tint last \u003d strlen(reponame) - 1, n;\n+\tchar *rv;\n+\n+\tif (last \u003c 1)\n+\t\treturn NULL;\n+\n+\twhile (last \u0026\u0026 reponame[last] \u003d\u003d '/')\n+\t\tlast--;\n+\n+\tif (last \u003e\u003d 3 \u0026\u0026 !strncmp(\u0026reponame[last - 3], \u0022.git\u0022, 3))\n+\t\tlast -\u003d 3;\n+\n+\twhile (last \u0026\u0026 reponame[last] \u003d\u003d '/')\n+\t\tlast--;\n+\n+\tn \u003d last;\n+\twhile (n \u0026\u0026 reponame[n] !\u003d '/')\n+\t\tn--;\n+\n+\trv \u003d xmalloc(last - n + 2);\n+\tstrncpy(rv, \u0026reponame[n], last - n + 1);\n+\trv[last - n + 1] \u003d '\u005c0';\n+\n+\treturn rv;\n }\n \n-const char *cgit_snapshot_prefix(const struct cgit_repo *repo)\n+/* result is NULL or must be freed */\n+char *cgit_snapshot_prefix(const struct cgit_repo *repo)\n {\n \tif (repo-\u003esnapshot_prefix)\n-\t\treturn repo-\u003esnapshot_prefix;\n+\t\treturn xstrdup(repo-\u003esnapshot_prefix);\n \n \treturn cgit_repobasename(repo-\u003eurl);\n }\ndiff --git a/ui-shared.h b/ui-shared.h\nindex 4d5978b..49c11fc 100644\n--- a/ui-shared.h\n+++ b/ui-shared.h\n@@ -78,7 +78,8 @@ extern void cgit_compose_snapshot_prefix(struct strbuf *filename,\n \t\t\t\t\t const char *base, const char *ref);\n extern void cgit_print_snapshot_links(const struct cgit_repo *repo,\n \t\t\t\t const char *ref, const char *separator);\n-extern const char *cgit_snapshot_prefix(const struct cgit_repo *repo);\n+/* result is NULL or must be freed */\n+extern char *cgit_snapshot_prefix(const struct cgit_repo *repo);\n extern void cgit_add_hidden_formfields(int incl_head, int incl_search,\n \t\t\t\t const char *page);\n \ndiff --git a/ui-snapshot.c b/ui-snapshot.c\nindex 92c3277..8b5f046 100644\n--- a/ui-snapshot.c\n+++ b/ui-snapshot.c\n@@ -206,7 +206,7 @@ static const char *get_ref_from_filename(const struct cgit_repo *repo,\n \t\t\t\t\t const char *filename,\n \t\t\t\t\t const struct cgit_snapshot_format *format)\n {\n-\tconst char *reponame;\n+\tchar *reponame \u003d NULL;\n \tstruct object_id oid;\n \tstruct strbuf snapshot \u003d STRBUF_INIT;\n \tint result \u003d 1;\n@@ -215,9 +215,12 @@ static const char *get_ref_from_filename(const struct cgit_repo *repo,\n \tstrbuf_setlen(\u0026snapshot, snapshot.len - strlen(format-\u003esuffix));\n \n \tif (get_oid(snapshot.buf, \u0026oid) \u003d\u003d 0)\n-\t\tgoto out;\n+\t\tgoto out1;\n \n \treponame \u003d cgit_snapshot_prefix(repo);\n+\tif (!reponame)\n+\t\tgoto out1;\n+\n \tif (starts_with(snapshot.buf, reponame)) {\n \t\tconst char *new_start \u003d snapshot.buf;\n \t\tnew_start +\u003d strlen(reponame);\n@@ -241,6 +244,8 @@ static const char *get_ref_from_filename(const struct cgit_repo *repo,\n \tstrbuf_release(\u0026snapshot);\n \n out:\n+\tfree(reponame);\n+out1:\n \treturn result ? strbuf_detach(\u0026snapshot, NULL) : NULL;\n }\n \n@@ -288,7 +293,15 @@ void cgit_print_snapshot(const char *head, const char *hex,\n \t\thex \u003d head;\n \n \tif (!prefix)\n-\t\tprefix \u003d xstrdup(cgit_snapshot_prefix(ctx.repo));\n+\t\tprefix \u003d cgit_snapshot_prefix(ctx.repo);\n+\n+\tif (!prefix) {\n+\t\tcgit_print_error_page(500, \u0022Internal Server Error\u0022,\n+\t\t\t\t\u0022Bad repo name\u0022);\n+\n+\t\tgoto out1;\n+\t}\n+\n \n \tif (sig_filename)\n \t\twrite_sig(f, hex, filename, sig_filename);\n@@ -296,5 +309,7 @@ void cgit_print_snapshot(const char *head, const char *hex,\n \t\tmake_snapshot(f, hex, prefix, filename);\n \n \tfree(prefix);\n+\n+out1:\n \tfree(adj_filename);\n }\n","s":{"c":1745907196,"u": 1836}}
],"g": 3560,"chitpc": 0,"ehitpc": 0,"indexed":0
,
"ab": 0, "si": 0, "db":0, "di":0, "sat":0, "lfc": "0000"}