| Age | Commit message (Collapse) | Author | Lines |
|
t0104's binary fixture never turns blame on, so neither the blame
page's own refusal nor the missing link on the file's page had a test.
|
|
The defbranch check had a test while its twin for a crafted HEAD,
which the index reads the same way to date a repository, had none.
|
|
Nothing in tests/ read robots.txt, so dropping the trailing slashes
again went unnoticed.
|
|
Only a benign query had been redirected, so nothing showed that a
space, a control byte or a byte past ASCII in the query string is
encoded before it reaches the Location header.
|
|
The plain page's header was the only one fed a newline. A snapshot
asked for with h= keeps the name it was requested under, and a blob
fetched by id takes any path, so both put visitor bytes into
Content-Disposition.
|
|
The title claimed every page, but only the log, commit and atom pages
were asked for. The commit now changes a file, since the patch page
leaves out a commit with nothing to show, and its parent is read
before the printf, where a failed rev-parse would have gone unnoticed.
|
|
The allowlist was tested in two places, and the 404 alone did not show
the transport was live behind the auth filter, since a page that does
not exist answers the same. A loose object and HEAD now have to come
through, and the planted alternates file is removed even when the test
fails, where it used to leave rob borrowing foo's objects.
|
|
Both requests went through the shared page cache, and the clone one
only worked because clone pages are never stored, which is what the
cgitrc_copy comment warns of.
|
|
points-at-tree only ever matched its entry in the branch switcher, and
points-at-tag was never looked for. Every branch also shared one date,
so the age and name sorts gave the same rows, and nothing showed the
name setting had applied. The loose refs written by hand need the
files backend.
|
|
The check read the page the previous test had left, and it took any
hex where the commit goes and only two of the eight conversions.
|
|
Only a lowercase javascript url was tried, so a denylist of that one
spelling would have passed. The quote test also read the page the test
before it had left.
|
|
Only %zz%2 had been sent, so nothing showed that markup in the query,
the hidden inputs a form carries, the errors naming a refused value or
the Host header is escaped on its way back.
|
|
For a bare q=% only the status was checked, so a decoder that dropped
the sign passed.
|
|
No test gave a ref name, a commit or tag message, a note or an ident
any markup, and the one hostile file name never reached an attribute.
html_txt leaves quotes alone, so a name holding both a quote and a
bracket is what tells an attribute written as text.
|
|
Nothing showed that every leading slash goes, through url= or
PATH_INFO, and one left behind joins the virtual root into a
scheme-relative link to another host.
|
|
All three shipped server configs hand cgit the path as PATH_INFO,
already decoded, yet every hostile path in the tests went through url=
instead.
|
|
The name also sits in the breadcrumb and the title, so the test passed
with the source filter never run, and the missing marker proved
nothing. dump.sh echoes its arguments ahead of the body it upper-cases,
which shows the name arrived whole as one argument.
|
|
The links have been written through html_attr since b8adfd6, so with
the percent-encoding dropped a quote came out as an entity the absence
check could not match, and the presence check was met by the file
links above the diff. The test now reads the line links themselves,
for a name holding a hash and a question mark as well.
|
|
Only the commit page was checked, and only for onchange, though a site
policy without unsafe-inline blocks every inline handler on any page.
|
|
The escaped script tag alone matched either readme, so the markdown
page showing the text readme passed.
|
|
The test took any page holding the word top, with no status checked.
The refusal half lives in t0204, so the fixture now says why its limit
is set so low.
|
|
The refusal was read from a page the previous test had left, which
--run could skip, and both requests went through the shared page
cache. The marker is also named apart from the one the filter test
plants, so a failure in one cannot fail the other.
|
|
Only head-content and logo-link were tried, so logo, clone-url and
both module-link forms could have been taken from a repository's own
cgitrc unnoticed. A trusted control shows each value would reach the
page, and the refused disk readmes are now checked against a file that
would show if read.
|
|
No test asserted the Content-Security-Policy header, though it is all
that keeps script in an SVG from running when the plain page serves it
under its own type.
|
|
Every candidate name meets check_refname_format first, which refuses
the old payload, so the slash rule never answered it and could go
unnoticed. A tag holding a slash reaches it, and a name in revision
syntax without a slash now pins the ref name check of its own.
|
|
dash reports a write to a closed pipe as an I/O error and never names
a broken pipe, so where sh is dash the test passed with the reset
removed. The writer now leaves a marker when it outlives the closed
pipe, which it can only do with the signal ignored. That holds under
dash, bash and ksh.
|
|
The posted body was 22 bytes, so an unclamped read stopped at its end
and nothing overflowed, and the test could not fail. The filter now
counts what it was handed from a body larger than the buffer.
|
|
The unedited copy and the login page were requested through cgit_rc,
so a page cut short or an error logged on the way passed. The owner and
description checks on the login page could not fail either if the
config lost them, so the same config with a filter that lets the
visitor in now has to show both.
|
|
With no standalone Lua on the path the unit checks were never
registered, so they counted as neither run nor skipped, and t0505
passed on its cgit checks alone.
|
|
|
|
No hook ran the way git runs it, so the shebang, the executable bit,
GIT_DIR, the refs on stdin and the remote: lines a pusher sees were all
untested.
|
|
The header says a git too old for the options leaves the graph as it
was and the hook stays silent, but every run had a git that could
write it.
|
|
Only sh, dash, ksh and bash were tried, so busybox sh ran only where it
is /bin/sh, and mksh, yash, posh and zsh's sh mode never ran. Where sh
is a link to dash, the same shell ran twice. A shell reached by two
names now runs once, and the list is said so a run shows what it
covered.
|
|
README tells a visitor to write a plus in the query form as %2b, and
cgit caches such a page under the raw query, but the hook compared that
query with the url as it stands. A push to foo+bar.git left its pages
under url=foo%2bbar.git/ and r=foo%2Bbar.git cached and stale until
their ttl ran out. Decoding in sh would take more than the hook is
worth, so a query with a % or a + now counts as stale, which costs
another repository's page at most a refill.
|
|
No page asked for with r= was cached, no slot held a head that does not
parse as cgit's, and the hook never met a cache root that was missing,
so ignoring r=, keeping an unreadable slot, or complaining without a
cache all passed.
|
|
|
|
run_action repeated harness.run line for line, and three comments only
labelled the sections below them.
|
|
Both say a change to the code they share belongs in both, but nothing
held them to it, so a fix made to one alone in a path the unit checks
do not reach would have gone unseen.
|
|
The fake HMAC returned 16 bytes, so the checks signed with signatures
half the real length, and a signature cut short passed. tohex's output
was never pinned either, so dropping its zero padding stayed
consistent with itself and passed.
|
|
A cookie_path other than / has to keep Secure but drop the __Host-
name, which a browser takes only for the whole host. Neither was
tried.
|
|
An expired session was only tried against validate_value, never sent
through a visit, and nothing sent a session under the plain cookie
name, which a sibling subdomain can set where it cannot set the
__Host- one.
|
|
The checks that a forged session is not taken for a signed-in visitor,
and that https brings no warning, would also have passed on the page
saying logins are unavailable.
|
|
crypt(3) answers nil for a kind of hash the system does not check, but
the stand-in never did, so a login that raised on it, or let it
through, passed.
|
|
The check was a negated test_cmp, which also passes when either file
is missing, and a changed chain does not prove the new layer was
written. The chain's last line now has to name a graph file that
exists and was not in the chain before the push.
|
|
scan-path finds such a repository by its .git and serves it at the
work tree's path, so the hook has to strip the /.git it runs in. Only
bare repositories were tried, and a hook that kept it passed.
|
|
Nothing ran the hook against a cache filled with remove-suffix=1, so
a hook that kept the .git on the url, and so dropped none of the pages
cgit had cached under the shorter one, passed.
|
|
The hook exists to feed the idle column, but nothing had cgit read an
age file, so a hook writing a date cgit cannot parse, or one at a path
cgit no longer reads, passed.
|
|
The header said a file the pusher cannot write stays as it was, but the
hook replaces it through mv, which needs only the directory, and with
stdin not a terminal mv does so without asking. That is the useful
behaviour, so the header now says so, and a test holds the hook to it.
Only a directory the pusher cannot write keeps the old file, which was
the one case tested.
|
|
A repository with no branches is meant to keep the date cgit already
had, and the hook writes through a temporary file that must not be
left beside the real one. Neither was checked.
|
|
No hook ran under a restrictive umask, so dropping the forced umask 022
passed, and the age file and the graph would then be unreadable to the
web server. Git alone writes the graph as -r-------- under umask 077.
core.sharedRepository was only tried as group, so the case folding and
the numeric modes went unchecked.
|