Coverage Report

Created: 2025-03-06 06:58

/src/wget/lib/ialloc.h
Line
Count
Source (jump to first uncovered line)
1
/* ialloc.h -- malloc with idx_t rather than size_t
2
3
   Copyright 2021-2025 Free Software Foundation, Inc.
4
5
   This file is free software: you can redistribute it and/or modify
6
   it under the terms of the GNU Lesser General Public License as
7
   published by the Free Software Foundation; either version 2.1 of the
8
   License, or (at your option) any later version.
9
10
   This file is distributed in the hope that it will be useful,
11
   but WITHOUT ANY WARRANTY; without even the implied warranty of
12
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
   GNU Lesser General Public License for more details.
14
15
   You should have received a copy of the GNU Lesser General Public License
16
   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
17
18
#ifndef IALLOC_H_
19
#define IALLOC_H_
20
21
/* This file uses _GL_INLINE_HEADER_BEGIN, _GL_INLINE, _GL_ATTRIBUTE_COLD,
22
   _GL_ATTRIBUTE_MALLOC.  */
23
#if !_GL_CONFIG_H_INCLUDED
24
 #error "Please include config.h first."
25
#endif
26
27
#include "idx.h"
28
29
#include <errno.h>
30
#include <stdint.h>
31
#include <stdlib.h>
32
33
_GL_INLINE_HEADER_BEGIN
34
#ifndef IALLOC_INLINE
35
# define IALLOC_INLINE _GL_INLINE
36
#endif
37
38
#ifdef __cplusplus
39
extern "C" {
40
#endif
41
42
IALLOC_INLINE void * _GL_ATTRIBUTE_COLD
43
_gl_alloc_nomem (void)
44
0
{
45
0
  errno = ENOMEM;
46
0
  return NULL;
47
0
}
48
49
/* imalloc (size) is like malloc (size).
50
   It returns a non-NULL pointer to size bytes of memory.
51
   Upon failure, it returns NULL with errno set.  */
52
IALLOC_INLINE
53
_GL_ATTRIBUTE_MALLOC /*_GL_ATTRIBUTE_DEALLOC_FREE*/
54
void *
55
imalloc (idx_t s)
56
0
{
57
0
  return s <= SIZE_MAX ? malloc (s) : _gl_alloc_nomem ();
58
0
}
59
60
/* irealloc (ptr, size) is like realloc (ptr, size).
61
   It returns a non-NULL pointer to size bytes of memory.
62
   Upon failure, it returns NULL with errno set.  */
63
IALLOC_INLINE
64
/*_GL_ATTRIBUTE_DEALLOC_FREE*/
65
void *
66
irealloc (void *p, idx_t s)
67
0
{
68
0
  return s <= SIZE_MAX ? realloc (p, s) : _gl_alloc_nomem ();
69
0
}
70
71
/* icalloc (num, size) is like calloc (num, size).
72
   It returns a non-NULL pointer to num * size bytes of memory.
73
   Upon failure, it returns NULL with errno set.  */
74
IALLOC_INLINE
75
_GL_ATTRIBUTE_MALLOC /*_GL_ATTRIBUTE_DEALLOC_FREE*/
76
void *
77
icalloc (idx_t n, idx_t s)
78
0
{
79
0
  if (SIZE_MAX < n)
80
0
    {
81
0
      if (s != 0)
82
0
        return _gl_alloc_nomem ();
83
0
      n = 0;
84
0
    }
85
0
  if (SIZE_MAX < s)
86
0
    {
87
0
      if (n != 0)
88
0
        return _gl_alloc_nomem ();
89
0
      s = 0;
90
0
    }
91
0
  return calloc (n, s);
92
0
}
93
94
/* ireallocarray (ptr, num, size) is like reallocarray (ptr, num, size).
95
   It returns a non-NULL pointer to num * size bytes of memory.
96
   Upon failure, it returns NULL with errno set.  */
97
IALLOC_INLINE void *
98
ireallocarray (void *p, idx_t n, idx_t s)
99
0
{
100
0
  return (n <= SIZE_MAX && s <= SIZE_MAX
101
0
          ? reallocarray (p, n, s)
102
0
          : _gl_alloc_nomem ());
103
0
}
104
105
#ifdef __cplusplus
106
}
107
#endif
108
109
_GL_INLINE_HEADER_END
110
111
#endif