Coverage Report

Created: 2026-04-12 06:29

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/flac/src/libFLAC/memory.c
Line
Count
Source
1
/* libFLAC - Free Lossless Audio Codec library
2
 * Copyright (C) 2001-2009  Josh Coalson
3
 * Copyright (C) 2011-2025  Xiph.Org Foundation
4
 *
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions
7
 * are met:
8
 *
9
 * - Redistributions of source code must retain the above copyright
10
 * notice, this list of conditions and the following disclaimer.
11
 *
12
 * - Redistributions in binary form must reproduce the above copyright
13
 * notice, this list of conditions and the following disclaimer in the
14
 * documentation and/or other materials provided with the distribution.
15
 *
16
 * - Neither the name of the Xiph.org Foundation nor the names of its
17
 * contributors may be used to endorse or promote products derived from
18
 * this software without specific prior written permission.
19
 *
20
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21
 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23
 * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
24
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
 */
32
33
#ifdef HAVE_CONFIG_H
34
#  include <config.h>
35
#endif
36
37
#ifdef HAVE_STDINT_H
38
#include <stdint.h>
39
#endif
40
41
#include "private/memory.h"
42
#include "FLAC/assert.h"
43
#include "share/compat.h"
44
#include "share/alloc.h"
45
46
void *FLAC__memory_alloc_aligned(size_t bytes, void **aligned_address)
47
371k
{
48
371k
  void *x;
49
50
371k
  FLAC__ASSERT(0 != aligned_address);
51
52
371k
#ifdef FLAC__ALIGN_MALLOC_DATA
53
  /* align on 32-byte (256-bit) boundary */
54
371k
  x = safe_malloc_add_2op_(bytes, /*+*/31L);
55
371k
  *aligned_address = (void*)(((uintptr_t)x + 31L) & -32L);
56
#else
57
  x = safe_malloc_(bytes);
58
  *aligned_address = x;
59
#endif
60
371k
  return x;
61
371k
}
62
63
FLAC__bool FLAC__memory_alloc_aligned_int32_array(size_t elements, FLAC__int32 **unaligned_pointer, FLAC__int32 **aligned_pointer)
64
271k
{
65
271k
  FLAC__int32 *pu; /* unaligned pointer */
66
271k
  union { /* union needed to comply with C99 pointer aliasing rules */
67
271k
    FLAC__int32 *pa; /* aligned pointer */
68
271k
    void        *pv; /* aligned pointer alias */
69
271k
  } u;
70
71
271k
  FLAC__ASSERT(elements > 0);
72
271k
  FLAC__ASSERT(0 != unaligned_pointer);
73
271k
  FLAC__ASSERT(0 != aligned_pointer);
74
271k
  FLAC__ASSERT(unaligned_pointer != aligned_pointer);
75
76
271k
  if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */
77
0
    return false;
78
79
271k
  pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv);
80
271k
  if(0 == pu) {
81
0
    return false;
82
0
  }
83
271k
  else {
84
271k
    if(*unaligned_pointer != 0)
85
0
      free(*unaligned_pointer);
86
271k
    *unaligned_pointer = pu;
87
271k
    *aligned_pointer = u.pa;
88
271k
    return true;
89
271k
  }
90
271k
}
91
92
FLAC__bool FLAC__memory_alloc_aligned_uint32_array(size_t elements, FLAC__uint32 **unaligned_pointer, FLAC__uint32 **aligned_pointer)
93
16.5k
{
94
16.5k
  FLAC__uint32 *pu; /* unaligned pointer */
95
16.5k
  union { /* union needed to comply with C99 pointer aliasing rules */
96
16.5k
    FLAC__uint32 *pa; /* aligned pointer */
97
16.5k
    void         *pv; /* aligned pointer alias */
98
16.5k
  } u;
99
100
16.5k
  FLAC__ASSERT(elements > 0);
101
16.5k
  FLAC__ASSERT(0 != unaligned_pointer);
102
16.5k
  FLAC__ASSERT(0 != aligned_pointer);
103
16.5k
  FLAC__ASSERT(unaligned_pointer != aligned_pointer);
104
105
16.5k
  if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */
106
0
    return false;
107
108
16.5k
  pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv);
109
16.5k
  if(0 == pu) {
110
0
    return false;
111
0
  }
112
16.5k
  else {
113
16.5k
    if(*unaligned_pointer != 0)
114
0
      free(*unaligned_pointer);
115
16.5k
    *unaligned_pointer = pu;
116
16.5k
    *aligned_pointer = u.pa;
117
16.5k
    return true;
118
16.5k
  }
119
16.5k
}
120
121
FLAC__bool FLAC__memory_alloc_aligned_int64_array(size_t elements, FLAC__int64 **unaligned_pointer, FLAC__int64 **aligned_pointer)
122
23.6k
{
123
23.6k
  FLAC__int64 *pu; /* unaligned pointer */
124
23.6k
  union { /* union needed to comply with C99 pointer aliasing rules */
125
23.6k
    FLAC__int64 *pa; /* aligned pointer */
126
23.6k
    void         *pv; /* aligned pointer alias */
127
23.6k
  } u;
128
129
23.6k
  FLAC__ASSERT(elements > 0);
130
23.6k
  FLAC__ASSERT(0 != unaligned_pointer);
131
23.6k
  FLAC__ASSERT(0 != aligned_pointer);
132
23.6k
  FLAC__ASSERT(unaligned_pointer != aligned_pointer);
133
134
23.6k
  if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */
135
0
    return false;
136
137
23.6k
  pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv);
138
23.6k
  if(0 == pu) {
139
0
    return false;
140
0
  }
141
23.6k
  else {
142
23.6k
    if(*unaligned_pointer != 0)
143
0
      free(*unaligned_pointer);
144
23.6k
    *unaligned_pointer = pu;
145
23.6k
    *aligned_pointer = u.pa;
146
23.6k
    return true;
147
23.6k
  }
148
23.6k
}
149
150
FLAC__bool FLAC__memory_alloc_aligned_uint64_array(size_t elements, FLAC__uint64 **unaligned_pointer, FLAC__uint64 **aligned_pointer)
151
23.6k
{
152
23.6k
  FLAC__uint64 *pu; /* unaligned pointer */
153
23.6k
  union { /* union needed to comply with C99 pointer aliasing rules */
154
23.6k
    FLAC__uint64 *pa; /* aligned pointer */
155
23.6k
    void         *pv; /* aligned pointer alias */
156
23.6k
  } u;
157
158
23.6k
  FLAC__ASSERT(elements > 0);
159
23.6k
  FLAC__ASSERT(0 != unaligned_pointer);
160
23.6k
  FLAC__ASSERT(0 != aligned_pointer);
161
23.6k
  FLAC__ASSERT(unaligned_pointer != aligned_pointer);
162
163
23.6k
  if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */
164
0
    return false;
165
166
23.6k
  pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv);
167
23.6k
  if(0 == pu) {
168
0
    return false;
169
0
  }
170
23.6k
  else {
171
23.6k
    if(*unaligned_pointer != 0)
172
0
      free(*unaligned_pointer);
173
23.6k
    *unaligned_pointer = pu;
174
23.6k
    *aligned_pointer = u.pa;
175
23.6k
    return true;
176
23.6k
  }
177
23.6k
}
178
179
#ifndef FLAC__INTEGER_ONLY_LIBRARY
180
181
FLAC__bool FLAC__memory_alloc_aligned_real_array(size_t elements, FLAC__real **unaligned_pointer, FLAC__real **aligned_pointer)
182
36.9k
{
183
36.9k
  FLAC__real *pu; /* unaligned pointer */
184
36.9k
  union { /* union needed to comply with C99 pointer aliasing rules */
185
36.9k
    FLAC__real *pa; /* aligned pointer */
186
36.9k
    void       *pv; /* aligned pointer alias */
187
36.9k
  } u;
188
189
36.9k
  FLAC__ASSERT(elements > 0);
190
36.9k
  FLAC__ASSERT(0 != unaligned_pointer);
191
36.9k
  FLAC__ASSERT(0 != aligned_pointer);
192
36.9k
  FLAC__ASSERT(unaligned_pointer != aligned_pointer);
193
194
36.9k
  if(elements > SIZE_MAX / sizeof(*pu)) /* overflow check */
195
0
    return false;
196
197
36.9k
  pu = FLAC__memory_alloc_aligned(sizeof(*pu) * elements, &u.pv);
198
36.9k
  if(0 == pu) {
199
0
    return false;
200
0
  }
201
36.9k
  else {
202
36.9k
    if(*unaligned_pointer != 0)
203
0
      free(*unaligned_pointer);
204
36.9k
    *unaligned_pointer = pu;
205
36.9k
    *aligned_pointer = u.pa;
206
36.9k
    return true;
207
36.9k
  }
208
36.9k
}
209
210
#endif
211
212
void *safe_malloc_mul_2op_p(size_t size1, size_t size2)
213
21.4k
{
214
21.4k
  if(!size1 || !size2)
215
0
    return malloc(1); /* malloc(0) is undefined; FLAC src convention is to always allocate */
216
21.4k
  if(size1 > SIZE_MAX / size2)
217
0
    return 0;
218
21.4k
  return malloc(size1*size2);
219
21.4k
}