On 2020-08-02 16:54:26 -0600, Ariadne Conill wrote: > +void *recallocarray(void *ptr, size_t om, size_t m, size_t n) > +{ > + void *newptr; > + size_t old_size, new_size; > + > + if (n && m > -1 / n) { > + errno = ENOMEM; > + return 0; > + } > + new_size = m * n; > + > + if (n && om > -1 / n) { > + errno = EINVAL; > + return 0; > + } > + old_size = om * n; > + > + newptr = calloc(m, n); > + if (!newptr) > + return ptr; From reading openbsd's source I would say this should return 0 (or newptr), not ptr. Otherwise I'm not sure how the caller could tell if the resize failed or not. > + > + if (new_size <= old_size) { > + memcpy((char *) newptr, ptr, new_size); > + } > + else { > + memcpy((char *) newptr, ptr, old_size); > + memset((char *) newptr + old_size, 0, new_size - old_size); > + } > + > + memset(ptr, 0, old_size); > + free(ptr); > + > + return newptr; > +} W. -- There are only two hard things in Computer Science: cache invalidation, naming things and off-by-one errors.