Coverage Report

Created: 2026-09-03 06:36

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