1*cc7d2833Sskrll /* $NetBSD: rw_oom.c,v 1.1.1.1 2019/12/22 12:34:06 skrll Exp $ */
2*cc7d2833Sskrll
3*cc7d2833Sskrll // SPDX-License-Identifier: LGPL-2.1-or-later
4*cc7d2833Sskrll /*
5*cc7d2833Sskrll * libfdt - Flat Device Tree manipulation
6*cc7d2833Sskrll * Testcase for fdt_nop_node()
7*cc7d2833Sskrll * Copyright (C) 2006 David Gibson, IBM Corporation.
8*cc7d2833Sskrll */
9*cc7d2833Sskrll
10*cc7d2833Sskrll #include <stdlib.h>
11*cc7d2833Sskrll #include <stdio.h>
12*cc7d2833Sskrll #include <string.h>
13*cc7d2833Sskrll #include <ctype.h>
14*cc7d2833Sskrll #include <stdint.h>
15*cc7d2833Sskrll
16*cc7d2833Sskrll #include <libfdt.h>
17*cc7d2833Sskrll
18*cc7d2833Sskrll #include "tests.h"
19*cc7d2833Sskrll #include "testdata.h"
20*cc7d2833Sskrll
21*cc7d2833Sskrll /* This is not derived programmatically. May require adjustment to changes. */
22*cc7d2833Sskrll #define SPACE 285
23*cc7d2833Sskrll
24*cc7d2833Sskrll #define CHECK(code) \
25*cc7d2833Sskrll { \
26*cc7d2833Sskrll err = (code); \
27*cc7d2833Sskrll if (err) \
28*cc7d2833Sskrll FAIL(#code ": %s", fdt_strerror(err)); \
29*cc7d2833Sskrll }
30*cc7d2833Sskrll
31*cc7d2833Sskrll #define OFF_CHECK(off, code) \
32*cc7d2833Sskrll { \
33*cc7d2833Sskrll (off) = (code); \
34*cc7d2833Sskrll if (off < 0) \
35*cc7d2833Sskrll FAIL(#code ": %s", fdt_strerror(off)); \
36*cc7d2833Sskrll }
37*cc7d2833Sskrll
main(int argc,char * argv[])38*cc7d2833Sskrll int main(int argc, char *argv[])
39*cc7d2833Sskrll {
40*cc7d2833Sskrll void *fdt;
41*cc7d2833Sskrll int err;
42*cc7d2833Sskrll int offset, s1;
43*cc7d2833Sskrll int strsize1, strsize2;
44*cc7d2833Sskrll
45*cc7d2833Sskrll /*
46*cc7d2833Sskrll * Check OOM path, and check that property is cleaned up if it fails
47*cc7d2833Sskrll * with OOM, rather than adding an orphan name.
48*cc7d2833Sskrll *
49*cc7d2833Sskrll * SW OOM is tested with the realloc/resize strategies.
50*cc7d2833Sskrll */
51*cc7d2833Sskrll test_init(argc, argv);
52*cc7d2833Sskrll
53*cc7d2833Sskrll fdt = xmalloc(SPACE);
54*cc7d2833Sskrll
55*cc7d2833Sskrll /* First create empty tree with SW */
56*cc7d2833Sskrll CHECK(fdt_create_empty_tree(fdt, SPACE));
57*cc7d2833Sskrll
58*cc7d2833Sskrll CHECK(fdt_add_mem_rsv(fdt, TEST_ADDR_1, TEST_SIZE_1));
59*cc7d2833Sskrll CHECK(fdt_add_mem_rsv(fdt, TEST_ADDR_2, TEST_SIZE_2));
60*cc7d2833Sskrll
61*cc7d2833Sskrll CHECK(fdt_setprop_string(fdt, 0, "compatible", "test_oom"));
62*cc7d2833Sskrll CHECK(fdt_setprop_u32(fdt, 0, "prop-int", TEST_VALUE_1));
63*cc7d2833Sskrll CHECK(fdt_setprop_u64(fdt, 0, "prop-int64", TEST_VALUE64_1));
64*cc7d2833Sskrll CHECK(fdt_setprop_string(fdt, 0, "prop-str", TEST_STRING_1));
65*cc7d2833Sskrll
66*cc7d2833Sskrll OFF_CHECK(offset, fdt_add_subnode(fdt, 0, "subnode@1"));
67*cc7d2833Sskrll s1 = offset;
68*cc7d2833Sskrll
69*cc7d2833Sskrll strsize1 = fdt_size_dt_strings(fdt);
70*cc7d2833Sskrll err = fdt_setprop_string(fdt, s1, "unique", "subnode1");
71*cc7d2833Sskrll if (err != -FDT_ERR_NOSPACE)
72*cc7d2833Sskrll FAIL("fdt_setprop_string(fdt, s1, \"compatible\", \"subnode1\"): %s", fdt_strerror(err));
73*cc7d2833Sskrll strsize2 = fdt_size_dt_strings(fdt);
74*cc7d2833Sskrll
75*cc7d2833Sskrll if (strsize1 != strsize2)
76*cc7d2833Sskrll FAIL("fdt_setprop NOSPACE error failed to clean up allocated string\n");
77*cc7d2833Sskrll err = 0;
78*cc7d2833Sskrll
79*cc7d2833Sskrll /* Ensure we failed in the right place */
80*cc7d2833Sskrll CHECK(fdt_setprop_string(fdt, s1, "unique", ""));
81*cc7d2833Sskrll
82*cc7d2833Sskrll CHECK(fdt_pack(fdt));
83*cc7d2833Sskrll
84*cc7d2833Sskrll PASS();
85*cc7d2833Sskrll }
86