char *BUF_strndup(const char *str, size_t siz)
{
    char *ret;

    if (str == NULL)
        return NULL;

    siz = BUF_strnlen(str, siz);

    if (siz >= INT_MAX)
        return NULL;

    ret = OPENSSL_malloc(siz + 1);
    if (ret == NULL) {
        BUFerr(BUF_F_BUF_STRNDUP, ERR_R_MALLOC_FAILURE);
        return NULL;
    }

    memcpy(ret, str, siz);
    ret[siz] = '\0';

    return (ret);
}