From patchwork Fri Nov 17 22:35:40 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aleksei Vetrov X-Patchwork-Id: 80189 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B4DBD3857836 for ; Fri, 17 Nov 2023 22:35:58 +0000 (GMT) X-Original-To: elfutils-devel@sourceware.org Delivered-To: elfutils-devel@sourceware.org Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by sourceware.org (Postfix) with ESMTPS id D52C93858D3C for ; Fri, 17 Nov 2023 22:35:50 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org D52C93858D3C Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=flex--vvvvvv.bounces.google.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org D52C93858D3C Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::114a ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1700260553; cv=none; b=TegQy5HSjv+k+IrE2CWVCxT6oCQmOJBNHMi7JS4hBA5kKP8B1wDcCAhLt2WznPtLcIc6qkTtK8efstWyBG3WvWj4ox3FRwnJP54yPZ3k7QUsJmkQAgUMR9gepUZBdsBeQWNPBSo0gUi5V1H0Xb9AgjQfETCnj0qGwG0YY/e+zVM= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1700260553; c=relaxed/simple; bh=e7+tNmznGZAqh7Moik8LfQFgDGBf2eQbr7y/8wikf9k=; h=DKIM-Signature:Date:Mime-Version:Message-ID:Subject:From:To; b=Qqql/T2k5XZZEoVWa0op47X8ZebKI42gCeLgNcXzI2y7koPjoF3ZXGrIAPoB+FImdIgXg2iBhZc7HEVLldiuOfiXtvU2GG2++1uZLxK8+zXQBeHbmeuoZzPdL2CuLM0LEh+pHEihFLo/nAv1WdCX/UzU946ROaNgiAb6DqdX0tE= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-5ae5b12227fso35896437b3.0 for ; Fri, 17 Nov 2023 14:35:50 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1700260550; x=1700865350; darn=sourceware.org; h=cc:to:from:subject:message-id:mime-version:date:from:to:cc:subject :date:message-id:reply-to; bh=aijIirrpIvelIe3WkirdPsOkf6yJYvXaZn4bYKjCwJE=; b=p9hO7Ivps4+5z4yNVt8LunBj2rAYZXIihI1S+jKkx/soN0gPl5/RV4jFXZwDnvYlR5 0bjHc9f5a2JFkRkZq4UjN60ORe3KQzV1b8NMeTLYGbE7wC/I39s90diqF75qkQme1gEX 3T/ZKXz1gFDka296eEl7aaue5xqPkJG2Bgakk3OWi11qUNJX27NwErSU+mM4KqOp3XxG f9/gqurWnAzBiyYLMmjiv6JAs2LK5+QwjIBEvevy4/X0NHSyVfkLgyKL2gh0Mm6qhueG hWtqxArjfwdqJKyTn8fjfLgGQoJUh2bVgsjocvGXmnA3cQfJtV8kk08mZzR0bz/yR78F ltew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1700260550; x=1700865350; h=cc:to:from:subject:message-id:mime-version:date:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=aijIirrpIvelIe3WkirdPsOkf6yJYvXaZn4bYKjCwJE=; b=aZnzENk7uDHOXqL5Q3dJweQPcgPNeGAMa893sXcaKm8vwZozLO2fcndhTkjdNmvGxv E63IXwz1zQZqQ9fGigP93tdO32h3HxsApO+eZ3J59J799H2a+trELvcN3Db95y9WuNsG pBizSpyqShRccH5HXE569hFOPRCbWaMgu1DJ+CUMEX4zXrN+3SvRRGULh2ogCf2Av5xA HHZ3Q0PoC30T8c4lmU/M5g7JkKmWs1bFptvGgeOIomtUOag7pMF3PsbE2vv35PueoIAS /DGFRKEzLDlZfO7onNJRBj5IaBh3V8/qKHm19Q4AldJEBuGNVH7skHow7jsnwru8JKio 3pjA== X-Gm-Message-State: AOJu0YxIDTFumf0F7anER9gTEAzTDwSnkav33tiwDJCY8UDNPe37ga/z iBaQEuZd+xuK+AMJpaTpo4X5CpVFdPjr8J/uxZxvWAsiXasaj5VYFgLKmk+fxbqsBAvSeZhzdFu t5z0kmNimr8MOoT3gBRxPam8KQlBtCc0fZBQRwd2qkLxiZADqn1PHSzQzK266bvBVdgL1Yqc= X-Google-Smtp-Source: AGHT+IGUPzsmGusd31tupJnZuVSXRH/lD4aMvMN8KVIY8D+k6CZJO8rzfGlhrcCdVSTYbds0et3lMzNn6Wg= X-Received: from vvvvvv-dev.c.googlers.com ([fda3:e722:ac3:cc00:28:9cb1:c0a8:472]) (user=vvvvvv job=sendgmr) by 2002:a81:4f15:0:b0:5c5:b99f:237b with SMTP id d21-20020a814f15000000b005c5b99f237bmr24612ywb.8.1700260550171; Fri, 17 Nov 2023 14:35:50 -0800 (PST) Date: Fri, 17 Nov 2023 22:35:40 +0000 Mime-Version: 1.0 X-Mailer: git-send-email 2.43.0.rc1.413.gea7ed67945-goog Message-ID: <20231117223541.920797-1-vvvvvv@google.com> Subject: [PATCH 1/2] libdwfl: handle duplicate ELFs when reporting archives From: vvvvvv@google.com To: elfutils-devel@sourceware.org Cc: kernel-team@android.com, maennich@google.com, vvvvvv@google.com X-Spam-Status: No, score=-19.2 required=5.0 tests=BAYES_00, DKIMWL_WL_MED, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, HK_RANDOM_FROM, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE, USER_IN_DEF_DKIM_WL autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: elfutils-devel@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Elfutils-devel mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: elfutils-devel-bounces+patchwork=sourceware.org@sourceware.org From: Aleksei Vetrov When archive is processed in process_archive (libdwfl/offline.c), it creates an Elf object for each archive member. Then in process_archive_member it calls process_file to create a Dwfl_Module through __libdwfl_report_elf. The ownership of the Elf object is expected to be: * either transfered to the Dwfl_Module, if __libdwfl_report_elf returns not NULL; * or handled at the end of process_archive_member by calling elf_end. Moreover, Elf object is expected to be alive, if __libdwfl_report_elf returns not NULL, because at the end of process_archive_member it advances to the next member through the elf_next call. The problem happens when __libdwfl_report_elf encounters Elf with the same name and content as it seen before. In that case dwfl_report_module will reuse existing Dwfl_Module object. This leads to a codepath that calls elf_end on the Elf object, while returning not NULL, breaking the elf_next call to the next member. The fix is to destroy m->main.elf instead and put the new Elf object in the already existing Dwfl_Module. * libdwfl/dwfl_report_elf.c (__libdwfl_report_elf): Replace Elf in the Dwfl_Module in case of overlapping or duplicate modules to prolong its lifetime for subsequent processing. Signed-off-by: Aleksei Vetrov --- libdwfl/dwfl_report_elf.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libdwfl/dwfl_report_elf.c b/libdwfl/dwfl_report_elf.c index 581f4079..58b06aea 100644 --- a/libdwfl/dwfl_report_elf.c +++ b/libdwfl/dwfl_report_elf.c @@ -276,7 +276,8 @@ __libdwfl_report_elf (Dwfl *dwfl, const char *name, const char *file_name, } else { - elf_end (elf); + elf_end (m->main.elf); + m->main.elf = elf; if (m->main_bias != bias || m->main.vaddr != vaddr || m->main.address_sync != address_sync) goto overlap;