Coverage Report

Created: 2026-09-03 06:29

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/tmux/xmalloc.c
Line
Count
Source
1
/* $OpenBSD: xmalloc.c,v 1.15 2026/07/12 20:16:20 nicm Exp $ */
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
44.2k
{
29
44.2k
  void *ptr;
30
31
44.2k
  if (size == 0)
32
0
    fatalx("xmalloc: zero size");
33
44.2k
  ptr = malloc(size);
34
44.2k
  if (ptr == NULL)
35
0
    fatal("xmalloc: allocating %zu bytes", size);
36
44.2k
  return ptr;
37
44.2k
}
38
39
void *
40
xcalloc(size_t nmemb, size_t size)
41
344k
{
42
344k
  void *ptr;
43
44
344k
  if (size == 0 || nmemb == 0)
45
0
    fatalx("xcalloc: zero size");
46
344k
  if (SIZE_MAX / nmemb < size)
47
0
    fatalx("xcalloc: nmemb * size > SIZE_MAX");
48
344k
  ptr = calloc(nmemb, size);
49
344k
  if (ptr == NULL)
50
0
    fatal("xcalloc: allocating %zu bytes", size * nmemb);
51
344k
  return ptr;
52
344k
}
53
54
void *
55
xrealloc(void *ptr, size_t size)
56
30.4k
{
57
30.4k
  return xreallocarray(ptr, 1, size);
58
30.4k
}
59
60
void *
61
xreallocarray(void *ptr, size_t nmemb, size_t size)
62
164k
{
63
164k
  void *new_ptr;
64
65
164k
  if (nmemb == 0 || size == 0)
66
0
    fatalx("xreallocarray: zero size");
67
164k
  new_ptr = reallocarray(ptr, nmemb, size);
68
164k
  if (new_ptr == NULL)
69
0
    fatal("xreallocarray: allocating %zu bytes", size * nmemb);
70
164k
  return new_ptr;
71
164k
}
72
73
void *
74
xrecallocarray(void *ptr, size_t oldnmemb, size_t nmemb, size_t size)
75
12.6k
{
76
12.6k
  void *new_ptr;
77
78
12.6k
  if (nmemb == 0 || size == 0)
79
0
    fatalx("xrecallocarray: zero size");
80
12.6k
  new_ptr = recallocarray(ptr, oldnmemb, nmemb, size);
81
12.6k
  if (new_ptr == NULL)
82
0
    fatal("xrecallocarray: allocating %zu bytes", size * nmemb);
83
12.6k
  return new_ptr;
84
12.6k
}
85
86
char *
87
xstrdup(const char *str)
88
171k
{
89
171k
  char *cp;
90
91
171k
  if ((cp = strdup(str)) == NULL)
92
0
    fatal("xstrdup");
93
171k
  return cp;
94
171k
}
95
96
char *
97
xstrndup(const char *str, size_t maxlen)
98
5.01k
{
99
5.01k
  char *cp;
100
101
5.01k
  if ((cp = strndup(str, maxlen)) == NULL)
102
0
    fatal("xstrndup");
103
5.01k
  return cp;
104
5.01k
}
105
106
char *
107
xmemdup(const void *ptr, size_t len)
108
0
{
109
0
  char *cp;
110
111
0
  cp = xmalloc(len + 1);
112
0
  if (len != 0)
113
0
    memcpy(cp, ptr, len);
114
0
  cp[len] = '\0';
115
0
  return cp;
116
0
}
117
118
int
119
xasprintf(char **ret, const char *fmt, ...)
120
8.49k
{
121
8.49k
  va_list ap;
122
8.49k
  int i;
123
124
8.49k
  va_start(ap, fmt);
125
8.49k
  i = xvasprintf(ret, fmt, ap);
126
8.49k
  va_end(ap);
127
8.49k
  return i;
128
8.49k
}
129
130
int
131
xvasprintf(char **ret, const char *fmt, va_list ap)
132
55.4k
{
133
55.4k
  int i;
134
135
55.4k
  i = vasprintf(ret, fmt, ap);
136
55.4k
  if (i == -1 || *ret == NULL)
137
0
    fatal("xvasprintf");
138
55.4k
  return i;
139
55.4k
}
140
141
int
142
xsnprintf(char *str, size_t len, const char *fmt, ...)
143
1.01k
{
144
1.01k
  va_list ap;
145
1.01k
  int i;
146
147
1.01k
  va_start(ap, fmt);
148
1.01k
  i = xvsnprintf(str, len, fmt, ap);
149
1.01k
  va_end(ap);
150
1.01k
  return i;
151
1.01k
}
152
153
int
154
xvsnprintf(char *str, size_t len, const char *fmt, va_list ap)
155
1.01k
{
156
1.01k
  int i;
157
158
1.01k
  if (len > INT_MAX)
159
0
    fatalx("xsnprintf: len > INT_MAX");
160
1.01k
  i = vsnprintf(str, len, fmt, ap);
161
1.01k
  if (i < 0 || i >= (int)len)
162
0
    fatalx("xsnprintf: overflow");
163
1.01k
  return i;
164
1.01k
}