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 <sivertb@stud.ntnu.no> --- 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