| Age | Commit message (Collapse) | Author | Lines |
|
It was a bare table.list with no name, section or label, the one
listing that broke what the README promises a theme.
|
|
The README promised that t0005 checked them all, while fourteen went
unchecked, and three of its claims were too broad. A date shown in
full carries no age hooks, line anchors follow enable-tree-linenumbers
and cgit.css also styles html.cgit-standalone.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1456483 gated the key and named it under trust-scan-config, but this
section kept the list from before.
|
|
|
|
|
|
|
|
The manual has named the commit page since it was written in 2008, a
year after the index started linking the log instead.
|
|
A readme's links to its own sections, as in a table of contents, had
nothing on the page to land on.
|
|
|
|
Decoding them here instead would mean carrying every named reference
HTML defines, while the browser already knows them all.
|
|
|
|
|
|
The item's second line became a paragraph of its own and the items
after it a new list, so an ordered list started counting again.
|
|
A table written right under a line of text came out as more of the
paragraph, pipes and all.
|
|
GitHub shows a single newline in a markdown file as a space, and roff
fills the lines of a man page the same way, so text wrapped in the
source came out ragged on the about page.
|
|
A relative image loaded from below the about page, which answers 404
now, and a remote one had every visitor's browser call a third party.
A badge also came out as a link to its own image, wrapped in stray
brackets.
|
|
A browser resolved them against the about page, where nothing lives
now that the page answers 404 below itself. They resolve the way
GitHub resolves a readme's links instead, from the readme's directory
and on the branch it was read from.
|
|
The heading pattern backtracked over a run of spaces in cubic time and
the cell trim in quadratic time, so one crafted line in a readme could
hold a request for half an hour, well inside the size cap. The heading
rule now also keeps a sharp that ends a word, as in "# C#".
|
|
With nothing below the about page, a readme's relative links have to be
written against the tree, and only cgit knows how this site spells the
url of a tree page and which ref the readme was read from. Both reach
the filter already escaped for a url, built by the same writer as
cgit's own links.
|
|
The about page served every file beside the readme as a page of its
own, through the about filter, and answered 200 for directories and
missing files alike. Images it passed through came from the root of the
default branch whatever the readme's own directory and ref. A readme on
disk exposed its whole directory this way.
|
|
The hook forced a 022 umask, so in a repository shared with a group the
first pusher owned info/web and every other member's push failed to
write the age file there.
|
|
Only the exit status was hidden, so a pusher without write access to
the cache root saw a permission error per cached page, against what
the hook's own comment promised.
|
|
The trim pattern backtracked over a run of spaces inside an address,
which a commit can carry, and a log page runs the filter for every row.
Forty thousand spaces took two seconds per row.
|
|
A repos file the filter could not open read as listing nothing, so a
permission slip or a mistyped path made every protected repository
public. A line naming a repository with no groups was skipped the same
way, where auth-inline's empty list denies everyone.
|
|
|
|
|
|
Five copies of the test and four of the error page had to agree by
hand. The new check pins the four refusals, which no test covered.
|
|
With these and the two changes before them, cgit builds under git's
DEVELOPER=1 settings, which also annotate their own callbacks this way.
|
|
ISO C has no conversion between a function pointer and void *, so the
callbacks handed through git's data pointers and the write found by
dlsym stopped the pedantic half of a DEVELOPER=1 build.
|
|
Git's DEVELOPER=1 build turns on -Wwrite-strings as an error, and the
literals stored through plain char pointers failed cgit's own objects
there. The exec filter's argv takes the cast execvp needs once, the
way git's run-command does.
|
|
|
|
A walk that failed to prepare printed an error page and then went on
to print the statistics page after it, where the log and the feed
return. No request reaches that failure today, since the walk is only
limited by a range or an order the page never asks for.
|
|
xread and xwrite may move fewer bytes than asked. A short write of the
key left a slot that could never match, a short read of it reported a
collision, and a page write that moved nothing looped for ever.
|
|
sendfile returns zero at the end of the file, and the loop only ended
once the offset reached the size recorded when the slot was opened, so
a slot cut shorter in between spun the request forever. Only Linux
builds this path. A stand-in header type checked it here.
|
|
A failed stat logged the directory rather than the entry inside it,
and a project list that failed to read printed strerror of the flag
ferror returns, which names an unrelated error.
|
|
Matching xml anywhere in the type also caught the Office formats, whose
names hold openxmlformats, so a .docx went out with a UTF-8 charset.
|
|
Only a hash in the first column marked a comment, so an indented one
was read as the type "#" for every word after it. The manual already
describes comments by their first non-blank character.
|
|
The dynamic ttl only applied when the url named a branch with h=, so
the log, tree and refs of the default branch, which never carry one,
fell back to cache-summary-ttl. The manual already gives each ttl the
scope the code now uses.
|
|
The guard took local as a name that may carry the -local suffix, but
git reads local only as a whole alias of default-local and dies on
anything after it, so that one value turned every page into a 500.
|
|
The commit and diff pages collect each file's body before printing it,
and a die in git while one was collected wrote the error page into that
body, which was never sent, so the visitor got a page cut off mid table.
|
|
trust-scan-config passed any readme holding a colon as a tracked file,
while the parser takes one only when a path follows the colon, so a
scanned repository could still name a file on disk outside itself. The
two now share one test.
|
|
The field resets at the end of cgit_add_repo cleared the ignore flag
that the empty url branch had just set, so such a repository was
listed on the index and selectable with ?r=, where every link to it
read the byte before its url.
|
|
The generator meta, the footer and the patch signature named the exact
cgit and git versions on every response, which only helps someone
matching a site against an advisory. The shipped server configs
already hide the server's own version for the same reason, and
`cgit --version` still answers on the host.
|
|
Only the login page carried a Cache-Control, so a page an auth filter
had let a visitor see could be kept by a cache shared with the next
visitor. The page also varies on the cookie that got them in.
|