Blame tests/check_header.c

Packit Service 0ee8e1
// SPDX-License-Identifier: LGPL-2.1-or-later
Packit Service 0ee8e1
/*
Packit Service 0ee8e1
 * libfdt - Flat Device Tree manipulation
Packit Service 0ee8e1
 *	Testcase for fdt_check_header
Packit Service 0ee8e1
 * Copyright (C) 2018 David Gibson
Packit Service 0ee8e1
 */
Packit Service 0ee8e1
Packit Service 0ee8e1
#include <stdio.h>
Packit Service 0ee8e1
Packit Service 0ee8e1
#include <libfdt.h>
Packit Service 0ee8e1
Packit Service 0ee8e1
#include "tests.h"
Packit Service 0ee8e1
Packit Service 0ee8e1
static void *dtdup(void *dt)
Packit Service 0ee8e1
{
Packit Service 0ee8e1
	size_t bufsize = fdt_totalsize(dt);
Packit Service 0ee8e1
	void *buf = xmalloc(bufsize);
Packit Service 0ee8e1
	fdt_move(dt, buf, bufsize);
Packit Service 0ee8e1
	return buf;
Packit Service 0ee8e1
}
Packit Service 0ee8e1
Packit Service 0ee8e1
#define CHECK_MANGLE(exerr, code)					\
Packit Service 0ee8e1
	do {								\
Packit Service 0ee8e1
		void *fdt = dtdup(template);				\
Packit Service 0ee8e1
		{ code }						\
Packit Service 0ee8e1
		err = fdt_check_header(fdt);				\
Packit Service 0ee8e1
		verbose_printf("\"%s\" => %s\n", #code, fdt_strerror(err)); \
Packit Service 0ee8e1
		if (err != (exerr))					\
Packit Service 0ee8e1
			FAIL("fdt_check_header() didn't catch mangle %s", \
Packit Service 0ee8e1
			     #code);					\
Packit Service 0ee8e1
		free(fdt);						\
Packit Service 0ee8e1
	} while (0)
Packit Service 0ee8e1
Packit Service 0ee8e1
int main(int argc, char *argv[])
Packit Service 0ee8e1
{
Packit Service 0ee8e1
	void *template;
Packit Service 0ee8e1
	int err;
Packit Service 0ee8e1
Packit Service 0ee8e1
	test_init(argc, argv);
Packit Service 0ee8e1
	template = load_blob(argv[1]);
Packit Service 0ee8e1
Packit Service 0ee8e1
	/* Check that the base dt is valid before mangling it */
Packit Service 0ee8e1
	err = fdt_check_header(template);
Packit Service 0ee8e1
	if (err != 0)
Packit Service 0ee8e1
		FAIL("Base tree fails: %s", fdt_strerror(err));
Packit Service 0ee8e1
Packit Service 0ee8e1
	/* Check a no-op mangle doesn't break things */
Packit Service 0ee8e1
	CHECK_MANGLE(0, ; );
Packit Service 0ee8e1
Packit Service 0ee8e1
	/* Mess up the magic number */
Packit Service 0ee8e1
	CHECK_MANGLE(-FDT_ERR_BADMAGIC,
Packit Service 0ee8e1
		fdt_set_magic(fdt, fdt_magic(fdt) ^ 0x1);
Packit Service 0ee8e1
	);
Packit Service 0ee8e1
	CHECK_MANGLE(-FDT_ERR_BADMAGIC,
Packit Service 0ee8e1
		fdt_set_magic(fdt, fdt_magic(fdt) ^ 0x80000000);
Packit Service 0ee8e1
	);
Packit Service 0ee8e1
Packit Service 0ee8e1
	/* Mess up the version */
Packit Service 0ee8e1
	CHECK_MANGLE(-FDT_ERR_BADVERSION,
Packit Service 0ee8e1
		fdt_set_version(fdt, FDT_FIRST_SUPPORTED_VERSION - 1);
Packit Service 0ee8e1
		fdt_set_last_comp_version(fdt, FDT_FIRST_SUPPORTED_VERSION - 1);
Packit Service 0ee8e1
	);
Packit Service 0ee8e1
	CHECK_MANGLE(-FDT_ERR_BADVERSION,
Packit Service 0ee8e1
		fdt_set_version(fdt, FDT_LAST_SUPPORTED_VERSION + 1);
Packit Service 0ee8e1
		fdt_set_last_comp_version(fdt, FDT_LAST_SUPPORTED_VERSION + 1);
Packit Service 0ee8e1
	);
Packit Service 0ee8e1
	CHECK_MANGLE(-FDT_ERR_BADVERSION,
Packit Service 0ee8e1
		fdt_set_version(fdt, FDT_FIRST_SUPPORTED_VERSION);
Packit Service 0ee8e1
		fdt_set_last_comp_version(fdt, FDT_LAST_SUPPORTED_VERSION);
Packit Service 0ee8e1
	);
Packit Service 0ee8e1
Packit Service 0ee8e1
	/* Out of bounds sizes */
Packit Service 0ee8e1
	CHECK_MANGLE(-FDT_ERR_TRUNCATED,
Packit Service 0ee8e1
		fdt_set_totalsize(fdt, FDT_V1_SIZE - 1);
Packit Service 0ee8e1
	);
Packit Service 0ee8e1
	CHECK_MANGLE(-FDT_ERR_TRUNCATED,
Packit Service 0ee8e1
		     fdt_set_totalsize(fdt, (uint32_t)INT_MAX + 1);
Packit Service 0ee8e1
	);
Packit Service 0ee8e1
Packit Service 0ee8e1
	/* Truncate within various blocks */
Packit Service 0ee8e1
	CHECK_MANGLE(-FDT_ERR_TRUNCATED,
Packit Service 0ee8e1
		fdt_set_totalsize(fdt, fdt_off_dt_struct(fdt) - 1);
Packit Service 0ee8e1
	);
Packit Service 0ee8e1
	CHECK_MANGLE(-FDT_ERR_TRUNCATED,
Packit Service 0ee8e1
		fdt_set_totalsize(fdt, fdt_off_dt_strings(fdt) - 1);
Packit Service 0ee8e1
	);
Packit Service 0ee8e1
	CHECK_MANGLE(-FDT_ERR_TRUNCATED,
Packit Service 0ee8e1
		fdt_set_totalsize(fdt, fdt_off_mem_rsvmap(fdt) - 1);
Packit Service 0ee8e1
	);
Packit Service 0ee8e1
	CHECK_MANGLE(-FDT_ERR_TRUNCATED,
Packit Service 0ee8e1
		fdt_set_totalsize(fdt, fdt_off_dt_struct(fdt) + 1);
Packit Service 0ee8e1
	);
Packit Service 0ee8e1
	CHECK_MANGLE(-FDT_ERR_TRUNCATED,
Packit Service 0ee8e1
		fdt_set_totalsize(fdt, fdt_off_dt_strings(fdt) + 1);
Packit Service 0ee8e1
	);
Packit Service 0ee8e1
	CHECK_MANGLE(-FDT_ERR_TRUNCATED,
Packit Service 0ee8e1
		fdt_set_totalsize(fdt, fdt_off_mem_rsvmap(fdt) + 1);
Packit Service 0ee8e1
	);
Packit Service 0ee8e1
Packit Service 0ee8e1
	/* Negative block sizes */
Packit Service 0ee8e1
	CHECK_MANGLE(-FDT_ERR_TRUNCATED,
Packit Service 0ee8e1
		fdt_set_size_dt_struct(fdt, (uint32_t)-1);
Packit Service 0ee8e1
	);
Packit Service 0ee8e1
	CHECK_MANGLE(-FDT_ERR_TRUNCATED,
Packit Service 0ee8e1
		fdt_set_size_dt_strings(fdt, (uint32_t)-1);
Packit Service 0ee8e1
	);
Packit Service 0ee8e1
	CHECK_MANGLE(-FDT_ERR_TRUNCATED,
Packit Service 0ee8e1
		     fdt_set_size_dt_struct(fdt, (uint32_t)INT_MIN);
Packit Service 0ee8e1
	);
Packit Service 0ee8e1
	CHECK_MANGLE(-FDT_ERR_TRUNCATED,
Packit Service 0ee8e1
		fdt_set_size_dt_strings(fdt, (uint32_t)INT_MIN);
Packit Service 0ee8e1
	);
Packit Service 0ee8e1
Packit Service 0ee8e1
	PASS();
Packit Service 0ee8e1
}