Author: tridge Date: 2004-10-25 06:23:28 +0000 (Mon, 25 Oct 2004) New Revision: 3198
WebSVN: http://websvn.samba.org/websvn/changeset.php?rep=samba&path=/branches/SAMBA_4_0/source&rev=3198&nolog=1 Log: check for too many .. components in filenames pvfs now passes RAW-MKDIR Modified: branches/SAMBA_4_0/source/ntvfs/posix/pvfs_resolve.c branches/SAMBA_4_0/source/script/tests/test_posix.sh branches/SAMBA_4_0/source/torture/raw/mkdir.c Changeset: Modified: branches/SAMBA_4_0/source/ntvfs/posix/pvfs_resolve.c =================================================================== --- branches/SAMBA_4_0/source/ntvfs/posix/pvfs_resolve.c 2004-10-25 06:22:29 UTC (rev 3197) +++ branches/SAMBA_4_0/source/ntvfs/posix/pvfs_resolve.c 2004-10-25 06:23:28 UTC (rev 3198) @@ -180,8 +180,9 @@ static NTSTATUS pvfs_unix_path(struct pvfs_state *pvfs, const char *cifs_name, uint_t flags, struct pvfs_filename *name) { - char *ret, *p; + char *ret, *p, *p_start; size_t len; + int num_components=0; name->original_name = talloc_strdup(name, cifs_name); name->stream_name = NULL; @@ -217,6 +218,7 @@ /* now do an in-place conversion of '\' to '/', checking for legal characters */ + p_start = p; while (*p) { size_t c_size; codepoint_t c = next_codepoint(p, &c_size); @@ -228,6 +230,7 @@ return NT_STATUS_ILLEGAL_CHARACTER; } *p = '/'; + num_components++; break; case ':': if (!(flags & PVFS_RESOLVE_STREAMS)) { @@ -252,6 +255,18 @@ case '/': case '|': return NT_STATUS_ILLEGAL_CHARACTER; + case '.': + if (p[1] != '.' || + (p[2] != '\\' && p[2] != 0) || + (p != p_start && p[-1] != '/')) { + break; + } + /* its definately a .. component */ + num_components--; + if (num_components <= 0) { + return NT_STATUS_OBJECT_PATH_SYNTAX_BAD; + } + break; } p += c_size; Modified: branches/SAMBA_4_0/source/script/tests/test_posix.sh =================================================================== --- branches/SAMBA_4_0/source/script/tests/test_posix.sh 2004-10-25 06:22:29 UTC (rev 3197) +++ branches/SAMBA_4_0/source/script/tests/test_posix.sh 2004-10-25 06:23:28 UTC (rev 3198) @@ -30,7 +30,7 @@ tests="BASE-FDPASS BASE-LOCK1 BASE-LOCK2 BASE-LOCK3 BASE-LOCK4" tests="$tests BASE-LOCK5 BASE-LOCK6 BASE-LOCK7 BASE-UNLINK BASE-ATTR" -tests="$tests BASE-NEGNOWAIT BASE-DIR" +tests="$tests BASE-NEGNOWAIT BASE-DIR RAW-MKDIR" tests="$tests BASE-DENY2 BASE-TCON BASE-TCONDEV BASE-RW1" tests="$tests BASE-DENY3 BASE-XCOPY" tests="$tests BASE-DELETE BASE-PROPERTIES BASE-MANGLE" @@ -40,7 +40,7 @@ soon="BASE-DIR1 BASE-DENY1 BASE-VUID BASE-OPEN BASE-DEFER_OPEN BASE-OPENATTR BASE-CHARSET" -soon="$soon RAW-SFILEINFO RAW-SEARCH RAW-OPEN RAW-MKDIR RAW-OPLOCK RAW-NOTIFY RAW-MUX RAW-IOCTL" +soon="$soon RAW-SFILEINFO RAW-SEARCH RAW-OPEN RAW-OPLOCK RAW-NOTIFY RAW-MUX RAW-IOCTL" soon="$soon RAW-CHKPATH RAW-UNLINK RAW-READ RAW-WRITE RAW-RENAME RAW-CLOSE BASE-TRANS2" for t in $tests; do Modified: branches/SAMBA_4_0/source/torture/raw/mkdir.c =================================================================== --- branches/SAMBA_4_0/source/torture/raw/mkdir.c 2004-10-25 06:22:29 UTC (rev 3197) +++ branches/SAMBA_4_0/source/torture/raw/mkdir.c 2004-10-25 06:23:28 UTC (rev 3198) @@ -22,8 +22,8 @@ #define CHECK_STATUS(status, correct) do { \ if (!NT_STATUS_EQUAL(status, correct)) { \ - printf("(%d) Incorrect status %s - should be %s\n", \ - __LINE__, nt_errstr(status), nt_errstr(correct)); \ + printf("(%s) Incorrect status %s - should be %s\n", \ + __location__, nt_errstr(status), nt_errstr(correct)); \ ret = False; \ goto done; \ }} while (0)