From patchwork Fri Aug 21 03:10:12 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Byongho Lee X-Patchwork-Id: 7047731 Return-Path: X-Original-To: patchwork-linux-btrfs@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 4DA459F372 for ; Fri, 21 Aug 2015 03:10:47 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id E868E2058E for ; Fri, 21 Aug 2015 03:10:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id EFD0B20585 for ; Fri, 21 Aug 2015 03:10:44 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751434AbbHUDKZ (ORCPT ); Thu, 20 Aug 2015 23:10:25 -0400 Received: from mail-pd0-f182.google.com ([209.85.192.182]:36511 "EHLO mail-pd0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750946AbbHUDKZ (ORCPT ); Thu, 20 Aug 2015 23:10:25 -0400 Received: by pdbmi9 with SMTP id mi9so21199586pdb.3 for ; Thu, 20 Aug 2015 20:10:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:date:message-id; bh=9OWZs9o9/a9CqoTWMDpythnPqWkuVMgyvAlZaPHRzZM=; b=quQPwXj6/+hxudhv/UdSJGS2phsN/5KiQXzAyrhwc9yYNWswpCCN6EX3wBW0To3KR1 RWM/TIzAUT/B3TxFqdXjy0NE6YWJXTFswZ8ZSoJdhSxRbgWhDzyZSYSWoMPWWlCvpoRO JtTT3aTpVqKKqGauj6u2OTojIBaCMkpvj41KWJKCmiLb/WrEtxDkYYUX0jkpnhmrTikz Y/JqxfYUycg9c9d3/y1j6xno7ZC0l3oZ6yElstWlAn2QufQ+WYVgXw+Nd1T0VmgZDyd3 mMPnPyS1dpxB+ItRBZjyIMyCD+DcwWZ0I9EmlcgMqShHJ/8e7nDkLzAdWRZ8t+X2fzPJ yuPQ== X-Received: by 10.70.88.40 with SMTP id bd8mr12872859pdb.135.1440126624485; Thu, 20 Aug 2015 20:10:24 -0700 (PDT) Received: from arch-nb.localdomain ([211.106.186.1]) by smtp.gmail.com with ESMTPSA id qn6sm5867979pbc.22.2015.08.20.20.10.21 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 20 Aug 2015 20:10:22 -0700 (PDT) From: Byongho Lee To: linux-btrfs@vger.kernel.org Subject: [PATCH] btrfs-progs: fix memory leaks in error path Date: Fri, 21 Aug 2015 12:10:12 +0900 Message-Id: <1440126612-53381-1-git-send-email-bhlee.kernel@gmail.com> X-Mailer: git-send-email 2.5.0 Sender: linux-btrfs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-btrfs@vger.kernel.org X-Spam-Status: No, score=-7.4 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This patch includes below fixes in error path: 1. fix memory leaks if realloc() fails 2. add missing call free_history() before return error in scrub_read_file() Signed-off-by: Byongho Lee --- btrfs-list.c | 8 ++++++++ cmds-scrub.c | 18 ++++++++++++++---- qgroup.c | 8 ++++++++ 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/btrfs-list.c b/btrfs-list.c index 875a89dc4ef0..d54de61aec01 100644 --- a/btrfs-list.c +++ b/btrfs-list.c @@ -254,11 +254,15 @@ static int btrfs_list_setup_comparer(struct btrfs_list_comparer_set **comp_set, BUG_ON(set->ncomps > set->total); if (set->ncomps == set->total) { + void *tmp; + size = set->total + BTRFS_LIST_NCOMPS_INCREASE; size = sizeof(*set) + size * sizeof(struct btrfs_list_comparer); + tmp = set; set = realloc(set, size); if (!set) { fprintf(stderr, "memory allocation failed\n"); + free(tmp); exit(1); } @@ -1232,11 +1236,15 @@ int btrfs_list_setup_filter(struct btrfs_list_filter_set **filter_set, BUG_ON(set->nfilters > set->total); if (set->nfilters == set->total) { + void *tmp; + size = set->total + BTRFS_LIST_NFILTERS_INCREASE; size = sizeof(*set) + size * sizeof(struct btrfs_list_filter); + tmp = set; set = realloc(set, size); if (!set) { fprintf(stderr, "memory allocation failed\n"); + free(tmp); exit(1); } diff --git a/cmds-scrub.c b/cmds-scrub.c index 5a85dc473c94..91cf67841849 100644 --- a/cmds-scrub.c +++ b/cmds-scrub.c @@ -502,12 +502,16 @@ again: } return p; } - if (avail == -1) + if (avail == -1) { + free_history(p); return ERR_PTR(-errno); + } avail += old_avail; i = 0; while (i < avail) { + void *tmp; + switch (state) { case 0: /* start of file */ ret = scrub_kvread(&i, @@ -534,11 +538,17 @@ again: continue; } ++curr; + tmp = p; p = realloc(p, (curr + 2) * sizeof(*p)); - if (p) - p[curr] = malloc(sizeof(**p)); - if (!p || !p[curr]) + if (!p) { + free_history(tmp); return ERR_PTR(-errno); + } + p[curr] = malloc(sizeof(**p)); + if (!p[curr]) { + free_history(p); + return ERR_PTR(-errno); + } memset(p[curr], 0, sizeof(**p)); p[curr + 1] = NULL; ++state; diff --git a/qgroup.c b/qgroup.c index dc04b033b145..327abd645f16 100644 --- a/qgroup.c +++ b/qgroup.c @@ -465,12 +465,16 @@ int btrfs_qgroup_setup_comparer(struct btrfs_qgroup_comparer_set **comp_set, BUG_ON(set->ncomps > set->total); if (set->ncomps == set->total) { + void *tmp; + size = set->total + BTRFS_QGROUP_NCOMPS_INCREASE; size = sizeof(*set) + size * sizeof(struct btrfs_qgroup_comparer); + tmp = set; set = realloc(set, size); if (!set) { fprintf(stderr, "memory allocation failed\n"); + free(tmp); exit(1); } @@ -836,12 +840,16 @@ int btrfs_qgroup_setup_filter(struct btrfs_qgroup_filter_set **filter_set, BUG_ON(set->nfilters > set->total); if (set->nfilters == set->total) { + void *tmp; + size = set->total + BTRFS_QGROUP_NFILTERS_INCREASE; size = sizeof(*set) + size * sizeof(struct btrfs_qgroup_filter); + tmp = set; set = realloc(set, size); if (!set) { fprintf(stderr, "memory allocation failed\n"); + free(tmp); exit(1); } memset(&set->filters[set->total], 0,