This patch adds some extra paranoia to the git-daemon filename test. In particular, it now rejects pathnames containing // or ending with /; it also adds a redundant test for pathname absoluteness (belts and suspenders.)
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Extra paranoia about non-canonical pathnames
--- commit a22f643931e48a319a70af7e91f809648160ecbf tree 9d6934089c2628253d0690efde3fa7f36a1a8861 parent 4aaa702794447d9b281dd22fe532fd61e02434e1 author Peter Anvin <hpa@tazenda.sc.orionmulti.com> Tue, 18 Oct 2005 13:51:45 -0700 committer Peter Anvin <hpa@tazenda.sc.orionmulti.com> Tue, 18 Oct 2005 13:51:45 -0700
daemon.c | 16 ++++++++++++---- 1 files changed, 12 insertions(+), 4 deletions(-)
Show changes to daemon.c +12 −4
diff --git a/daemon.c b/daemon.c --- a/daemon.c +++ b/daemon.c @@ -80,17 +80,25 @@ static int path_ok(const char *dir) { const char *p = dir; char **pp; - int sl = 1, ndot = 0; + int sl, ndot; + + /* The pathname here should be an absolute path. */ + if ( *p++ != '/' ) + return 0; + + sl = 1; ndot = 0; for (;;) { if ( *p == '.' ) { ndot++; } else if ( *p == '/' || *p == '\0' ) { - if ( sl && ndot > 0 && ndot < 3 ) - return 0; /* . or .. in path */ + if ( sl && ndot < 3 ) /* Refuse "", "." or ".." */ + return 0; sl = 1; + + /* If this was end of string, we passed all tests */ if ( *p == '\0' ) - break; /* End of string and all is good */ + break; } else { sl = ndot = 0; }