Coverage Report

Created: 2026-05-30 06:39

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/tmux/xmalloc.c
Line
Count
Source
1
/* $OpenBSD$ */
2
3
/*
4
 * Author: Tatu Ylonen <ylo@cs.hut.fi>
5
 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
6
 *                    All rights reserved
7
 * Versions of malloc and friends that check their results, and never return
8
 * failure (they call fatalx if they encounter an error).
9
 *
10
 * As far as I am concerned, the code I have written for this software
11
 * can be used freely for any purpose.  Any derived versions of this
12
 * software must be clearly marked as such, and if the derived work is
13
 * incompatible with the protocol description in the RFC file, it must be
14
 * called by a name other than "ssh" or "Secure Shell".
15
 */
16
17
#include <errno.h>
18
#include <limits.h>
19
#include <stdint.h>
20
#include <stdio.h>
21
#include <stdlib.h>
22
#include <string.h>
23
24
#include "tmux.h"
25
26
void *
27
xmalloc(size_t size)
28
59.8k
{
29
59.8k
  void *ptr;
30
31
59.8k
  if (size == 0)
32
0
    fatalx("xmalloc: zero size");
33
59.8k
  ptr = malloc(size);
34
59.8k
  if (ptr == NULL)
35
0
    fatalx("xmalloc: allocating %zu bytes: %s",
36
0
        size, strerror(errno));
37
59.8k
  return ptr;
38
59.8k
}
39
40
void *
41
xcalloc(size_t nmemb, size_t size)
42
153k
{
43
153k
  void *ptr;
44
45
153k
  if (size == 0 || nmemb == 0)
46
0
    fatalx("xcalloc: zero size");
47
153k
  ptr = calloc(nmemb, size);
48
153k
  if (ptr == NULL)
49
0
    fatalx("xcalloc: allocating %zu * %zu bytes: %s",
50
0
        nmemb, size, strerror(errno));
51
153k
  return ptr;
52
153k
}
53
54
void *
55
xrealloc(void *ptr, size_t size)
56
28.3k
{
57
28.3k
  return xreallocarray(ptr, 1, size);
58
28.3k
}
59
60
void *
61
xreallocarray(void *ptr, size_t nmemb, size_t size)
62
168k
{
63
168k
  void *new_ptr;
64
65
168k
  if (nmemb == 0 || size == 0)
66
0
    fatalx("xreallocarray: zero size");
67
168k
  new_ptr = reallocarray(ptr, nmemb, size);
68
168k
  if (new_ptr == NULL)
69
0
    fatalx("xreallocarray: allocating %zu * %zu bytes: %s",
70
0
        nmemb, size, strerror(errno));
71
168k
  return new_ptr;
72
168k
}
73
74
void *
75
xrecallocarray(void *ptr, size_t oldnmemb, size_t nmemb, size_t size)
76
11.5k
{
77
11.5k
  void *new_ptr;
78
79
11.5k
  if (nmemb == 0 || size == 0)
80
0
    fatalx("xrecallocarray: zero size");
81
11.5k
  new_ptr = recallocarray(ptr, oldnmemb, nmemb, size);
82
11.5k
  if (new_ptr == NULL)
83
0
    fatalx("xrecallocarray: allocating %zu * %zu bytes: %s",
84
0
        nmemb, size, strerror(errno));
85
11.5k
  return new_ptr;
86
11.5k
}
87
88
char *
89
xstrdup(const char *str)
90
182k
{
91
182k
  char *cp;
92
93
182k
  if ((cp = strdup(str)) == NULL)
94
0
    fatalx("xstrdup: %s", strerror(errno));
95
182k
  return cp;
96
182k
}
97
98
char *
99
xstrndup(const char *str, size_t maxlen)
100
4.97k
{
101
4.97k
  char *cp;
102
103
4.97k
  if ((cp = strndup(str, maxlen)) == NULL)
104
0
    fatalx("xstrndup: %s", strerror(errno));
105
4.97k
  return cp;
106
4.97k
}
107
108
int
109
xasprintf(char **ret, const char *fmt, ...)
110
20.6k
{
111
20.6k
  va_list ap;
112
20.6k
  int i;
113
114
20.6k
  va_start(ap, fmt);
115
20.6k
  i = xvasprintf(ret, fmt, ap);
116
20.6k
  va_end(ap);
117
118
20.6k
  return i;
119
20.6k
}
120
121
int
122
xvasprintf(char **ret, const char *fmt, va_list ap)
123
61.9k
{
124
61.9k
  int i;
125
126
61.9k
  i = vasprintf(ret, fmt, ap);
127
128
61.9k
  if (i == -1)
129
0
    fatalx("xasprintf: %s", strerror(errno));
130
131
61.9k
  return i;
132
61.9k
}
133
134
int
135
xsnprintf(char *str, size_t len, const char *fmt, ...)
136
7.51k
{
137
7.51k
  va_list ap;
138
7.51k
  int i;
139
140
7.51k
  va_start(ap, fmt);
141
7.51k
  i = xvsnprintf(str, len, fmt, ap);
142
7.51k
  va_end(ap);
143
144
7.51k
  return i;
145
7.51k
}
146
147
int
148
xvsnprintf(char *str, size_t len, const char *fmt, va_list ap)
149
7.51k
{
150
7.51k
  int i;
151
152
7.51k
  if (len > INT_MAX)
153
0
    fatalx("xsnprintf: len > INT_MAX");
154
155
7.51k
  i = vsnprintf(str, len, fmt, ap);
156
157
7.51k
  if (i < 0 || i >= (int)len)
158
0
    fatalx("xsnprintf: overflow");
159
160
7.51k
  return i;
161
7.51k
}