From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pg1-x529.google.com (mail-pg1-x529.google.com [IPv6:2607:f8b0:4864:20::529]) by sourceware.org (Postfix) with ESMTPS id 5A48D3858D32 for ; Wed, 27 Dec 2023 06:05:25 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 5A48D3858D32 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 5A48D3858D32 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::529 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1703657129; cv=none; b=P0w9ncV0GTugKgkf1PDQ+xrP/HDyhVJwBpm5nhRD0S2EivyquVolAmGgyetfEXlRqrs8ANh2udEWJdg9I5ytiFfX0wx2pmujklo4l0/0/LNgEmPOdP/st2ZyhqDjrXZh7VZiUYfxpTmLUITXkPvE3tkmhJiH1k+B9FDaJgO6HVo= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1703657129; c=relaxed/simple; bh=DurL7Bt54sP0qu9IxRU2JjMb/XgkKkZkQXnHp32yWLE=; h=DKIM-Signature:Date:From:To:Subject:Message-ID:MIME-Version; b=nggihsZdAJcJV/m/LIYPd5DjhcruKAeE1OVSo4NO7Cu/oLnnmiSDvlHaRw2yfdptsmwinwzXlND7/v+iyyVHrcjHuq25UAVgPCDSH373rabuJlICeITsiz5NavbMstFb/lRNRp31ej9KtxJqSY8E3GChnjbAwGbkTGxwgyBIaXM= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-pg1-x529.google.com with SMTP id 41be03b00d2f7-5cdfed46372so2363357a12.3 for ; Tue, 26 Dec 2023 22:05:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1703657123; x=1704261923; darn=sourceware.org; h=content-disposition:mime-version:message-id:subject:to:from:date :from:to:cc:subject:date:message-id:reply-to; bh=+kICvW0NxIlSm1dkxTg4F9/K4MlEumOkURGnmRVY9gs=; b=hRdOVSZQxT/mxY9EVV+XPlzdYmaM6DMy4pdCIrr8EW/kaEGWd/XCgaKye/iamgy5Ow aGeLQ7xvxbZ4AJM6Hg2P6kDrmxalFOGyLD7FLcwwQMhAPWWRqgV71cDl1hIvI5szxRXN AtT5OuoOjPobiKWXPYXVlS7DKlVP+iT8g/ruJNaOMd97h7MLhrRnUvjQNHOGTQBQW7fD x9zZkcfORk+kNBWHNHGasj5tX6SSl2my1kFuCho8lkx5txNVxB79vow0tLBZ+Nf+jhBZ CQn/C6RqNQrYNBX1zFEAZ3ZaL6ngfokWWzZhSeRaXVSG6rBZUaDULTUzr8DQ4XBqlLja 9+HQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1703657123; x=1704261923; h=content-disposition:mime-version:message-id:subject:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=+kICvW0NxIlSm1dkxTg4F9/K4MlEumOkURGnmRVY9gs=; b=F8lmUbzaTiifzhaYqcx+xFcSLF+0aCGGFMXYZ5j5+ymeSFXlU2PnyxPn7IqUla9OKj E8VCET8XERKgAauBfdh+PPzDx5v2MmYrzG9D52+uhwG2awVqzYqm/lSfBLqtDAHMRKMF 6Yq2cqGKJTwAUqHkDDkMxxoda28/PzOn+nJlrtVoOeDYlWPeRGnqGAwmUbj1aCJOm9BS 0fGmRq0QLgv44af29aB03+zNAUif2X3/vISMOeEFpqp2z+0B/NYkLOQzL17xYiWhV6qo ZztxfBUOVo60+UhQ3ULpOCDO+ee2gfwVIYMaxPc9HHppBNfzIjlj2gWZfXrIOixG6yA0 HcoA== X-Gm-Message-State: AOJu0YwTZnAGRvHzP4eZ5tiq2sTtAXxE5+4M/gw6MwGWPN8dMBSvC0qJ izz0hLD8uv2U7lWcSCvWrlyVlMZYd8w= X-Google-Smtp-Source: AGHT+IHKx9M9YDE3XgjjN8qQMV2Hk6MgsN/4xz/qVGwL7OHQD763wuyfczS+0G3BUE0G6JX8ccNyxQ== X-Received: by 2002:a05:6a21:3397:b0:196:245a:894c with SMTP id yy23-20020a056a21339700b00196245a894cmr399440pzb.61.1703657123400; Tue, 26 Dec 2023 22:05:23 -0800 (PST) Received: from squeak.grove.modra.org ([2406:3400:51d:8cc0:40f0:c3b6:3a4e:7110]) by smtp.gmail.com with ESMTPSA id t14-20020a62d14e000000b006d79921f50asm9043362pfl.44.2023.12.26.22.05.21 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 Dec 2023 22:05:22 -0800 (PST) Received: by squeak.grove.modra.org (Postfix, from userid 1000) id 9FA8B1140405; Wed, 27 Dec 2023 16:35:19 +1030 (ACDT) Date: Wed, 27 Dec 2023 16:35:19 +1030 From: Alan Modra To: binutils@sourceware.org Subject: PR31191, objcopy leaves temporary files Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Spam-Status: No, score=-3033.5 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Fix the ENOTDIR rmdir too. PR 31191 * objcopy.c (copy_archive): Localise uses of "l". Remove const from name_list.name. Unlink output element on bfd_close error, and NULL list->name to indicate file is removed. Adjust cleanup to prevent rmdir on non-existent file. diff --git a/binutils/objcopy.c b/binutils/objcopy.c index b3c8d0f81ac..0c4a9e6407f 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -3610,9 +3610,9 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target, struct name_list { struct name_list *next; - const char *name; + char *name; bfd *obfd; - } *list, *l; + } *list; bfd **ptr = &obfd->archive_head; bfd *this_element; char *dir = NULL; @@ -3671,7 +3671,6 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target, bfd *output_element; struct stat buf; int stat_status = 0; - bool del = true; bool ok_object; /* PR binutils/17533: Do not allow directory traversal @@ -3704,7 +3703,7 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target, goto cleanup_and_exit; } - l = (struct name_list *) xmalloc (sizeof (struct name_list)); + struct name_list *l = xmalloc (sizeof (*l)); l->name = tmpdir; l->next = list; l->obfd = NULL; @@ -3723,7 +3722,7 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target, bfd_get_filename (this_element)); } - l = (struct name_list *) xmalloc (sizeof (struct name_list)); + struct name_list *l = xmalloc (sizeof (*l)); l->name = output_name; l->next = list; l->obfd = NULL; @@ -3751,32 +3750,31 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target, if (ok_object) { - del = !copy_object (this_element, output_element, input_arch); + status = !copy_object (this_element, output_element, input_arch); - if (del && bfd_get_arch (this_element) == bfd_arch_unknown) + if (status && bfd_get_arch (this_element) == bfd_arch_unknown) /* Try again as an unknown object file. */ ok_object = false; } if (!ok_object) - del = !copy_unknown_object (this_element, output_element); + status = !copy_unknown_object (this_element, output_element); - if (!(ok_object && !del && !status + if (!(ok_object && !status ? bfd_close : bfd_close_all_done) (output_element)) { bfd_nonfatal_message (output_name, NULL, NULL, NULL); - /* Error in new object file. Don't change archive. */ + /* Error in new object file. Don't change archive. */ status = 1; } - if (del) + if (status) { unlink (output_name); - status = 1; + free (output_name); + list->name = NULL; + bfd_close (this_element); } - - if (status) - bfd_close (this_element); else { if (preserve_dates && stat_status == 0) @@ -3785,7 +3783,7 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target, /* Open the newly created output file and attach to our list. */ output_element = bfd_openr (output_name, output_target); - l->obfd = output_element; + list->obfd = output_element; *ptr = output_element; ptr = &output_element->archive_next; @@ -3817,17 +3815,20 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target, free (filename); /* Delete all the files that we opened. */ - struct name_list *next; + struct name_list *l, *next; for (l = list; l != NULL; l = next) { - if (l->obfd == NULL) - rmdir (l->name); - else + if (l->name != NULL) { - bfd_close (l->obfd); - unlink (l->name); + if (l->obfd == NULL) + rmdir (l->name); + else + { + bfd_close (l->obfd); + unlink (l->name); + } + free (l->name); } - free ((char *) l->name); next = l->next; free (l); } -- Alan Modra Australia Development Lab, IBM