This commit is contained in:
hsn 2003-11-24 17:17:59 +00:00
parent f2feaf1ba6
commit c43984e3cd
5 changed files with 80 additions and 29 deletions

View File

@ -1,4 +1,7 @@
Version NEXT
Version 2.8.1b18 - 24 Nov 24 2003
This is MINIMUM REQUIRED VERSION for applicatins which are using
javafsp library, only download machine atm. javafsp library will
be released shortly as separate package.
PROTOCOL updated. Made rules about breaking directory header on
packet boundary more clear. Previous text was from fspd code comment
and was bad.
@ -10,19 +13,19 @@ Version NEXT
in PROTOCOL
support for MIN_DELAY, MAX_DELAY and DEFAULT_DELAY in source
path parsing moved to separate file server/path.c
new test tool parsecheck
new test tool parsecheck for testing server path parser
reworked parse path: separate error messages for high bit chars,
control chars
do not segfault when parsing password protected files. Looks like
nobody used password protected files for a long time. This means
that in future version of FSP I can change protocol definition
without worry about breaking anything
path with trailing / or starting / is now parsed correctly
MAJOR BUGFIX: path with trailing / or starting / is now parsed correctly
pathes with dot after slash are now detected at parse level (side
effect of prev. fix)
tests moved from server/ into tests/ directory
removed special test case for root directory in path.c -> use more
general alg. instead. This fixed "/" dir.
parsecheck turned into test suite with hard coded test results
parsecheck added to 'make check'
support for multiple \n in filename - in future there will be
used for symlinks.
Version 2.8.1b17 -- 17 Nov 2003
Allow filenames with spaces inside

8
TODO
View File

@ -13,8 +13,6 @@ password change command
TESTING NEEDED:
Write a simple FSP protocol testing tool
Write a test suite using testing tool
test if ending slashes do not confuse directory engine
test for /../ root escapes
test for remote buffer overflows
Test new command rename /when implemented/
Test if >2GB files but <4GB works correctly with and without --disable-largefile
@ -89,9 +87,9 @@ separate manpage for 7 fsp (protocol definition) == write FSP RFC
libraries and support for FSP protocol
======================================
DONE: FSP library for Java
new small,light fsplib for C.
FSP plugin do Netscape/MSIE
FSP library for Java
Transfer HTTP over fsp transport
FSP backend for APT
FSP plugin do Netscape/MSIE
Transfer HTTP over fsp transport
FSP support to lftp,wget,curl

View File

@ -37,6 +37,7 @@
const char *parse_path PROTO3(char *, fullp, unsigned int, len, PPATH *, pp)
{
char *s;
char *p;
int state;
if(len < 1) return("Path must have non-zero length");
@ -46,13 +47,19 @@ const char *parse_path PROTO3(char *, fullp, unsigned int, len, PPATH *, pp)
pp->d_len = 0;
for(s = pp->fullp = pp->f_ptr = pp->d_ptr = fullp, state = 0; *s; s++)
for(
s = pp->fullp = pp->f_ptr = pp->d_ptr = fullp, state = 0;
*s;
s++
)
{
if(*s == '\n')
{
pp->passwd = s+1;
p=strrchr(pp->fullp,'\n');
pp->passwd = p+1;
*p = '\0';
*s = '\0';
if(dbug) fprintf(stderr,"parse_path: found password field %s\n", s+1);
if(dbug) fprintf(stderr,"parse_path: found password field %s\n", p+1);
break;
}
else

View File

@ -4,4 +4,4 @@ extra_DIST=mklargefile.py
cachecheck_SOURCES=../server/fifocache.c cachecheck.c
parsecheck_SOURCES=parsecheck.c ../server/path.c
TESTS=parsecheck

View File

@ -9,11 +9,26 @@
#endif
#include "my-string.h"
int dbug=0;
int dbug=1;
const char *testcases[]={ "", ".","filename","/filename","//filename","//dirname/filename","//dirname//filename","dirname//dir3name//","filename\npasswd",
"file/.dir","directory.ext/filename.","/",
const char *testcases[]={
"", ".","/",
"filename","/filename","//filename",
"dirname/filename","//dirname/filename","//dirname//filename",
"dir1name/dir2name/","//dir1name//dir2name//",
"filename\npasswd","filename\nsymlink\npasswd",
"file/.dir","../updir","file/../dir",
NULL};
PPATH testresults[]={
{".",".",1,".",1,NULL}, {NULL}, {".",".",1,".",1,NULL},
{"filename","filename",8,".",1,NULL} , {"filename","filename",8,".",1,NULL} , {"filename","filename",8,".",1,NULL},
{"dirname/filename","filename",8,"dirname",7,NULL} , {"dirname/filename","filename",8,"dirname",7,NULL} , {"dirname//filename","filename",8,"dirname",7,NULL},
{"dir1name/dir2name/",".",1,"dir1name/dir2name",17}, {"dir1name//dir2name//",".",1,"dir1name//dir2name",18},
{"filename","filename",8,".",1,"passwd"}, {"filename","filename",8,".",1,"passwd"},
{NULL},{NULL},{NULL},
};
static void print_path(PPATH *pp)
{
@ -29,8 +44,27 @@ static void print_path(PPATH *pp)
printf("passwd: %s",pp->passwd);
}
static void runtestcase(void)
/* returns: 0 okay, 1 different */
static int compareresults(PPATH *p1,PPATH *p2)
{
if(p1->fullp==NULL && p2->fullp==NULL) return 0;
if(p1->fullp==NULL || p2->fullp==NULL) return -1;
if(strcmp(p1->fullp,p2->fullp)) return -1;
if(p1->f_len!=p2->f_len) return -1;
if(strcmp(p1->f_ptr,p2->f_ptr)) return -1;
if(p1->d_len!=p2->d_len) return -1;
if(strncmp(p1->d_ptr,p2->d_ptr,p1->d_len)) return -1;
if(p1->passwd==NULL && p2->passwd==NULL)
return 0;
if(p1->passwd==NULL || p2->passwd==NULL) return -1;
if(strcmp(p1->passwd,p2->passwd)) return -1;
return 0;
}
static int runtestcase(void)
{
int rc=0;
int i=0;
PPATH pp;
const char *err;
@ -39,24 +73,33 @@ static void runtestcase(void)
for(;testcases[i];i++)
{
test=strdup(testcases[i]);
pp.fullp=NULL;
err=parse_path(test,strlen(test)+1,&pp);
printf("parsing: '%s'",test);
if(err)
{
printf(" err: %s\n",err);
free(test);
continue;
printf(" parse err: '%s'. ",err);
pp.fullp=NULL;
} else
printf(" okay.\n");
printf(" parsed okay. ");
if(compareresults(&pp,&testresults[i]))
{
printf("!!!TEST FAILED!!!\a\n");
rc=1;
} else
printf(" Test passed.\n");
if(!err)
{
printf(" ");
print_path(&pp);
printf("\n");
}
free(test);
}
return rc;
}
int main(int argc,const char *argv[])
{
runtestcase();
return 0;
return runtestcase();
}