/**
  * layout_leb_in_gaps - layout index nodes using in-the-gaps method.
  * @c: UBIFS file-system description object
- * @p: return LEB number here
+ * @p: return LEB number in @c->gap_lebs[p]
  *
  * This function lays out new index nodes for dirty znodes using in-the-gaps
  * method of TNC commit.
  * This function returns the number of index nodes written into the gaps, or a
  * negative error code on failure.
  */
-static int layout_leb_in_gaps(struct ubifs_info *c, int *p)
+static int layout_leb_in_gaps(struct ubifs_info *c, int p)
 {
        struct ubifs_scan_leb *sleb;
        struct ubifs_scan_node *snod;
                 * filled, however we do not check there at present.
                 */
                return lnum; /* Error code */
-       *p = lnum;
+       c->gap_lebs[p] = lnum;
        dbg_gc("LEB %d", lnum);
        /*
         * Scan the index LEB.  We use the generic scan for this even though
  */
 static int layout_in_gaps(struct ubifs_info *c, int cnt)
 {
-       int err, leb_needed_cnt, written, *p;
+       int err, leb_needed_cnt, written, p = 0, old_idx_lebs, *gap_lebs;
 
        dbg_gc("%d znodes to write", cnt);
 
        if (!c->gap_lebs)
                return -ENOMEM;
 
-       p = c->gap_lebs;
+       old_idx_lebs = c->lst.idx_lebs;
        do {
-               ubifs_assert(c, p < c->gap_lebs + c->lst.idx_lebs);
+               ubifs_assert(c, p < c->lst.idx_lebs);
                written = layout_leb_in_gaps(c, p);
                if (written < 0) {
                        err = written;
                leb_needed_cnt = get_leb_cnt(c, cnt);
                dbg_gc("%d znodes remaining, need %d LEBs, have %d", cnt,
                       leb_needed_cnt, c->ileb_cnt);
+               /*
+                * Dynamically change the size of @c->gap_lebs to prevent
+                * oob, because @c->lst.idx_lebs could be increased by
+                * function @get_idx_gc_leb (called by layout_leb_in_gaps->
+                * ubifs_find_dirty_idx_leb) during loop. Only enlarge
+                * @c->gap_lebs when needed.
+                *
+                */
+               if (leb_needed_cnt > c->ileb_cnt && p >= old_idx_lebs &&
+                   old_idx_lebs < c->lst.idx_lebs) {
+                       old_idx_lebs = c->lst.idx_lebs;
+                       gap_lebs = krealloc(c->gap_lebs, sizeof(int) *
+                                              (old_idx_lebs + 1), GFP_NOFS);
+                       if (!gap_lebs) {
+                               kfree(c->gap_lebs);
+                               c->gap_lebs = NULL;
+                               return -ENOMEM;
+                       }
+                       c->gap_lebs = gap_lebs;
+               }
        } while (leb_needed_cnt > c->ileb_cnt);
 
-       *p = -1;
+       c->gap_lebs[p] = -1;
        return 0;
 }