/*
 * Copyright (c) 2008, 2010, 2011, 2016 Otto Moerbeek <otto@drijf.net>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#include "includes.h"

#include <stdlib.h>
#include <string.h>

#ifndef HAVE_FREEZERO

void
freezero(void *ptr, size_t sz)
{
/* NOTE: For performance reasons PKIX-SSH uses function BIO_new_mem_buf.
 * This function marks bio-buffer read-only. When bio instance is
 * destroyed if buffer is read only buffer pointer is set to NULL.
 * After this is called buffer is deallocated (freed).
 * In above process LibreSSL 2.6* start to use freezero() and for
 * deallocation is legal function to be called with NULL argument.
 * LibreSSL links with internally provided freezero that checks
 * for NULL argument.
 *
 * This project also provides function freezero.
 * Because "compat"-library is linked before other libraries,
 * this function is called, but function does not check for NULL
 * pointer argument and result is application crash after use
 * of BIO_new_mem_buf.
 * So lets just check for NULL argument.
 */
	/* This is legal. */
	if (ptr == NULL)
		return;

	explicit_bzero(ptr, sz);
	free(ptr);
}

#endif /* HAVE_FREEZERO */

