From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2155) id F148A3858412; Tue, 18 Apr 2023 08:13:29 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org F148A3858412 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1681805609; bh=gdQ6QSnf5tt5WJEp4+R4gg2vf03t04ZiColzeOsDiYs=; h=From:To:Subject:Date:From; b=gKcEBtnepOAY8x4U9QGpZbnJr7xBCEeSOl3vS1EELSyuMIrxSlSKFyEOvVcHRtUDU yRXugTz7cr9Kz3kcBc/RloZA5jTY0fE7Tkn9IZcWvVhpuoRRr4VCEuUqj32NdopKbI Yn3NLOHKwwJOrH24khUbr4JX3nRxdrIwrbBDw9jA= Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Corinna Vinschen To: cygwin-cvs@sourceware.org Subject: [newlib-cygwin/main] Cygwin: cygheap: fix fork error after heap has grown X-Act-Checkin: newlib-cygwin X-Git-Author: David McFarland X-Git-Refname: refs/heads/main X-Git-Oldrev: e5fcc5837c9594ccb7d0d6f40af69f266f606c5b X-Git-Newrev: a14a0e542d3aa8e53d189c906205c92ad044f750 Message-Id: <20230418081329.F148A3858412@sourceware.org> Date: Tue, 18 Apr 2023 08:13:29 +0000 (GMT) List-Id: https://sourceware.org/git/gitweb.cgi?p=3Dnewlib-cygwin.git;h=3Da14a0e542d3= aa8e53d189c906205c92ad044f750 commit a14a0e542d3aa8e53d189c906205c92ad044f750 Author: David McFarland AuthorDate: Mon Apr 17 21:41:55 2023 -0300 Commit: Corinna Vinschen CommitDate: Tue Apr 18 10:06:53 2023 +0200 Cygwin: cygheap: fix fork error after heap has grown =20 2f9b8ff0 introduced a problem where forks would sometimes fail with: =20 child_copy: cygheap read copy failed, 0x0..0x80044C750, done 0, windows= pid 14032, Win32 error 299 =20 When cygheap_max was > CYGHEAP_STORAGE_INITIAL, commit_size would be se= t to allocsize(cygheap_max), which is an address, not a size. VirtualAlloc = would be called to commit commit_size bytes, which would fail, and then child_co= py would be called with zero as the base address. =20 Fixes: 2f9b8ff00cce ("Cygwin: decouple cygheap from Cygwin DLL") Signed-off-by: David McFarland Diff: --- winsup/cygwin/mm/cygheap.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/winsup/cygwin/mm/cygheap.cc b/winsup/cygwin/mm/cygheap.cc index 6a20c159ab44..a20ee5972aed 100644 --- a/winsup/cygwin/mm/cygheap.cc +++ b/winsup/cygwin/mm/cygheap.cc @@ -87,7 +87,8 @@ cygheap_fixup_in_child (bool execed) SIZE_T commit_size =3D CYGHEAP_STORAGE_INITIAL - CYGHEAP_STORAGE_LOW; =20 if (child_proc_info->cygheap_max > (void *) CYGHEAP_STORAGE_INITIAL) - commit_size =3D allocsize (child_proc_info->cygheap_max); + commit_size =3D allocsize ((char *) child_proc_info->cygheap_max + - CYGHEAP_STORAGE_LOW); cygheap =3D (init_cygheap *) VirtualAlloc ((LPVOID) CYGHEAP_STORAGE_LOW, CYGHEAP_STORAGE_HIGH - CYGHEAP_STORAGE_LOW,