Coverage Report

Created: 2026-08-13 06:07

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