Coverage Report

Created: 2026-08-31 06:23

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
4
{
29
4
  void *ptr;
30
31
4
  if (size == 0)
32
0
    fatalx("xmalloc: zero size");
33
4
  ptr = malloc(size);
34
4
  if (ptr == NULL)
35
0
    fatal("xmalloc: allocating %zu bytes", size);
36
4
  return ptr;
37
4
}
38
39
void *
40
xcalloc(size_t nmemb, size_t size)
41
2.34k
{
42
2.34k
  void *ptr;
43
44
2.34k
  if (size == 0 || nmemb == 0)
45
0
    fatalx("xcalloc: zero size");
46
2.34k
  if (SIZE_MAX / nmemb < size)
47
0
    fatalx("xcalloc: nmemb * size > SIZE_MAX");
48
2.34k
  ptr = calloc(nmemb, size);
49
2.34k
  if (ptr == NULL)
50
0
    fatal("xcalloc: allocating %zu bytes", size * nmemb);
51
2.34k
  return ptr;
52
2.34k
}
53
54
void *
55
xrealloc(void *ptr, size_t size)
56
4.75k
{
57
4.75k
  return xreallocarray(ptr, 1, size);
58
4.75k
}
59
60
void *
61
xreallocarray(void *ptr, size_t nmemb, size_t size)
62
9.47k
{
63
9.47k
  void *new_ptr;
64
65
9.47k
  if (nmemb == 0 || size == 0)
66
0
    fatalx("xreallocarray: zero size");
67
9.47k
  new_ptr = reallocarray(ptr, nmemb, size);
68
9.47k
  if (new_ptr == NULL)
69
0
    fatal("xreallocarray: allocating %zu bytes", size * nmemb);
70
9.47k
  return new_ptr;
71
9.47k
}
72
73
void *
74
xrecallocarray(void *ptr, size_t oldnmemb, size_t nmemb, size_t size)
75
2
{
76
2
  void *new_ptr;
77
78
2
  if (nmemb == 0 || size == 0)
79
0
    fatalx("xrecallocarray: zero size");
80
2
  new_ptr = recallocarray(ptr, oldnmemb, nmemb, size);
81
2
  if (new_ptr == NULL)
82
0
    fatal("xrecallocarray: allocating %zu bytes", size * nmemb);
83
2
  return new_ptr;
84
2
}
85
86
char *
87
xstrdup(const char *str)
88
850
{
89
850
  char *cp;
90
91
850
  if ((cp = strdup(str)) == NULL)
92
0
    fatal("xstrdup");
93
850
  return cp;
94
850
}
95
96
char *
97
xstrndup(const char *str, size_t maxlen)
98
0
{
99
0
  char *cp;
100
101
0
  if ((cp = strndup(str, maxlen)) == NULL)
102
0
    fatal("xstrndup");
103
0
  return cp;
104
0
}
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
2.00k
{
121
2.00k
  va_list ap;
122
2.00k
  int i;
123
124
2.00k
  va_start(ap, fmt);
125
2.00k
  i = xvasprintf(ret, fmt, ap);
126
2.00k
  va_end(ap);
127
2.00k
  return i;
128
2.00k
}
129
130
int
131
xvasprintf(char **ret, const char *fmt, va_list ap)
132
2.24k
{
133
2.24k
  int i;
134
135
2.24k
  i = vasprintf(ret, fmt, ap);
136
2.24k
  if (i == -1 || *ret == NULL)
137
0
    fatal("xvasprintf");
138
2.24k
  return i;
139
2.24k
}
140
141
int
142
xsnprintf(char *str, size_t len, const char *fmt, ...)
143
52
{
144
52
  va_list ap;
145
52
  int i;
146
147
52
  va_start(ap, fmt);
148
52
  i = xvsnprintf(str, len, fmt, ap);
149
52
  va_end(ap);
150
52
  return i;
151
52
}
152
153
int
154
xvsnprintf(char *str, size_t len, const char *fmt, va_list ap)
155
52
{
156
52
  int i;
157
158
52
  if (len > INT_MAX)
159
0
    fatalx("xsnprintf: len > INT_MAX");
160
52
  i = vsnprintf(str, len, fmt, ap);
161
52
  if (i < 0 || i >= (int)len)
162
0
    fatalx("xsnprintf: overflow");
163
52
  return i;
164
52
}