]> source.dussan.org Git - rspamd.git/commitdiff
[Fix] Fix poor man allocator algorithm
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 9 Jul 2020 11:40:43 +0000 (12:40 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Thu, 9 Jul 2020 12:15:27 +0000 (13:15 +0100)
contrib/lua-lpeg/lpvm.c

index 6058bf5b1e205544791ff2b2098b3cb599683bf5..e107292e290c49ff9c25f2f28a55e19b3a5337e6 100644 (file)
@@ -32,7 +32,7 @@ struct poor_slab {
 };
 
 /* Used to optimize pages allocation */
-struct poor_slab slabs;
+RSPAMD_ALIGNED (64) struct poor_slab slabs;
 
 static uint64_t xorshifto_seed[2] = {0xdeadbabe, 0xdeadbeef};
 
@@ -64,7 +64,7 @@ lpeg_allocate_mem_low (size_t sz)
        uint64_t s1 = xorshifto_seed[1];
 
        s1 ^= s0;
-       xorshifto_seed[0] = xoroshiro_rotl(s0, 55) ^ s1 ^ (s1 << 14);
+       xorshifto_seed[0] = xoroshiro_rotl (s0, 55) ^ s1 ^ (s1 << 14);
        xorshifto_seed[1] = xoroshiro_rotl (s1, 36);
        flags |= MAP_FIXED;
        /* Get 46 bits */
@@ -77,7 +77,7 @@ lpeg_allocate_mem_low (size_t sz)
        memcpy (cp, &sz, sizeof (sz));
 
        for (unsigned i = 0; i < MAX_PIECES; i ++) {
-               if (slabs.pieces[i].sz == 0) {
+               if (slabs.pieces[i].occupied == 0) {
                        /* Store piece */
                        slabs.pieces[i].sz = sz;
                        slabs.pieces[i].ptr = cp;
@@ -90,7 +90,7 @@ lpeg_allocate_mem_low (size_t sz)
        /* Not enough free pieces, pop some */
        unsigned sel = ((uintptr_t)cp) & ((MAX_PIECES * 2) - 1);
        /* Here we free memory in fact */
-       munmap (slabs.pieces[sel].ptr, slabs.pieces[sel].sz);
+       munmap (slabs.pieces[sel].ptr, slabs.pieces[sel].sz + sizeof (sz));
        slabs.pieces[sel].sz = sz;
        slabs.pieces[sel].ptr = cp;
        slabs.pieces[sel].occupied = 1;