The not so well tested freeing code turned out to have a few subtle yet
very dangerous bugs. They should now be sorted out, preventing the
database from going corrupt everytime you reuse an old inode.

Signed-off-by: Sivert Berg <[email protected]>
---
 lib/libalpm/be_packed.h |   12 ++++++------
 1 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/lib/libalpm/be_packed.h b/lib/libalpm/be_packed.h
index e118a3a..b2654c7 100644
--- a/lib/libalpm/be_packed.h
+++ b/lib/libalpm/be_packed.h
@@ -195,7 +195,7 @@ int _pack_bitmap_free(group_desc_t *group, int n)
        int i = n / 32;
        int j = n % 32;
 
-       group->bitmap[i] &= ~(i << j);
+       group->bitmap[i] &= ~(1 << j);
        return 0;
 }
 
@@ -217,7 +217,7 @@ int _pack_get_free_block(pack_db_t *db)
                        group->blocks_free--;
                        ret = _pack_check_bitmap(group);
                        ret += i * BLOCKS_PER_GROUP;
-                       return ret;;
+                       return ret;
                }
        }
 
@@ -238,7 +238,7 @@ int _pack_block_free(pack_db_t *db, int block)
        int g, b;
 
        g = block / BLOCKS_PER_GROUP;
-       b = block & BLOCKS_PER_GROUP;
+       b = block % BLOCKS_PER_GROUP;
 
        group = _pack_get_group(db, g);
   group->blocks_free++;
@@ -299,6 +299,7 @@ int _pack_inode_free(pack_db_t *db, int in)
 
        block = inode->block[6];
        blocks = _pack_get_block(db, block);
+       inode->block[6] = -1;
 
        while(blocks != NULL) {
                for (i = 0; i < size; i++) {
@@ -526,9 +527,8 @@ int _pack_file_puts(pack_db_t *db, pack_file_t *file,
 {
        size_t i;
        size_t b_pos = file->pos % BLOCK_SIZE;
-       char *dest = _pack_get_block(db,
-                       _pack_inode_add_block(db, file->inode, file->pos / 
BLOCK_SIZE));
-       int block;
+       int block = _pack_inode_add_block(db, file->inode, file->pos / 
BLOCK_SIZE);
+       char *dest = _pack_get_block(db, block);
 
        for (i = 0; i < size; i++, file->pos++, b_pos++)
        {
-- 
1.6.0.5

_______________________________________________
pacman-dev mailing list
[email protected]
http://archlinux.org/mailman/listinfo/pacman-dev

Reply via email to