| Age | Commit message (Collapse) | Author | Lines |
|
A reftable repository keeps only a placeholder in its HEAD file, so a
dumb clone was told HEAD named refs/heads/.invalid and checked nothing
out. HEAD is now answered the way git's http-backend answers it.
|
|
cgit_parse_url tested ctx.repo where the loop sets repo_end alongside
it, and the log's closing link kept a commit it never read. Clang's
analyzer tripped on both.
|
|
The row stopped at the error and left its cells open, so the rest of
the listing rendered inside it.
|
|
|
|
The index description was cut at a byte count, which could split a
multibyte character and leave an invalid sequence on the page. Commit
subjects already backed up to the start of the character, so html_ntxt
now does that for every caller.
|
|
The sparse rule put git's SPARSE_FLAGS last, and their -std=gnu99
overrode the gnu17 the sources are built as.
|
|
Neither cgit nor the bundled Git reads the macro it defined.
|
|
A Lua build replaces write, and git can write before cmd_main reaches
cgit_init_filters, as it does when GIT_TRACE2 is set, which called
through a null pointer and crashed every request.
|
|
summary-branches, summary-tags and max-ref-count already listed every
ref at 0, but a negative value reached qsort as a count and crashed the
summary and refs pages, and emptied the branch switcher.
|
|
Each row of a followed log moves ctx.qry.vpath to the name its commit
knew the file by, and the pager built its links from that, so past a
rename both links named the old file and led to an empty page.
|
|
A followed log diffs each commit against its parent to learn whether
the file changed there, and a root commit was skipped rather than
diffed against the empty tree, so a file created in the first commit
never showed that commit.
|
|
Tag links carry the tag name as the head, so on any page reached from
an annotated tag the about tab vanished and the about page redirected
to the summary.
|
|
Links built from the repository url, among them the description link
on the index and the Atom and refs links, wrote it as configured, so a
name holding a space, '#' or '?' broke them. The feed link in the page
head did the same with the branch, which turned a '+' into a space.
|
|
Git 2.55 moved object sizes from unsigned long to size_t. The two are
the same type on 64-bit hosts, but not on a 32-bit one, where GCC 14
rejects the mismatched pointers, so cgit stopped compiling there.
|
|
A script raising anything but a string handed die a null to print, and
a Lua state that could not be created was used anyway once the filter
closed.
|
|
A script's top level runs before cgit hooks stdout for it, and the
unhook html() began with tripped an assert that aborted cgit.
|
|
cgit builds against Lua 5.5 and serves the same pages with it, but a
host whose only Lua was 5.5 got a binary without Lua from the search.
|
|
It was a bare table.list with no name, section or label, the one
listing that broke what the README promises a theme.
|
|
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.
|
|
|
|
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.
|
|
Each class behind cgit's published advisories now has a check against
the current code, from a newline in a file name to shell syntax handed
to a filter. The feed also treated an ident with an empty name and an
empty address as present and wrote an empty person, which Atom forbids.
|
|
A write that failed with EPIPE on an uncached page died into an error
page, which died again at exit when the page could not be sent either,
and git logged a recursion warning on every dropped connection. A
filter that exits early fails a write the same way, so the quiet exit
is kept for writes that reach the client itself.
|
|
Archives, packs and the HEAD file went out as octet-stream or gzip
with a UTF-8 charset on the end, since only the blob page cleared it.
The headers now decide from the type itself, so the two places that
cleared the charset by hand no longer need to.
|
|
The four pages that refuse a blob over max-blob-size each said it in
their own way, two of them in lower case, and the blame page ended its
binary notice with a full stop no other error carries.
|
|
Such a name is refused as a head before git could read it as an
option, and the fallback branch already skips it, so the switcher
offered a choice that led only to an error page.
|
|
A commit whose encoding header names something iconv cannot convert,
or whose text is labelled UTF-8 without being it, reached a page
declared UTF-8 with its bytes untouched. The atom feed already
replaced them, so its UTF-8 reader moves to shared.c and every ident,
subject, message and tag text passes through it.
|
|
With both an id and a path the blob page handed back the raw object
the id named, so a commit id gave the commit text itself, while the
plain page looked the path up in that commit's tree. A tag is peeled
to its commit on the way, and the README example of a pinned commit
now uses a form the request checks accept.
|
|
The hop to the trailing-slash form of the about page, and the hop back
to the summary of a repository without a readme, were built from the
path alone, so a request for the about page of another branch landed
on the default one. The query goes into the Location line as the
client sent it, with any byte a header cannot carry percent-encoded.
|
|
It lists object directories by their path on the server, which a
client fetching over http can neither use nor needs to learn. The
http-alternates file written for such clients still goes out.
|
|
The diff and patch pages honour the path in the url, which the
parameter table documents for every page, but rawdiff never handed it
to git and answered with the whole diff.
|
|
The dumb transport read a pack four kilobytes at a time through stdio
and sent it without a length, so a client could not tell a cut-off
transfer from a complete one.
|