Added filename filter to forkfilter.
authorFredrik Tolf <fredrik@dolda2000.com>
Sun, 2 Mar 2008 00:52:20 +0000 (01:52 +0100)
committerFredrik Tolf <fredrik@dolda2000.com>
Sun, 2 Mar 2008 00:52:20 +0000 (01:52 +0100)
The filter makes sure that no filename passed to the filter contains
slashes or initial dots.

daemon/transfer.c

index 328fb33..d5b03e1 100644 (file)
@@ -605,7 +605,7 @@ static void filterexit(pid_t pid, int status, void *data)
 
 int forkfilter(struct transfer *transfer)
 {
-    char *filtername, *filename, *peerid, *buf;
+    char *filtername, *filename, *peerid, *buf, *p;
     wchar_t *wfilename;
     struct passwd *pwent;
     pid_t pid;
@@ -659,6 +659,12 @@ int forkfilter(struct transfer *transfer)
        peerid = sprintf2("utf8-%s", buf);
        free(buf);
     }
+    for(p = filename; *p; p++) {
+       if(*p == '/')
+           *p = '_';
+       else if((p == filename) && (*p == '.'))
+           *p = '_';
+    }
     if((pid = forksess(transfer->owner, transfer->auth, filterexit, NULL, FD_PIPE, 0, O_WRONLY, &inpipe, FD_PIPE, 1, O_RDONLY, &outpipe, FD_FILE, 2, O_RDWR, "/dev/null", FD_END)) < 0)
     {
        flog(LOG_WARNING, "could not fork session for filter for transfer %i: %s", transfer->id, strerror(errno));