Coverage Report

Created: 2023-03-26 07:33

/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-2023 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
#include "idx.h"
22
23
#include <errno.h>
24
#include <stdint.h>
25
#include <stdlib.h>
26
27
#ifndef _GL_INLINE_HEADER_BEGIN
28
 #error "Please include config.h first."
29
#endif
30
_GL_INLINE_HEADER_BEGIN
31
#ifndef IALLOC_INLINE
32
# define IALLOC_INLINE _GL_INLINE
33
#endif
34
35
#ifdef __cplusplus
36
extern "C" {
37
#endif
38
39
IALLOC_INLINE void * _GL_ATTRIBUTE_COLD
40
_gl_alloc_nomem (void)
41
0
{
42
0
  errno = ENOMEM;
43
0
  return NULL;
44
0
}
45
46
IALLOC_INLINE
47
_GL_ATTRIBUTE_MALLOC /*_GL_ATTRIBUTE_DEALLOC_FREE*/
48
void *
49
imalloc (idx_t s)
50
0
{
51
0
  return s <= SIZE_MAX ? malloc (s) : _gl_alloc_nomem ();
52
0
}
53
54
IALLOC_INLINE
55
/*_GL_ATTRIBUTE_DEALLOC_FREE*/
56
void *
57
irealloc (void *p, idx_t s)
58
0
{
59
  /* Work around GNU realloc glitch by treating a zero size as if it
60
     were 1, so that returning NULL is equivalent to failing.  */
61
0
  return s <= SIZE_MAX ? realloc (p, s | !s) : _gl_alloc_nomem ();
62
0
}
63
64
IALLOC_INLINE
65
_GL_ATTRIBUTE_MALLOC /*_GL_ATTRIBUTE_DEALLOC_FREE*/
66
void *
67
icalloc (idx_t n, idx_t s)
68
0
{
69
0
  if (SIZE_MAX < n)
70
0
    {
71
0
      if (s != 0)
72
0
        return _gl_alloc_nomem ();
73
0
      n = 0;
74
0
    }
75
0
  if (SIZE_MAX < s)
76
0
    {
77
0
      if (n != 0)
78
0
        return _gl_alloc_nomem ();
79
0
      s = 0;
80
0
    }
81
0
  return calloc (n, s);
82
0
}
83
84
IALLOC_INLINE void *
85
ireallocarray (void *p, idx_t n, idx_t s)
86
0
{
87
  /* Work around GNU reallocarray glitch by treating a zero size as if
88
     it were 1, so that returning NULL is equivalent to failing.  */
89
0
  if (n == 0 || s == 0)
90
0
    n = s = 1;
91
0
  return (n <= SIZE_MAX && s <= SIZE_MAX
92
0
          ? reallocarray (p, n, s)
93
0
          : _gl_alloc_nomem ());
94
0
}
95
96
#ifdef __cplusplus
97
}
98
#endif
99
100
#endif