Added the necessary statements so that the mount procedure gracefully 
terminates in case the program runs out of memory.

Signed-off-by: Sotirios-Efstathios Maneas <sman...@cs.toronto.edu>
---
 fsck/mount.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++--------------
 1 file changed, 58 insertions(+), 18 deletions(-)

diff --git a/fsck/mount.c b/fsck/mount.c
index 861e5fb..0036e6f 100644
--- a/fsck/mount.c
+++ b/fsck/mount.c
@@ -1299,20 +1299,26 @@ int build_sit_info(struct f2fs_sb_info *sbi)
        unsigned int bitmap_size;
 
        sit_i = malloc(sizeof(struct sit_info));
-       if (!sit_i)
+       if (!sit_i) {
+               MSG(1, "\tError: Malloc failed for build_sit_info!\n");
                return -ENOMEM;
+       }
 
        SM_I(sbi)->sit_info = sit_i;
 
        sit_i->sentries = calloc(TOTAL_SEGS(sbi) * sizeof(struct seg_entry), 1);
-       if (!sit_i->sentries)
-               return -ENOMEM;
+       if (!sit_i->sentries) {
+               MSG(1, "\tError: Calloc failed for build_sit_info!\n");
+               goto free_sit_info;
+       }
 
        for (start = 0; start < TOTAL_SEGS(sbi); start++) {
                sit_i->sentries[start].cur_valid_map
                        = calloc(SIT_VBLOCK_MAP_SIZE, 1);
-               if (!sit_i->sentries[start].cur_valid_map)
-                       return -ENOMEM;
+               if (!sit_i->sentries[start].cur_valid_map) {
+                       MSG(1, "\tError: Calloc failed for build_sit_info!!\n");
+                       goto free_validity_maps;
+               }
        }
 
        sit_segs = get_sb(segment_count_sit) >> 1;
@@ -1320,6 +1326,10 @@ int build_sit_info(struct f2fs_sb_info *sbi)
        src_bitmap = __bitmap_ptr(sbi, SIT_BITMAP);
 
        dst_bitmap = malloc(bitmap_size);
+       if (!dst_bitmap) {
+               MSG(1, "\tError: Malloc failed for build_sit_info!!\n");
+               goto free_validity_maps;
+       }
        memcpy(dst_bitmap, src_bitmap, bitmap_size);
 
        sit_i->sit_base_addr = get_sb(sit_blkaddr);
@@ -1331,6 +1341,16 @@ int build_sit_info(struct f2fs_sb_info *sbi)
        sit_i->sents_per_block = SIT_ENTRY_PER_BLOCK;
        sit_i->elapsed_time = get_cp(elapsed_time);
        return 0;
+
+free_validity_maps:
+       for (--start ; start >= 0; --start)
+               free(sit_i->sentries[start].cur_valid_map);
+       free(sit_i->sentries);
+
+free_sit_info:
+       free(sit_i);
+
+       return -ENOMEM;
 }
 
 void reset_curseg(struct f2fs_sb_info *sbi, int type)
@@ -1504,7 +1524,7 @@ static void restore_curseg_summaries(struct f2fs_sb_info 
*sbi)
                read_normal_summaries(sbi, type);
 }
 
-static void build_curseg(struct f2fs_sb_info *sbi)
+static int build_curseg(struct f2fs_sb_info *sbi)
 {
        struct f2fs_checkpoint *cp = F2FS_CKPT(sbi);
        struct curseg_info *array;
@@ -1513,13 +1533,20 @@ static void build_curseg(struct f2fs_sb_info *sbi)
        int i;
 
        array = malloc(sizeof(*array) * NR_CURSEG_TYPE);
-       ASSERT(array);
+       if (!array) {
+               MSG(1, "\tError: Malloc failed for build_curseg!\n");
+               return -ENOMEM;
+       }
 
        SM_I(sbi)->curseg_array = array;
 
        for (i = 0; i < NR_CURSEG_TYPE; i++) {
                array[i].sum_blk = malloc(PAGE_CACHE_SIZE);
-               ASSERT(array[i].sum_blk);
+               if (!array[i].sum_blk) {
+                       MSG(1, "\tError: Malloc failed for build_curseg!!\n");
+                       goto seg_cleanup;
+               }
+
                if (i <= CURSEG_COLD_DATA) {
                        blk_off = get_cp(cur_data_blkoff[i]);
                        segno = get_cp(cur_data_segno[i]);
@@ -1538,6 +1565,14 @@ static void build_curseg(struct f2fs_sb_info *sbi)
                array[i].alloc_type = cp->alloc_type[i];
        }
        restore_curseg_summaries(sbi);
+       return 0;
+
+seg_cleanup:
+       for(--i ; i >=0; --i)
+               free(array[i].sum_blk);
+       free(array);
+
+       return -ENOMEM;
 }
 
 static inline void check_seg_range(struct f2fs_sb_info *sbi, unsigned int 
segno)
@@ -1823,7 +1858,7 @@ void get_node_info(struct f2fs_sb_info *sbi, nid_t nid, 
struct node_info *ni)
        node_info_from_raw_nat(ni, &raw_nat);
 }
 
-void build_sit_entries(struct f2fs_sb_info *sbi)
+static int build_sit_entries(struct f2fs_sb_info *sbi)
 {
        struct sit_info *sit_i = SIT_I(sbi);
        struct curseg_info *curseg = CURSEG_I(sbi, CURSEG_COLD_DATA);
@@ -1834,7 +1869,11 @@ void build_sit_entries(struct f2fs_sb_info *sbi)
        unsigned int i, segno;
 
        sit_blk = calloc(BLOCK_SZ, 1);
-       ASSERT(sit_blk);
+       if (!sit_blk) {
+               MSG(1, "\tError: Calloc failed for build_sit_entries!\n");
+               return -ENOMEM;
+       }
+
        for (segno = 0; segno < TOTAL_SEGS(sbi); segno++) {
                se = &sit_i->sentries[segno];
 
@@ -1854,18 +1893,20 @@ void build_sit_entries(struct f2fs_sb_info *sbi)
                check_block_count(sbi, segno, &sit);
                seg_info_from_raw_sit(se, &sit);
        }
-
+       return 0;
 }
 
-int build_segment_manager(struct f2fs_sb_info *sbi)
+static int build_segment_manager(struct f2fs_sb_info *sbi)
 {
        struct f2fs_super_block *sb = F2FS_RAW_SUPER(sbi);
        struct f2fs_checkpoint *cp = F2FS_CKPT(sbi);
        struct f2fs_sm_info *sm_info;
 
        sm_info = malloc(sizeof(struct f2fs_sm_info));
-       if (!sm_info)
+       if (!sm_info) {
+               MSG(1, "\tError: Malloc failed for build_segment_manager!\n");
                return -ENOMEM;
+       }
 
        /* init sm info */
        sbi->sm_info = sm_info;
@@ -1877,11 +1918,10 @@ int build_segment_manager(struct f2fs_sb_info *sbi)
        sm_info->main_segments = get_sb(segment_count_main);
        sm_info->ssa_blkaddr = get_sb(ssa_blkaddr);
 
-       build_sit_info(sbi);
-
-       build_curseg(sbi);
-
-       build_sit_entries(sbi);
+       if (build_sit_info(sbi) || build_curseg(sbi) || build_sit_entries(sbi)) 
{
+               free(sm_info);
+               return -ENOMEM;
+       }
 
        return 0;
 }
-- 
2.10.1

Kind regards,
Stathis Maneas



_______________________________________________
Linux-f2fs-devel mailing list
Linux-f2fs-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/linux-f2fs-devel

Reply via email to