Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:11395 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 7028 invoked by uid 1010); 20 Jul 2004 20:27:17 -0000 Delivered-To: ezmlm-scan-internals@lists.php.net Delivered-To: ezmlm-internals@lists.php.net Received: (qmail 6987 invoked from network); 20 Jul 2004 20:27:16 -0000 Received: from unknown (HELO mgkyb1.nw.wakwak.com) (211.9.230.193) by pb1.pair.com with SMTP; 20 Jul 2004 20:27:16 -0000 Received: from vckyb3.nw.wakwak.com (postfix@vckyb3.nw.wakwak.com [211.9.231.144]) by mgkyb1.nw.wakwak.com (8.12.11/8.12.11/2004-03-24) with SMTP id i6KKRFEl096685; Wed, 21 Jul 2004 05:27:15 +0900 (JST) (envelope-from moriyoshi@at.wakwak.com) Received: from at.wakwak.com (at.wakwak.com [211.9.230.135]) by vckyb3.nw.wakwak.com (Postfix) with ESMTP id 2F77E3FE02; Wed, 21 Jul 2004 05:27:15 +0900 (JST) Received: from [192.168.0.219] (newcycle.as.wakwak.ne.jp [218.225.209.145]) (pbs=u6j9eb) by at.wakwak.com (8.12.11/8.12.11/2004-06-29) with ESMTP/inet id i6KKREOw054964; Wed, 21 Jul 2004 05:27:14 +0900 (JST) (envelope-from moriyoshi@at.wakwak.com) In-Reply-To: <5.1.0.14.2.20040720185738.05c94888@localhost> References: <20040720051012.87978.qmail@pb1.pair.com> <20040720051012.87978.qmail@pb1.pair.com> <5.1.0.14.2.20040720185738.05c94888@localhost> Mime-Version: 1.0 (Apple Message framework v618) Content-Type: text/plain; charset=US-ASCII; format=flowed Message-ID: <25036F0A-DA8B-11D8-846D-000A95CE0C62@at.wakwak.com> Content-Transfer-Encoding: 7bit Cc: "Sara Golemon" , internals@lists.php.net Date: Wed, 21 Jul 2004 05:26:56 +0900 To: Zeev Suraski X-Mailer: Apple Mail (2.618) Subject: Re: [PHP-DEV] No safe_pemalloc()? From: moriyoshi@at.wakwak.com (Moriyoshi Koizumi) Here's the patch. I'm going to commit this soon. Moriyoshi Index: Zend/zend_alloc.c =================================================================== RCS file: /repository/ZendEngine2/zend_alloc.c,v retrieving revision 1.138 diff -u -r1.138 zend_alloc.c --- Zend/zend_alloc.c 15 Jul 2004 22:59:54 -0000 1.138 +++ Zend/zend_alloc.c 20 Jul 2004 20:24:40 -0000 @@ -241,6 +241,30 @@ return 0; } +ZEND_API void *_safe_p_malloc(size_t nmemb, size_t size, size_t offset) +{ + + if (nmemb < LONG_MAX + && size < LONG_MAX + && offset < LONG_MAX + && nmemb >= 0 + && size >= 0 + && offset >= 0) { + long lval; + double dval; + int use_dval; + + ZEND_SIGNED_MULTIPLY_LONG(nmemb, size, lval, dval, use_dval); + + if (!use_dval + && lval < (long) (LONG_MAX - offset)) { + return pemalloc(lval + offset, 1); + } + } + + zend_error(E_ERROR, "Possible integer overflow in memory allocation (%zd * %zd + %zd)", nmemb, size, offset); + return 0; +} ZEND_API void _efree(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) Index: Zend/zend_alloc.h =================================================================== RCS file: /repository/ZendEngine2/zend_alloc.h,v retrieving revision 1.54 diff -u -r1.54 zend_alloc.h --- Zend/zend_alloc.h 19 Jul 2004 07:19:01 -0000 1.54 +++ Zend/zend_alloc.h 20 Jul 2004 20:24:40 -0000 @@ -78,6 +78,7 @@ ZEND_API void *_emalloc(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) ZEND_ATTRIBUTE_MALLOC; ZEND_API void *_safe_emalloc(size_t nmemb, size_t size, size_t offset ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) ZEND_ATTRIBUTE_MALLOC; +ZEND_API void *_safe_p_malloc(size_t nmemb, size_t size, size_t offset) ZEND_ATTRIBUTE_MALLOC; ZEND_API void _efree(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC); ZEND_API void *_ecalloc(size_t nmemb, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) ZEND_ATTRIBUTE_MALLOC; ZEND_API void *_erealloc(void *ptr, size_t size, int allow_failure ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC); @@ -106,6 +107,7 @@ /* Selective persistent/non persistent allocation macros */ #define pemalloc(size, persistent) ((persistent)?malloc(size):emalloc(size)) +#define safe_pemalloc(nmemb, size, offset, persistent) ((persistent)?_safe_p_malloc(nmemb, size, offset):safe_emalloc(nmemb, size, offset)) #define pefree(ptr, persistent) ((persistent)?free(ptr):efree(ptr)) #define pecalloc(nmemb, size, persistent) ((persistent)?calloc((nmemb), (size)):ecalloc((nmemb), (size))) #define perealloc(ptr, size, persistent) ((persistent)?realloc((ptr), (size)):erealloc((ptr), (size))) On 2004/07/21, at 0:57, Zeev Suraski wrote: > At 16:26 20/07/2004, Moriyoshi Koizumi wrote: > >> On 2004/07/20, at 14:10, Sara Golemon wrote: >> >>> Is there any reason there's no safe_pemalloc()? >> >> I once had exactly the same thought. Probably because there'd be no >> need >> for persistence, and stream folks now obviously need it :) > > Yep, no special reason - let's add it... > > Zeev > >