summaryrefslogtreecommitdiff
path: root/sys/src/cmd/upas/fs
diff options
context:
space:
mode:
authorAlex Musolino <alex@musolino.id.au>2018-12-31 00:00:09 +1030
committerAlex Musolino <alex@musolino.id.au>2018-12-31 00:00:09 +1030
commit2c6cc121339ade33ac5aa4b46356df1cd5469fbe (patch)
tree1f303eef93d15b674677997a640265663a34c671 /sys/src/cmd/upas/fs
parentf464b7ff16135fc4dddf30291dc5b7226651d2b3 (diff)
upas/fs: fix infinite loop in putcache (again)
The previous attempt to fix this problem (see changesets b32199e0f90a and 00ae79a6ba50) caused all calls to cachefree to free the cached message contents in addition to updating the LRU list. This causes problems for the POP3 driver since it provides no fetch function; once a message is evicted from the LRU cache, its contents is lost. This time we fix cachefree to always update the LRU list but only free the cached message contents if the driver provides a fetch function or the force flag is set.
Diffstat (limited to 'sys/src/cmd/upas/fs')
-rw-r--r--sys/src/cmd/upas/fs/cache.c8
-rw-r--r--sys/src/cmd/upas/fs/dat.h2
-rw-r--r--sys/src/cmd/upas/fs/mbox.c2
3 files changed, 7 insertions, 5 deletions
diff --git a/sys/src/cmd/upas/fs/cache.c b/sys/src/cmd/upas/fs/cache.c
index 8fe7f3dde..f7442e80c 100644
--- a/sys/src/cmd/upas/fs/cache.c
+++ b/sys/src/cmd/upas/fs/cache.c
@@ -35,7 +35,7 @@ notecache(Mailbox *mb, Message *m, long sz)
}
void
-cachefree(Mailbox *mb, Message *m)
+cachefree(Mailbox *mb, Message *m, int force)
{
long i;
Message *s, **ll;
@@ -54,7 +54,9 @@ cachefree(Mailbox *mb, Message *m)
mb->cached -= m->csize;
}
for(s = m->part; s; s = s->next)
- cachefree(mb, s);
+ cachefree(mb, s, force);
+ if(!force && mb->fetch == nil)
+ return;
if(m->mallocd){
free(m->start);
m->mallocd = 0;
@@ -101,7 +103,7 @@ putcache(Mailbox *mb, Message *m)
return;
addlru(mb, mb->lru);
}
- cachefree(mb, mb->lru);
+ cachefree(mb, mb->lru, 0);
}
}
diff --git a/sys/src/cmd/upas/fs/dat.h b/sys/src/cmd/upas/fs/dat.h
index d25656b0c..67f11bb98 100644
--- a/sys/src/cmd/upas/fs/dat.h
+++ b/sys/src/cmd/upas/fs/dat.h
@@ -207,7 +207,7 @@ int insurecache(Mailbox*, Message*);
/**/
void putcache(Mailbox*, Message*); /* asymmetricial */
-void cachefree(Mailbox*, Message*);
+void cachefree(Mailbox*, Message*, int);
char* syncmbox(Mailbox*, int);
void* emalloc(ulong);
diff --git a/sys/src/cmd/upas/fs/mbox.c b/sys/src/cmd/upas/fs/mbox.c
index b83014ec0..044c4b091 100644
--- a/sys/src/cmd/upas/fs/mbox.c
+++ b/sys/src/cmd/upas/fs/mbox.c
@@ -1041,7 +1041,7 @@ delmessage(Mailbox *mb, Message *m)
if(Topmsg(mb, m))
mtreedelete(mb, m);
- cachefree(mb, m);
+ cachefree(mb, m, 1);
idxfree(m);
}
free(m->unixfrom);