diff --git a/modules/db_sqlite/res.c b/modules/db_sqlite/res.c index e6acebf0fc5..039d8bec819 100644 --- a/modules/db_sqlite/res.c +++ b/modules/db_sqlite/res.c @@ -299,29 +299,31 @@ int db_sqlite_realloc_rows(db_res_t* res, const unsigned int rows) struct db_row* res_rows; db_val_t *prev_values; - res->rows = pkg_realloc(RES_ROWS(res),rows * (sizeof(db_row_t))); - memset( res->rows + RES_ROW_N(res), 0 , - (rows - RES_ROW_N(res)) * (sizeof(db_row_t))); + if (RES_ROW_N(res) >= rows) + return 0; - res_rows = res->rows; + res_rows = res->rows = pkg_realloc(RES_ROWS(res),rows * sizeof *res_rows); if (!res_rows) { LM_ERR("no memory left\n"); return -1; } + memset(res_rows + RES_ROW_N(res), 0 , + (rows - RES_ROW_N(res)) * sizeof *res_rows); + prev_values = res_rows[0].values; res_rows[0].values = pkg_realloc(res_rows[0].values, rows * sizeof(db_val_t) * RES_COL_N(res)); - memset( res_rows[0].values + RES_COL_N(res)*RES_ROW_N(res), - 0, (rows - RES_ROW_N(res)) * sizeof(db_val_t) * RES_COL_N(res)); - if (! res_rows[0].values) { LM_ERR("no memory left\n"); res_rows[0].values = prev_values; return -1; } + memset( res_rows[0].values + RES_COL_N(res)*RES_ROW_N(res), + 0, (rows - RES_ROW_N(res)) * sizeof(db_val_t) * RES_COL_N(res)); + /* if the values was relocated, we need to re-point all values to the new block, * otherwise only fix the new ones */ start = (res_rows[0].values == prev_values?RES_ROW_N(res):0); @@ -330,7 +332,7 @@ int db_sqlite_realloc_rows(db_res_t* res, const unsigned int rows) for( i=start ; irows[i].n = RES_COL_N(res); + res_rows[i].n = RES_COL_N(res); } return 0;