PNG  IHDR  8] PLTE S =tRNS   PNG  IHDR  8] PLTE S =tRNS   REDROOM
PHP 7.4.33
Preview: zend_multiply.h Size: 9.61 KB
//opt/cloudlinux/alt-php74/root/usr/include/php/Zend/zend_multiply.h

/*
   +----------------------------------------------------------------------+
   | Zend Engine                                                          |
   +----------------------------------------------------------------------+
   | Copyright (c) Zend Technologies Ltd. (http://www.zend.com)           |
   +----------------------------------------------------------------------+
   | This source file is subject to version 2.00 of the Zend license,     |
   | that is bundled with this package in the file LICENSE, and is        |
   | available through the world-wide-web at the following url:           |
   | http://www.zend.com/license/2_00.txt.                                |
   | If you did not receive a copy of the Zend license and are unable to  |
   | obtain it through the world-wide-web, please send a note to          |
   | license@zend.com so we can mail you a copy immediately.              |
   +----------------------------------------------------------------------+
   | Authors: Sascha Schumann <sascha@schumann.cx>                        |
   |          Ard Biesheuvel <ard.biesheuvel@linaro.org>                  |
   +----------------------------------------------------------------------+
*/

#include "zend_portability.h"

#ifndef ZEND_MULTIPLY_H
#define ZEND_MULTIPLY_H

#if PHP_HAVE_BUILTIN_SMULL_OVERFLOW && SIZEOF_LONG == SIZEOF_ZEND_LONG

#define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do {	\
	long __tmpvar;		 											\
	if (((usedval) = __builtin_smull_overflow((a), (b), &__tmpvar))) {	\
		(dval) = (double) (a) * (double) (b);						\
	}																\
	else (lval) = __tmpvar;											\
} while (0)

#elif PHP_HAVE_BUILTIN_SMULLL_OVERFLOW && SIZEOF_LONG_LONG == SIZEOF_ZEND_LONG

#define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do {	\
	long long __tmpvar; 											\
	if (((usedval) = __builtin_smulll_overflow((a), (b), &__tmpvar))) {	\
		(dval) = (double) (a) * (double) (b);						\
	}																\
	else (lval) = __tmpvar;											\
} while (0)

#elif (defined(__i386__) || defined(__x86_64__)) && defined(__GNUC__)

#define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do {	\
	zend_long __tmpvar; 													\
	__asm__ ("imul %3,%0\n"											\
		"adc $0,%1" 												\
			: "=r"(__tmpvar),"=r"(usedval) 							\
			: "0"(a), "r"(b), "1"(0));								\
	if (usedval) (dval) = (double) (a) * (double) (b);				\
	else (lval) = __tmpvar;											\
} while (0)

#elif defined(__arm__) && defined(__GNUC__)

#define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do {	\
	zend_long __tmpvar; 													\
	__asm__("smull %0, %1, %2, %3\n"								\
		"sub %1, %1, %0, asr #31"									\
			: "=r"(__tmpvar), "=r"(usedval)							\
			: "r"(a), "r"(b));										\
	if (usedval) (dval) = (double) (a) * (double) (b);				\
	else (lval) = __tmpvar;											\
} while (0)

#elif defined(__aarch64__) && defined(__GNUC__)

#define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do {	\
	zend_long __tmpvar; 													\
	__asm__("mul %0, %2, %3\n"										\
		"smulh %1, %2, %3\n"										\
		"sub %1, %1, %0, asr #63\n"									\
			: "=&r"(__tmpvar), "=&r"(usedval)						\
			: "r"(a), "r"(b));										\
	if (usedval) (dval) = (double) (a) * (double) (b);				\
	else (lval) = __tmpvar;											\
} while (0)

#elif defined(ZEND_WIN32)

# ifdef _M_X64
#  pragma intrinsic(_mul128)
#  define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do {       \
	__int64 __high; \
	__int64 __low = _mul128((a), (b), &__high); \
	if ((__low >> 63I64) == __high) { \
		(usedval) = 0; \
		(lval) = __low; \
	} else { \
		(usedval) = 1; \
		(dval) = (double)(a) * (double)(b); \
	} \
} while (0)
# else
#  define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do {	\
	zend_long   __lres  = (a) * (b);										\
	long double __dres  = (long double)(a) * (long double)(b);		\
	long double __delta = (long double) __lres - __dres;			\
	if ( ((usedval) = (( __dres + __delta ) != __dres))) {			\
		(dval) = __dres;											\
	} else {														\
		(lval) = __lres;											\
	}																\
} while (0)
# endif

#elif defined(__powerpc64__) && defined(__GNUC__)

#define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do {	\
	long __low, __high;						\
	__asm__("mulld %0,%2,%3\n\t"					\
		"mulhd %1,%2,%3\n"					\
		: "=&r"(__low), "=&r"(__high)				\
		: "r"(a), "r"(b));					\
	if ((__low >> 63) != __high) {					\
		(dval) = (double) (a) * (double) (b);			\
		(usedval) = 1;						\
	} else {							\
		(lval) = __low;						\
		(usedval) = 0;						\
	}								\
} while (0)

#elif SIZEOF_ZEND_LONG == 4

#define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do {	\
	int64_t __result = (int64_t) (a) * (int64_t) (b);				\
	if (__result > ZEND_LONG_MAX || __result < ZEND_LONG_MIN) {		\
		(dval) = (double) __result;									\
		(usedval) = 1;												\
	} else {														\
		(lval) = (long) __result;									\
		(usedval) = 0;												\
	}																\
} while (0)

#else

#define ZEND_SIGNED_MULTIPLY_LONG(a, b, lval, dval, usedval) do {	\
	long   __lres  = (a) * (b);										\
	long double __dres  = (long double)(a) * (long double)(b);		\
	long double __delta = (long double) __lres - __dres;			\
	if ( ((usedval) = (( __dres + __delta ) != __dres))) {			\
		(dval) = __dres;											\
	} else {														\
		(lval) = __lres;											\
	}																\
} while (0)

#endif

#if defined(__GNUC__) && (defined(__native_client__) || defined(i386))

static zend_always_inline size_t zend_safe_address(size_t nmemb, size_t size, size_t offset, int *overflow)
{
	size_t res = nmemb;
	size_t m_overflow = 0;

	if (ZEND_CONST_COND(offset == 0, 0)) {
		__asm__ ("mull %3\n\tadcl $0,%1"
	     : "=&a"(res), "=&d" (m_overflow)
	     : "%0"(res),
	       "rm"(size));
	} else {
		__asm__ ("mull %3\n\taddl %4,%0\n\tadcl $0,%1"
	     : "=&a"(res), "=&d" (m_overflow)
	     : "%0"(res),
	       "rm"(size),
	       "rm"(offset));
	}

	if (UNEXPECTED(m_overflow)) {
		*overflow = 1;
		return 0;
	}
	*overflow = 0;
	return res;
}

#elif defined(__GNUC__) && defined(__x86_64__)

static zend_always_inline size_t zend_safe_address(size_t nmemb, size_t size, size_t offset, int *overflow)
{
	size_t res = nmemb;
	zend_ulong m_overflow = 0;

#ifdef __ILP32__ /* x32 */
# define LP_SUFF "l"
#else /* amd64 */
# define LP_SUFF "q"
#endif

	if (ZEND_CONST_COND(offset == 0, 0)) {
		__asm__ ("mul" LP_SUFF  " %3\n\t"
			"adc $0,%1"
			: "=&a"(res), "=&d" (m_overflow)
			: "%0"(res),
			  "rm"(size));
	} else {
		__asm__ ("mul" LP_SUFF  " %3\n\t"
			"add %4,%0\n\t"
			"adc $0,%1"
			: "=&a"(res), "=&d" (m_overflow)
			: "%0"(res),
			  "rm"(size),
			  "rm"(offset));
	}
#undef LP_SUFF
	if (UNEXPECTED(m_overflow)) {
		*overflow = 1;
		return 0;
	}
	*overflow = 0;
	return res;
}

#elif defined(__GNUC__) && defined(__arm__)

static zend_always_inline size_t zend_safe_address(size_t nmemb, size_t size, size_t offset, int *overflow)
{
	size_t res;
	zend_ulong m_overflow;

	__asm__ ("umlal %0,%1,%2,%3"
		: "=r"(res), "=r"(m_overflow)
		: "r"(nmemb),
		  "r"(size),
		  "0"(offset),
		  "1"(0));

	if (UNEXPECTED(m_overflow)) {
		*overflow = 1;
		return 0;
	}
	*overflow = 0;
	return res;
}

#elif defined(__GNUC__) && defined(__aarch64__)

static zend_always_inline size_t zend_safe_address(size_t nmemb, size_t size, size_t offset, int *overflow)
{
	size_t res;
	zend_ulong m_overflow;

	__asm__ ("mul %0,%2,%3\n\tumulh %1,%2,%3\n\tadds %0,%0,%4\n\tadc %1,%1,xzr"
		: "=&r"(res), "=&r"(m_overflow)
		: "r"(nmemb),
		  "r"(size),
		  "r"(offset));

	if (UNEXPECTED(m_overflow)) {
		*overflow = 1;
		return 0;
	}
	*overflow = 0;
	return res;
}

#elif defined(__GNUC__) && defined(__powerpc64__)

static zend_always_inline size_t zend_safe_address(size_t nmemb, size_t size, size_t offset, int *overflow)
{
        size_t res;
        unsigned long m_overflow;

        __asm__ ("mulld %0,%2,%3\n\t"
                 "mulhdu %1,%2,%3\n\t"
                 "addc %0,%0,%4\n\t"
                 "addze %1,%1\n"
             : "=&r"(res), "=&r"(m_overflow)
             : "r"(nmemb),
               "r"(size),
               "r"(offset));

        if (UNEXPECTED(m_overflow)) {
                *overflow = 1;
                return 0;
        }
        *overflow = 0;
        return res;
}

#elif SIZEOF_SIZE_T == 4

static zend_always_inline size_t zend_safe_address(size_t nmemb, size_t size, size_t offset, int *overflow)
{
	uint64_t res = (uint64_t) nmemb * (uint64_t) size + (uint64_t) offset;

	if (UNEXPECTED(res > UINT64_C(0xFFFFFFFF))) {
		*overflow = 1;
		return 0;
	}
	*overflow = 0;
	return (size_t) res;
}

#else

static zend_always_inline size_t zend_safe_address(size_t nmemb, size_t size, size_t offset, int *overflow)
{
	size_t res = nmemb * size + offset;
	double _d  = (double)nmemb * (double)size + (double)offset;
	double _delta = (double)res - _d;

	if (UNEXPECTED((_d + _delta ) != _d)) {
		*overflow = 1;
		return 0;
	}
	*overflow = 0;
	return res;
}
#endif

static zend_always_inline size_t zend_safe_address_guarded(size_t nmemb, size_t size, size_t offset)
{
	int overflow;
	size_t ret = zend_safe_address(nmemb, size, offset, &overflow);

	if (UNEXPECTED(overflow)) {
		zend_error_noreturn(E_ERROR, "Possible integer overflow in memory allocation (%zu * %zu + %zu)", nmemb, size, offset);
		return 0;
	}
	return ret;
}

/* A bit more generic version of the same */
static zend_always_inline size_t zend_safe_addmult(size_t nmemb, size_t size, size_t offset, const char *message)
{
	int overflow;
	size_t ret = zend_safe_address(nmemb, size, offset, &overflow);

	if (UNEXPECTED(overflow)) {
		zend_error_noreturn(E_ERROR, "Possible integer overflow in %s (%zu * %zu + %zu)", message, nmemb, size, offset);
		return 0;
	}
	return ret;
}

#endif /* ZEND_MULTIPLY_H */

Directory Contents

Dirs: 0 × Files: 76

Name Size Perms Modified Actions
13.59 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
18.76 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
2.57 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
69.44 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
5.93 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
11.42 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
6.72 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
1.59 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
1.47 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
2.16 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
42.62 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
32 B lrw-r--r-- 2026-08-23 15:57:49
Edit Download
2.55 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
6.15 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
7.06 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
1.89 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
2.00 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
3.76 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
16.53 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
5.93 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
15.08 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
2.80 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
7.18 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
7.58 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
2.74 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
35.58 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
2.21 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
1.98 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
9.59 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
3.33 KB lrw-r--r-- 2026-08-23 15:57:48
Edit Download
1.83 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
184 B lrw-r--r-- 2026-08-23 15:57:49
Edit Download
4.17 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
1.50 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
3.32 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
11.35 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
2.67 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
264 B lrw-r--r-- 2026-08-23 15:57:49
Edit Download
3.39 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
3.70 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
4.20 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
3.09 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
4.68 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
4.75 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
9.61 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
1.76 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
4.57 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
13.19 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
33.35 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
19.67 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
4.21 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
2.93 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
3.99 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
5.40 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
4.29 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
1.36 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
1.25 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
1.60 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
2.30 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
3.46 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
17.30 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
1.81 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
3.42 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
5.60 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
39.58 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
3.02 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
3.20 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
12.44 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
1.91 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
264.93 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
1.92 MB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
85.91 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
11.80 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
3.14 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
2.59 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download
1.41 KB lrw-r--r-- 2026-08-23 15:57:49
Edit Download

If ZipArchive is unavailable, a .tar will be created (no compression).
 !"#$%&'(()*+,-./00123456789 t\ wIDATx ]ys  47Y ƒ -  "  Rv  < f{Ɛ $k l L > L  ~h^ 1  [  r G t& h  l F z3O Y ! p A(_g̷ E8 )S 8 c  Kb"z ~ 5 J xAL WU <  *  5 m;W a pB h ~P J 2 3 6 ҙ .Ƹ P i  4g F R L P ΪK/D  M v (a3 k J Œ4N5* SH ` SdJ z  O J Xՠ V>u ߱ BE&L b2 ?2` tX+  c CB A$ i b C ĀMB E : /  # Dx &l =q Ty  0 \p I ( L Ǎ { e 4k ;`u^ヲ eP!( d {  )T A 8 O;Ě n >;s6 !  :Nx `[S D HU ~ q›J F} a g*D 49 / pn k h (t 8NxƐF _!r չ7 ZR R׷ q/5") Ӎ NY 0 x sZ!   o  fu  ,  K"$ ? pg  㕣=  1» {h " fh7    y  } € +7  $ y " X —ą - G P u 4 m >J 5 L =V ' ^@I p ?MS xЌ XV P ! h "C NS9B8̢ ]!K  e   zA , ӏkbY  !< XQ ٿyS| *" f { w  4@[S <  # 0 ! js [m  =,~ o "ݎ DHf Wo $ g ! Vԅ t mB /y Wf V4񺍸 c+@x?  B ~u " xUN e 0 BĂ) ~J pz! 7y6]l Ԥ@ P a< O /DHC `≻  N m"$  0ObB }{ x AO FCG D R ^ "B  { WDH  UR l@ T #  +"d T ; 0 i  D}. 7 ` ' ] w rE &S i ƕiTD EL P _ u h $ Ա FG wVD G L R Zf ' .!] J /ZR oGЍs Mr Ĥ ʬ 3 Q [3 cL ` ^ p + ( F;# B 5 '  2Y f [  ϶R0e }  E 7 6M aۮ H <& n % L] E}Up x紉, Uw' Q  Ǯշo k ވۙ 0N94 VX5 xEDE l D #֤ } C o )W :  ^ s 9  bRf iX5u ཱི 4 :[  T 1. | [E 2ؽ Iy\ : o x K G 5 ylP ' uK E ftb/i[3 .g _  [3M n G, #NwQ5~  ؚ) | n =Ц"x qg gB ` 듘 ~ x w ? ? R~  _ u. &VQ K˻   H C ( TN˄+ `C dA nB׭ D 3"Z G ê ^k H_ /- ~ " R_  .8 Z_ 6@ o  xg  uP ? 3լ @7AM!  E7^ - =V L  x  g-D0  CtmW 7  O  G _ WD0 g C  w1 r d w : a | \  *" f nֳ ^ H# f L ` Z ۽hV  }S F r0Ù Bć5r] @! NL iQ]{s^=4 d  WD  "  "   M; t" 8 5 e dL| "-*st" ) SWD ?R[S e ooF  20.D ? bo =) A i o d ģ ZҰaO @E =) i D a &ܟa CϞ y6 ,<%{^x%{f8? `iw^ ?/ M * IEND B`