1*22dc650dSSadaf Ebrahimi /*************************************************
2*22dc650dSSadaf Ebrahimi * Perl-Compatible Regular Expressions *
3*22dc650dSSadaf Ebrahimi *************************************************/
4*22dc650dSSadaf Ebrahimi
5*22dc650dSSadaf Ebrahimi /* PCRE is a library of functions to support regular expressions whose syntax
6*22dc650dSSadaf Ebrahimi and semantics are as close as possible to those of the Perl 5 language.
7*22dc650dSSadaf Ebrahimi
8*22dc650dSSadaf Ebrahimi Written by Philip Hazel
9*22dc650dSSadaf Ebrahimi Copyright (c) 2023 University of Cambridge
10*22dc650dSSadaf Ebrahimi
11*22dc650dSSadaf Ebrahimi -----------------------------------------------------------------------------
12*22dc650dSSadaf Ebrahimi Redistribution and use in source and binary forms, with or without
13*22dc650dSSadaf Ebrahimi modification, are permitted provided that the following conditions are met:
14*22dc650dSSadaf Ebrahimi
15*22dc650dSSadaf Ebrahimi * Redistributions of source code must retain the above copyright notice,
16*22dc650dSSadaf Ebrahimi this list of conditions and the following disclaimer.
17*22dc650dSSadaf Ebrahimi
18*22dc650dSSadaf Ebrahimi * Redistributions in binary form must reproduce the above copyright
19*22dc650dSSadaf Ebrahimi notice, this list of conditions and the following disclaimer in the
20*22dc650dSSadaf Ebrahimi documentation and/or other materials provided with the distribution.
21*22dc650dSSadaf Ebrahimi
22*22dc650dSSadaf Ebrahimi * Neither the name of the University of Cambridge nor the names of its
23*22dc650dSSadaf Ebrahimi contributors may be used to endorse or promote products derived from
24*22dc650dSSadaf Ebrahimi this software without specific prior written permission.
25*22dc650dSSadaf Ebrahimi
26*22dc650dSSadaf Ebrahimi THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27*22dc650dSSadaf Ebrahimi AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28*22dc650dSSadaf Ebrahimi IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29*22dc650dSSadaf Ebrahimi ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
30*22dc650dSSadaf Ebrahimi LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31*22dc650dSSadaf Ebrahimi CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32*22dc650dSSadaf Ebrahimi SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33*22dc650dSSadaf Ebrahimi INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34*22dc650dSSadaf Ebrahimi CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35*22dc650dSSadaf Ebrahimi ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36*22dc650dSSadaf Ebrahimi POSSIBILITY OF SUCH DAMAGE.
37*22dc650dSSadaf Ebrahimi -----------------------------------------------------------------------------
38*22dc650dSSadaf Ebrahimi */
39*22dc650dSSadaf Ebrahimi
40*22dc650dSSadaf Ebrahimi /* This file contains functions to implement checked integer operation */
41*22dc650dSSadaf Ebrahimi
42*22dc650dSSadaf Ebrahimi #ifndef PCRE2_PCRE2TEST
43*22dc650dSSadaf Ebrahimi #ifdef HAVE_CONFIG_H
44*22dc650dSSadaf Ebrahimi #include "config.h"
45*22dc650dSSadaf Ebrahimi #endif
46*22dc650dSSadaf Ebrahimi
47*22dc650dSSadaf Ebrahimi #include "pcre2_internal.h"
48*22dc650dSSadaf Ebrahimi #endif
49*22dc650dSSadaf Ebrahimi
50*22dc650dSSadaf Ebrahimi /*************************************************
51*22dc650dSSadaf Ebrahimi * Checked Integer Multiplication *
52*22dc650dSSadaf Ebrahimi *************************************************/
53*22dc650dSSadaf Ebrahimi
54*22dc650dSSadaf Ebrahimi /*
55*22dc650dSSadaf Ebrahimi Arguments:
56*22dc650dSSadaf Ebrahimi r A pointer to PCRE2_SIZE to store the answer
57*22dc650dSSadaf Ebrahimi a, b Two integers
58*22dc650dSSadaf Ebrahimi
59*22dc650dSSadaf Ebrahimi Returns: Bool indicating if the operation overflows
60*22dc650dSSadaf Ebrahimi
61*22dc650dSSadaf Ebrahimi It is modeled after C23's <stdckdint.h> interface
62*22dc650dSSadaf Ebrahimi The INT64_OR_DOUBLE type is a 64-bit integer type when available,
63*22dc650dSSadaf Ebrahimi otherwise double. */
64*22dc650dSSadaf Ebrahimi
65*22dc650dSSadaf Ebrahimi BOOL
PRIV(ckd_smul)66*22dc650dSSadaf Ebrahimi PRIV(ckd_smul)(PCRE2_SIZE *r, int a, int b)
67*22dc650dSSadaf Ebrahimi {
68*22dc650dSSadaf Ebrahimi #ifdef HAVE_BUILTIN_MUL_OVERFLOW
69*22dc650dSSadaf Ebrahimi PCRE2_SIZE m;
70*22dc650dSSadaf Ebrahimi
71*22dc650dSSadaf Ebrahimi if (__builtin_mul_overflow(a, b, &m)) return TRUE;
72*22dc650dSSadaf Ebrahimi
73*22dc650dSSadaf Ebrahimi *r = m;
74*22dc650dSSadaf Ebrahimi #else
75*22dc650dSSadaf Ebrahimi INT64_OR_DOUBLE m;
76*22dc650dSSadaf Ebrahimi
77*22dc650dSSadaf Ebrahimi #ifdef PCRE2_DEBUG
78*22dc650dSSadaf Ebrahimi if (a < 0 || b < 0) abort();
79*22dc650dSSadaf Ebrahimi #endif
80*22dc650dSSadaf Ebrahimi
81*22dc650dSSadaf Ebrahimi m = (INT64_OR_DOUBLE)a * (INT64_OR_DOUBLE)b;
82*22dc650dSSadaf Ebrahimi
83*22dc650dSSadaf Ebrahimi #if defined INT64_MAX || defined int64_t
84*22dc650dSSadaf Ebrahimi if (sizeof(m) > sizeof(*r) && m > (INT64_OR_DOUBLE)PCRE2_SIZE_MAX) return TRUE;
85*22dc650dSSadaf Ebrahimi *r = (PCRE2_SIZE)m;
86*22dc650dSSadaf Ebrahimi #else
87*22dc650dSSadaf Ebrahimi if (m > PCRE2_SIZE_MAX) return TRUE;
88*22dc650dSSadaf Ebrahimi *r = m;
89*22dc650dSSadaf Ebrahimi #endif
90*22dc650dSSadaf Ebrahimi
91*22dc650dSSadaf Ebrahimi #endif
92*22dc650dSSadaf Ebrahimi
93*22dc650dSSadaf Ebrahimi return FALSE;
94*22dc650dSSadaf Ebrahimi }
95*22dc650dSSadaf Ebrahimi
96*22dc650dSSadaf Ebrahimi /* End of pcre_chkdint.c */
97