From patchwork Mon Jan 8 19:08:19 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Szabolcs Nagy X-Patchwork-Id: 25274 Received: (qmail 60247 invoked by alias); 8 Jan 2018 19:08:41 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 60227 invoked by uid 89); 8 Jan 2018 19:08:40 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.8 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: EUR01-HE1-obe.outbound.protection.outlook.com Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Szabolcs.Nagy@arm.com; Message-ID: <5A53C1A3.6070603@arm.com> Date: Mon, 08 Jan 2018 19:08:19 +0000 From: Szabolcs Nagy User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.8.0 MIME-Version: 1.0 To: GNU C Library CC: nd@arm.com, Carlos O'Donell , Florian Weimer Subject: [committed][PATCH v3][BZ #22637] Fix stack guard size accounting X-ClientProxiedBy: DB6PR06CA0005.eurprd06.prod.outlook.com (2603:10a6:6:1::18) To VI1PR0802MB2496.eurprd08.prod.outlook.com (2603:10a6:800:b8::23) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: ab6ad7f1-604d-4b6c-8446-08d556cb2fb6 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(48565401081)(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(5600026)(4604075)(2017052603307)(7153060)(49563074)(7193020); SRVR:VI1PR0802MB2496; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0802MB2496; 3:hHdQaw3T4+1T+hkO9Gdr9rx7SUVk0mLPgGBbSGP9eOjC9AW6XRmbT0ubjQ98g+bcQHsqWOKe4CExkLClnPyzrQSRCRSvBuOYWW+1IO/JkAjPjYNBueinqAFrzuxHBQjzffIS6U/1WtkL90Lwy6LWXrQ+fzlkaIw8yVuxTNSJKVK8oZn4LUBOhrS4zCSLT2wXs6AGhq2L7Z/YAnQvroIeNeOtWp/6UVFUe4k1kuVyfVi1ItxUocvIm1kqeWAiJ2Im; 25:3CQLZf9W29yv73NeIqmt33EHC/7B1zLHDDEqfWEWQMlg3p3yz7FcYIv+OF0hYl1Ia19lVrtyyFeXVzZnsUB3O1lcV0JXx2mt/4VJlcGY614BVMLJ/g5A4RRJDE/Q82IsqaqT2TWVsdoTu+2UkCaTqgwitms9ZmCojaUEJAA4gEAc3N+LlBVYv43QEAwIYUJxCEbgxHFY9HwEBQcu00YEnfBXpSU8wsTzVNjWycuIrXWWBFclbo7f/r+ViCEwqWgOx/dHPFV2AXd7AGh5erXeiJ4si3cEhT/YWdsKmFn0mKgUdBg9C6NkaKEOKappvI0TK9Xn8M8bAbkCji+N0sjFpw==; 31:fjLK/8cjYFY++vqrnqYewaRsC8bPwTxl64Y/87uwnt90S6Pr+2l/LuCQS9dUVBZi3YbhgDUJXXDBjFv0BkZdwBPbFVNDjfnl+zjGn9O5t2lpBvuRTfVYZbZUFH+sDNpc8Iu/F0hKQQsEvHvfOEGOkH9cCFdPwNpPi87eMrTcR5sp9NezY4LWeH7CSuczqee1laoeMFLBDwcXSTiPeySr4nNiVcpBt13wpOzhpPN+tkw= X-MS-TrafficTypeDiagnostic: VI1PR0802MB2496: NoDisclaimer: True X-Microsoft-Exchange-Diagnostics: 1; VI1PR0802MB2496; 20:r+11/MOX1JdmJQeshfLocR9L5TYbLOk1jCLgarbVLuAzhNLWj4sBwjv9tlToQxU0VCLOr4ifStQehYnbvzoBhfPc3Zvh0kQM09XK3pfI/3lCI8oYwHVkQ0JI5mutgWx3Px9bRUC3bUQXDkpThs/YMhmD4JUb4rwe9SQ1suBtAoc=; 4:O8a0o88v5lG8jTh0jHHafbvKCrv4nMlCdSJnVL2tBPkW1Cqenvt6oUMYXhyzD/JMAKE90IX2rvIpD4yzmkYpX127IGeGLzgT3WOco5QSpkLFj3EHfhpS7+wt1+dYxbRK6r46xsX9Q4xqHf+FCK780FZI7aWkWC0jHGK27blMpyWvJFGpthz5jLgZ0LmTCNd3kkUPI3fnCkcjSF7guENgbBu68ksOEF1NPz3250Eo30aVEZ3ZHRUYVafHLrh4Lv2LAxGCADNZ/UpTzNzTRRsEq12QLJOzQiEdHXptX4X+6rXJhpVQTgcqt1ZVqUw9r8NE X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(211171220733660); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(102415395)(6040470)(2401047)(8121501046)(5005006)(3231023)(944501075)(3002001)(10201501046)(93006095)(93001095)(6055026)(6041268)(20161123560045)(20161123558120)(20161123564045)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(6072148)(201708071742011); SRVR:VI1PR0802MB2496; BCL:0; PCL:0; RULEID:(100000803101)(100110400095); SRVR:VI1PR0802MB2496; X-Forefront-PRVS: 054642504A X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6049001)(39380400002)(366004)(396003)(376002)(346002)(39860400002)(199004)(189003)(86362001)(6116002)(5660300001)(15650500001)(4610100001)(2906002)(5890100001)(72206003)(8936002)(386003)(65816011)(270700001)(568964002)(65806001)(59450400001)(80316001)(66066001)(84326002)(3846002)(6916009)(33964004)(52116002)(83506002)(65956001)(2476003)(16526018)(36756003)(33656002)(59896002)(8676002)(478600001)(87266011)(106356001)(54906003)(25786009)(7736002)(21490400003)(316002)(77096006)(6486002)(68736007)(81166006)(53936002)(16576012)(58126008)(16586007)(97736004)(81156014)(64126003)(4326008)(105586002)(305945005); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR0802MB2496; H:[10.2.206.69]; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: arm.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR0802MB2496; 23:ir8APYg09jKBIXP1eo/nB4ahPIj8lkd6Zu/6FiX?= =?us-ascii?Q?fvVJJRg9m3jcp/ZZ83AZjEp0klz/TBmkPvXqCKTnZ/99C03EM4znlXfHi8OS?= =?us-ascii?Q?nsh78GQHYhg/y9M5sMuBMuVsoldHtGM7GbOTwroMYhRPgIw6nKGD0zsiiGky?= =?us-ascii?Q?wRWdVapDbswH4kUdGKlH/k6LB6Z6BwpqwC0SOEjf4vD5YS7WYjYbk3s9Y7sR?= =?us-ascii?Q?KaJBYanIHtM60UOc6Jg4Su16mUkK+8CeUaPRmj4ACumozSR/kIaTERdRrCbi?= =?us-ascii?Q?nyxApsntUTHm7KuFjXw/MftBvx10NDRVxLeZsJemFyoIU1tJgCeO1zxwtjE+?= =?us-ascii?Q?/TwL806KCBeFZtsEZa2usSFFMOMgPpE6d6TfFoNO7+jOWFlPRck7BO0GmhTe?= =?us-ascii?Q?LSXQhDZi7mJLyzMrjwqEGv6wIvFdb/9NUP4/MYrFkqftGJk64pYMFT+pwRUv?= =?us-ascii?Q?2s7w6tKUaKgbK5rSarH7SJ52NONDRb1CKL+bkvGMFRLj4Qz7/pTZmix3rMbw?= =?us-ascii?Q?2XI0ARCx9MI/fbUmdEKXVPLd4S51cywdr3WuS/cKkeYr7yK2ZkU1tfNY9qC4?= =?us-ascii?Q?EQwYph1GJQCRGq5njoCKyO6gK39FC4FobKxTS2lH6azLPQ9M3Jmo2+02aOn0?= =?us-ascii?Q?1YboIchqUvEDM2GfHIjx99y5qOc9ENxFAnwv83gmNlf9xaW3Rrny5D4m9emc?= =?us-ascii?Q?ArorarRWlGuzpSoHRz9lVTWGDZyIyecJdPvJyJbAiVHUDvBJ2biubfZeZm0r?= =?us-ascii?Q?J783+lmD3kaYOgoxbYZb4rCjyyASn9//9H9dh8Z7F5cLmXSsl3w4b56XVWTo?= =?us-ascii?Q?NXfRr2bZuGFNmdlpgou85Nlyhq5UI4sN66GNQCDYXXBRyWoV+JhVDKuqOZOz?= =?us-ascii?Q?gOjTnyav83i0sv8pYObOGLgpJHq+h2Utx+CDRX7xUbI9RV9V0d6uXRuM4uLf?= =?us-ascii?Q?WCUNaWO6Y7upowf5o6IZcEm9bKiZjTmM+MJ7wjF6mp19EvSY2wmhWFcT4z9s?= =?us-ascii?Q?+2i+t4/FYAUuvCfcvizF5QWVYb5VmSMAiK0RJtk889TrFDNmwHN/cwwuNRGn?= =?us-ascii?Q?BraOHfIA3X6Ix7UO07uWDLg0JwkM/u84KFKCGj2e5GdhvMwUO+JmCdQhY06P?= =?us-ascii?Q?3RJ/GBNzF6n0lJZAnbpRfcD8a4q3nC396r9BNfSLv+tf1WMJWCEALv08Eh2c?= =?us-ascii?Q?aA4aexC7MJS6qJyfnZyr9FcRs+ulwi0oujI1USqYj+L3h1uHZ+/9mb7N7KTI?= =?us-ascii?Q?vLgatwM2COW4rEUVlv6Q8MG/4wGytaTIECSIlM5YHxTVwXK67i9vYJifffJd?= =?us-ascii?Q?PzfyEzpTa50l6bpGH3R9+ccj8AvI/wuSuRIgd+z+3kzChlc59VtGXbF3sZUe?= =?us-ascii?Q?0cDsk1IsV9KMtxhSv1iOP+6gazu7Jkpk3B42c8ZYND9bOTLZw+nTa1xJOHSC?= =?us-ascii?Q?FWzmtn+Hi7g=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0802MB2496; 6:mo3LBtCqaKpCChuPOO99Tqih44HJWjrjzxwRhWJlTg2LjKtB7LGNZNUtoy0bpZcUJ71gpTkE3Rg960rGJwcMSDjsSte5bcmOvnmRlpJ8wf4jHzpBesAH/WAE2ze82OTB9LtgbkGICdILxwsmcXFDyIbRIuUxFNW3/kIfPAVkKfvaxkyvEGZvVck+ITi8uGOa/W8C04qulU8pBdnhSYR5dEr3fdRWyop5KjwcOuPVpoS5gtiNp4jKPZG7mEjTXSQGTA2bjpdiLft6u9EJBr4luIhbB7h2Qo2EDrvV0wKEDFQVXIlomHo3zZsaUoWBzpOeNjVybdHrvPrNTdWnFr3NLxcRrViNa28uoLr1l2tqOSg=; 5:sxnxI0R1HjFA1M0EuQ4I0T3NO/CFWB9CA70K4O9sDHklGICELNvI1fHSQrhvx9sm6Did1dSrol3Dyy7bo0MRTf54rkAbbnBsWD9txpMT6SoR9PhnGCwMGQkwRktyO4Andv0lDhRmNAxWjYS3RjCaik9KChKaZ7MwqXcJLTAS418=; 24:TTpGhLzSfeaKsBcgBG6IJx54q9uYl95JYJknZktPozlagm9SJ9J2by+U5QlMjDtWyoHR0+emrh37tPt5fgFwDtUo99CNl8rxrTGxoqXiiLY=; 7:0v5pqi/mpC2NXZJ7b4G4fOFrioV5/EquWN4PY18kHiHwES3V2NK2n4WG0xUJDRhQ6K3BEM6wMl8G1WIoly25ElOeogp+IhsN9f+PmYmvTo8Eucyj3s0HlJE/mWbDXExygy9njHfbinheLzzrldcdCJqSjQ9LQdbbI7UmgJxJFokyIi+SFYQcapR2o3ajViZhCHehuUurUFzX+LZZUcr9wmiVQjaGZuqa/Kr72Uu9u1LFkdPoL/buVPhyrnvJSdPx SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Jan 2018 19:08:21.8352 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: ab6ad7f1-604d-4b6c-8446-08d556cb2fb6 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0802MB2496 v3: - add comments about stackblock_size to nptl/descr.h - add comments to nptl/pthread_getattr_np.c v2: - use separate bug number from the tls accounting issue. - check for arithmetic overflow in size+guardsize. Previously if user requested S stack and G guard when creating a thread, the total mapping was S and the actual available stack was S - G - static_tls, which is not what the user requested. This patch fixes the guard size accounting by pretending the user requested S+G stack. This way all later logic works out except when reporting the user requested stack size (pthread_getattr_np) or when computing the minimal stack size (__pthread_get_minstack). Normally this will increase thread stack allocations by one page. TLS accounting is not affected, that will require a separate fix. [BZ #22637] * nptl/descr.h (stackblock, stackblock_size): Update comments. * nptl/allocatestack.c (allocate_stack): Add guardsize to stacksize. * nptl/nptl-init.c (__pthread_get_minstack): Remove guardsize from stacksize. * nptl/pthread_getattr_np.c (pthread_getattr_np): Likewise. diff --git a/nptl/allocatestack.c b/nptl/allocatestack.c index 05b8ed331b..b374f4794d 100644 --- a/nptl/allocatestack.c +++ b/nptl/allocatestack.c @@ -532,6 +532,10 @@ allocate_stack (const struct pthread_attr *attr, struct pthread **pdp, /* Make sure the size of the stack is enough for the guard and eventually the thread descriptor. */ guardsize = (attr->guardsize + pagesize_m1) & ~pagesize_m1; + if (guardsize < attr->guardsize || size + guardsize < guardsize) + /* Arithmetic overflow. */ + return EINVAL; + size += guardsize; if (__builtin_expect (size < ((guardsize + __static_tls_size + MINIMAL_REST_STACK + pagesize_m1) & ~pagesize_m1), diff --git a/nptl/descr.h b/nptl/descr.h index da9c567a6f..1cc6b09d1e 100644 --- a/nptl/descr.h +++ b/nptl/descr.h @@ -383,9 +383,9 @@ struct pthread /* Machine-specific unwind info. */ struct _Unwind_Exception exc; - /* If nonzero pointer to area allocated for the stack and its - size. */ + /* If nonzero, pointer to the area allocated for the stack and guard. */ void *stackblock; + /* Size of the stackblock area including the guard. */ size_t stackblock_size; /* Size of the included guard area. */ size_t guardsize; diff --git a/nptl/nptl-init.c b/nptl/nptl-init.c index c237a3675a..5a4b52419f 100644 --- a/nptl/nptl-init.c +++ b/nptl/nptl-init.c @@ -472,8 +472,5 @@ strong_alias (__pthread_initialize_minimal_internal, size_t __pthread_get_minstack (const pthread_attr_t *attr) { - struct pthread_attr *iattr = (struct pthread_attr *) attr; - - return (GLRO(dl_pagesize) + __static_tls_size + PTHREAD_STACK_MIN - + iattr->guardsize); + return GLRO(dl_pagesize) + __static_tls_size + PTHREAD_STACK_MIN; } diff --git a/nptl/pthread_getattr_np.c b/nptl/pthread_getattr_np.c index 961d711fd2..ae12592294 100644 --- a/nptl/pthread_getattr_np.c +++ b/nptl/pthread_getattr_np.c @@ -57,9 +57,12 @@ pthread_getattr_np (pthread_t thread_id, pthread_attr_t *attr) /* The sizes are subject to alignment. */ if (__glibc_likely (thread->stackblock != NULL)) { - iattr->stacksize = thread->stackblock_size; + /* The stack size reported to the user should not include the + guard size. */ + iattr->stacksize = thread->stackblock_size - thread->guardsize; #if _STACK_GROWS_DOWN - iattr->stackaddr = (char *) thread->stackblock + iattr->stacksize; + iattr->stackaddr = (char *) thread->stackblock + + thread->stackblock_size; #else iattr->stackaddr = (char *) thread->stackblock; #endif