Static analysis for hv_kvp_daemon.c with cppcheck : error: hv_kvp_daemon.c:359:3: error: Common realloc mistake: 'record' nulled but not freed upon failure [memleakOnRealloc] record = realloc(record, sizeof(struct kvp_record) * If realloc() fails, record is now NULL. If we directly assign this NULL to record, the reference to the previously allocated memory is lost. This causes a memory leak because the old allocated memory remains but is no longer accessible. A temporary pointer was utilized when invoking realloc() to prevent the loss of the original allocation in the event of a failure CC: linux-kernel@xxxxxxxxxxxxxxx linux-hyperv@xxxxxxxxxxxxxxx Signed-off-by: Malaya Kumar Rout <malayarout91@xxxxxxxxx> --- tools/hv/hv_kvp_daemon.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/tools/hv/hv_kvp_daemon.c b/tools/hv/hv_kvp_daemon.c index 04ba035d67e9..6807832209f0 100644 --- a/tools/hv/hv_kvp_daemon.c +++ b/tools/hv/hv_kvp_daemon.c @@ -356,11 +356,14 @@ static int kvp_key_add_or_modify(int pool, const __u8 *key, int key_size, */ if (num_records == (ENTRIES_PER_BLOCK * num_blocks)) { /* Need to allocate a larger array for reg entries. */ - record = realloc(record, sizeof(struct kvp_record) * - ENTRIES_PER_BLOCK * (num_blocks + 1)); - - if (record == NULL) + struct kvp_record *temp = realloc(record, sizeof(struct kvp_record) * + ENTRIES_PER_BLOCK * (num_blocks + 1)); + if (!temp) { + free(record); + record = NULL; return 1; + } + record = temp; kvp_file_info[pool].num_blocks++; } -- 2.43.0