Skip to content

Commit a258b3c

Browse files
committed
fix reallocarr to adhere to the NetBSD semantics more closely (issue #1271, issue 7)
1 parent f457395 commit a258b3c

1 file changed

Lines changed: 15 additions & 8 deletions

File tree

src/alloc-posix.c

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ mi_decl_nodiscard mi_decl_restrict void* mi_aligned_alloc(size_t alignment, size
9999
return p;
100100
}
101101

102-
mi_decl_nodiscard void* mi_reallocarray( void* p, size_t count, size_t size ) mi_attr_noexcept { // BSD
102+
mi_decl_nodiscard void* mi_reallocarray( void* p, size_t count, size_t size ) mi_attr_noexcept { // BSD <https://man.freebsd.org/cgi/man.cgi?query=reallocarray>
103103
size_t total;
104104
if mi_unlikely(mi_count_size_overflow(count, size, &total)) {
105105
errno = EOVERFLOW;
@@ -110,20 +110,27 @@ mi_decl_nodiscard void* mi_reallocarray( void* p, size_t count, size_t size ) mi
110110
return newp;
111111
}
112112

113-
mi_decl_nodiscard int mi_reallocarr( void* p, size_t count, size_t size ) mi_attr_noexcept { // NetBSD
114-
mi_assert(p != NULL);
115-
if (p == NULL) {
113+
mi_decl_nodiscard int mi_reallocarr( void* p, size_t count, size_t size ) mi_attr_noexcept { // NetBSD <https://man.netbsd.org/reallocarr.3>
114+
mi_assert(size != 0);
115+
if (size == 0) {
116116
return (errno = EINVAL);
117117
}
118118
size_t total;
119119
if mi_unlikely(mi_count_size_overflow(count, size, &total)) {
120120
return (errno = EOVERFLOW);
121121
}
122122
void** op = (void**)p;
123-
void* newp = mi_realloc(*op,total);
124-
if (newp == NULL) { return ENOMEM; }
125-
*op = newp;
126-
return 0;
123+
if (total == 0) {
124+
free(*op);
125+
*op = NULL;
126+
return 0;
127+
}
128+
else {
129+
void* newp = mi_realloc(*op,total);
130+
if (newp == NULL) { return ENOMEM; }
131+
*op = newp;
132+
return 0;
133+
}
127134
}
128135

129136
void* mi__expand(void* p, size_t newsize) mi_attr_noexcept { // Microsoft

0 commit comments

Comments
 (0)