Package: curlftpfs Severity: important Tags: patch A big leak when cache=no is used (ftpfs-ls.c used cache anyway for file attributes, but the cache was never freed). This leak exhausted system memory e.g. after doing copy and stat() several hundred files one by one. We used cache=no,attr_timeout=0 to completely disable caching - we needed to check file size after it was uploaded.
The patch can be downloaded at http://www.oec.sk/patches Apply the patch against debian package curlftpfs-0.9.2-3. For smooth patching, apply this patch as the last one. The symptoms were first detected on amd64 squeeze, with curlftpfs-0.9.2-3. Thanks Tom Olexa -- System Information: Debian Release: 5.0.4 APT prefers stable APT policy: (500, 'stable') Architecture: i386 (i686) Kernel: Linux 2.6.26-2-xen-686 (SMP w/1 CPU core) Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/bash
diff -ur curlftpfs-0.9.2/cache.c curlftpfs-0.9.2-olexat/cache.c --- curlftpfs-0.9.2/cache.c 2008-04-30 01:03:09.000000000 +0200 +++ curlftpfs-0.9.2-olexat/cache.c 2011-02-04 16:43:05.000000000 +0100 @@ -25,7 +25,7 @@ time_t last_cleaned; }; -static struct cache cache; +struct cache cache; struct node { struct stat stat; diff -ur curlftpfs-0.9.2/ftpfs-ls.c curlftpfs-0.9.2-olexat/ftpfs-ls.c --- curlftpfs-0.9.2/ftpfs-ls.c 2008-04-23 12:55:41.000000000 +0200 +++ curlftpfs-0.9.2-olexat/ftpfs-ls.c 2011-02-07 17:23:37.000000000 +0100 @@ -25,6 +25,19 @@ #include "charset_utils.h" #include "ftpfs-ls.h" +struct cache { + int on; + unsigned stat_timeout; + unsigned dir_timeout; + unsigned link_timeout; + struct fuse_cache_operations *next_oper; + GHashTable *table; + pthread_mutex_t lock; + time_t last_cleaned; +}; + +extern struct cache cache; + static int parse_dir_unix(const char *line, struct stat *sbuf, char *file, @@ -243,8 +256,10 @@ reallink = g_strdup(link); } int linksize = strlen(reallink); - cache_add_link(full_path, reallink, linksize+1); - DEBUG(1, "cache_add_link: %s %s\n", full_path, reallink); + if (cache.on) { + cache_add_link(full_path, reallink, linksize+1); + DEBUG(1, "cache_add_link: %s %s\n", full_path, reallink); + } if (linkbuf && linklen) { if (linksize > linklen) linksize = linklen - 1; strncpy(linkbuf, reallink, linksize); @@ -257,8 +272,10 @@ DEBUG(1, "filler: %s\n", file); filler(h, file, &stat_buf); } else { - DEBUG(1, "cache_add_attr: %s\n", full_path); - cache_add_attr(full_path, &stat_buf); + if (cache.on) { + DEBUG(1, "cache_add_attr: %s\n", full_path); + cache_add_attr(full_path, &stat_buf); + } } DEBUG(2, "comparing %s %s\n", name, file);