]> git.lizzy.rs Git - plan9front.git/commitdiff
upas/fs: fix infinite loop in putcache (again)
authorAlex Musolino <alex@musolino.id.au>
Sun, 30 Dec 2018 13:30:09 +0000 (00:00 +1030)
committerAlex Musolino <alex@musolino.id.au>
Sun, 30 Dec 2018 13:30:09 +0000 (00:00 +1030)
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.

sys/src/cmd/upas/fs/cache.c
sys/src/cmd/upas/fs/dat.h
sys/src/cmd/upas/fs/mbox.c

index 8fe7f3dde9b409bcd5df87e54cc81e99a27e9a4f..f7442e80c3bb872fe3b4c49af89c31056e92c154 100644 (file)
@@ -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);
        }
 }
 
index d25656b0c01060619e585b032a7c6143ad13624c..67f11bb982496e24e540694a6662c5adde0c5c70 100644 (file)
@@ -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);
index b83014ec00ff89094fee82256c9f70c0db79ebf2..044c4b09178b0b224e545ba394012376dd2cc85d 100644 (file)
@@ -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);