1 /*
2  * This file and its contents are supplied under the terms of the
3  * Common Development and Distribution License ("CDDL"), version 1.0.
4  * You may only use this file in accordance with the terms of version
5  * 1.0 of the CDDL.
6  *
7  * A full copy of the text of the CDDL should have accompanied this
8  * source.  A copy of the CDDL is also available via the Internet at
9  * http://www.illumos.org/license/CDDL.
10  */
11 
12 /*
13  * Copyright 2021 Oxide Computer Company
14  */
15 
16 /*
17  * Tests for SMBIOS type 46 - SMB_TYPE_STRPROP.
18  */
19 
20 #include "smbios_test.h"
21 
22 static const char *smbios_strprop_path = "/not/really/uefi";
23 static uint16_t smbios_strprop_hdl = 0xcafe;
24 
25 boolean_t
smbios_test_strprop_mktable_basic(smbios_test_table_t * table)26 smbios_test_strprop_mktable_basic(smbios_test_table_t *table)
27 {
28 	smb_strprop_t str;
29 
30 	str.smbstrp_hdr.smbh_type = SMB_TYPE_STRPROP;
31 	str.smbstrp_hdr.smbh_len = sizeof (str);
32 	str.smbstrp_prop_id = htole16(SMB_STRP_UEFI_DEVPATH);
33 	str.smbstrp_prop_val = 1;
34 	str.smbstrp_phdl = htole16(smbios_strprop_hdl);
35 
36 	(void) smbios_test_table_append(table, &str, sizeof (str));
37 	smbios_test_table_append_string(table, smbios_strprop_path);
38 	smbios_test_table_str_fini(table);
39 	smbios_test_table_append_eot(table);
40 
41 	return (B_TRUE);
42 }
43 
44 boolean_t
smbios_test_strprop_mktable_badstr(smbios_test_table_t * table)45 smbios_test_strprop_mktable_badstr(smbios_test_table_t *table)
46 {
47 	smb_strprop_t str;
48 
49 	str.smbstrp_hdr.smbh_type = SMB_TYPE_STRPROP;
50 	str.smbstrp_hdr.smbh_len = sizeof (str);
51 	str.smbstrp_prop_id = htole16(SMB_STRP_UEFI_DEVPATH);
52 	str.smbstrp_prop_val = 0x23;
53 	str.smbstrp_phdl = htole16(smbios_strprop_hdl);
54 
55 	(void) smbios_test_table_append(table, &str, sizeof (str));
56 	smbios_test_table_append_string(table, smbios_strprop_path);
57 	smbios_test_table_str_fini(table);
58 	smbios_test_table_append_eot(table);
59 
60 	return (B_TRUE);
61 }
62 
63 boolean_t
smbios_test_strprop_mktable_invlen1(smbios_test_table_t * table)64 smbios_test_strprop_mktable_invlen1(smbios_test_table_t *table)
65 {
66 	smb_header_t hdr;
67 
68 	hdr.smbh_type = SMB_TYPE_STRPROP;
69 	hdr.smbh_len = sizeof (hdr);
70 
71 	(void) smbios_test_table_append(table, &hdr, sizeof (hdr));
72 	smbios_test_table_append_eot(table);
73 
74 	return (B_TRUE);
75 }
76 
77 boolean_t
smbios_test_strprop_mktable_invlen2(smbios_test_table_t * table)78 smbios_test_strprop_mktable_invlen2(smbios_test_table_t *table)
79 {
80 	smb_strprop_t str;
81 	const uint8_t endstring = 0;
82 
83 	str.smbstrp_hdr.smbh_type = SMB_TYPE_STRPROP;
84 	str.smbstrp_hdr.smbh_len = sizeof (str) + 1;
85 	str.smbstrp_prop_id = htole16(0);
86 	str.smbstrp_prop_val = 0;
87 	str.smbstrp_phdl = htole16(0);
88 
89 	/*
90 	 * Append the end string again as to get us to our additional byte of
91 	 * actual table length.
92 	 */
93 	(void) smbios_test_table_append(table, &str, sizeof (str));
94 	(void) smbios_test_table_append_raw(table, &endstring,
95 	    sizeof (endstring));
96 	(void) smbios_test_table_append_string(table, smbios_strprop_path);
97 	(void) smbios_test_table_append_raw(table, &endstring,
98 	    sizeof (endstring));
99 	smbios_test_table_append_eot(table);
100 
101 	return (B_TRUE);
102 }
103 
104 static boolean_t
smbios_test_strprop_verify_badtable(smbios_hdl_t * hdl,int smberr)105 smbios_test_strprop_verify_badtable(smbios_hdl_t *hdl, int smberr)
106 {
107 	smbios_struct_t sp;
108 	smbios_strprop_t prop;
109 
110 	if (smbios_lookup_type(hdl, SMB_TYPE_STRPROP, &sp) == -1) {
111 		warnx("failed to lookup SMBIOS strprop: %s",
112 		    smbios_errmsg(smbios_errno(hdl)));
113 		return (B_FALSE);
114 	}
115 
116 	if (smbios_info_strprop(hdl, sp.smbstr_id, &prop) != -1) {
117 		warnx("accidentally parsed invalid strprop information as "
118 		    "valid");
119 		return (B_FALSE);
120 	}
121 
122 	if (smbios_errno(hdl) != smberr) {
123 		warnx("encountered wrong error for strprop, expected: "
124 		    "0x%x, found: 0x%x", smberr, smbios_errno(hdl));
125 		return (B_FALSE);
126 	}
127 
128 	return (B_TRUE);
129 }
130 
131 boolean_t
smbios_test_strprop_verify_invlen1(smbios_hdl_t * hdl)132 smbios_test_strprop_verify_invlen1(smbios_hdl_t *hdl)
133 {
134 	return (smbios_test_strprop_verify_badtable(hdl, ESMB_SHORT));
135 }
136 
137 boolean_t
smbios_test_strprop_verify_invlen2(smbios_hdl_t * hdl)138 smbios_test_strprop_verify_invlen2(smbios_hdl_t *hdl)
139 {
140 	return (smbios_test_strprop_verify_badtable(hdl, ESMB_CORRUPT));
141 }
142 
143 boolean_t
smbios_test_strprop_verify_badtype(smbios_hdl_t * hdl)144 smbios_test_strprop_verify_badtype(smbios_hdl_t *hdl)
145 {
146 	smbios_struct_t sp;
147 	smbios_strprop_t prop;
148 
149 	/*
150 	 * Here we've explicitly created a table with a memory device that we're
151 	 * going to try and look up as well, not that.
152 	 */
153 	if (smbios_lookup_type(hdl, SMB_TYPE_MEMDEVICE, &sp) == -1) {
154 		warnx("failed to lookup SMBIOS memory device: %s",
155 		    smbios_errmsg(smbios_errno(hdl)));
156 		return (B_FALSE);
157 	}
158 
159 	if (smbios_info_strprop(hdl, sp.smbstr_id, &prop) != -1) {
160 		warnx("accidentally parsed invalid strprop information as "
161 		    "valid");
162 		return (B_FALSE);
163 	}
164 
165 	if (smbios_errno(hdl) != ESMB_TYPE) {
166 		warnx("encountered wrong error for strprop, expected: "
167 		    "0x%x, found: 0x%x", ESMB_TYPE, smbios_errno(hdl));
168 		return (B_FALSE);
169 	}
170 
171 	return (B_TRUE);
172 
173 }
174 
175 boolean_t
smbios_test_strprop_verify_basic(smbios_hdl_t * hdl)176 smbios_test_strprop_verify_basic(smbios_hdl_t *hdl)
177 {
178 	smbios_struct_t sp;
179 	smbios_strprop_t prop;
180 	boolean_t ret = B_TRUE;
181 
182 	if (smbios_lookup_type(hdl, SMB_TYPE_STRPROP, &sp) == -1) {
183 		warnx("failed to lookup SMBIOS strprop: %s",
184 		    smbios_errmsg(smbios_errno(hdl)));
185 		return (B_FALSE);
186 	}
187 
188 	if (smbios_info_strprop(hdl, sp.smbstr_id, &prop) != 0) {
189 		warnx("failed to get SMBIOS strprop: %s",
190 		    smbios_errmsg(smbios_errno(hdl)));
191 		return (B_FALSE);
192 	}
193 
194 	if (prop.smbsp_prop_id != SMB_STRP_UEFI_DEVPATH) {
195 		warnx("property id incorrect, expected 0x%x, found 0x %x",
196 		    SMB_STRP_UEFI_DEVPATH, prop.smbsp_prop_id);
197 		ret = B_FALSE;
198 	}
199 
200 	if (strcmp(smbios_strprop_id_desc(prop.smbsp_prop_id),
201 	    "UEFI device path") != 0) {
202 		warnx("property id string incorrect, found %s",
203 		    smbios_strprop_id_desc(prop.smbsp_prop_id));
204 		ret = B_FALSE;
205 	}
206 
207 	if (strcmp(prop.smbsp_prop_val, smbios_strprop_path) != 0) {
208 		warnx("property value incorrect, found %s",
209 		    prop.smbsp_prop_val);
210 		ret = B_FALSE;
211 	}
212 
213 	return (ret);
214 }
215 
216 boolean_t
smbios_test_strprop_verify_badstr(smbios_hdl_t * hdl)217 smbios_test_strprop_verify_badstr(smbios_hdl_t *hdl)
218 {
219 	smbios_struct_t sp;
220 	smbios_strprop_t prop;
221 	boolean_t ret = B_TRUE;
222 
223 	if (smbios_lookup_type(hdl, SMB_TYPE_STRPROP, &sp) == -1) {
224 		warnx("failed to lookup SMBIOS strprop: %s",
225 		    smbios_errmsg(smbios_errno(hdl)));
226 		return (B_FALSE);
227 	}
228 
229 	if (smbios_info_strprop(hdl, sp.smbstr_id, &prop) != 0) {
230 		warnx("failed to get SMBIOS strprop: %s",
231 		    smbios_errmsg(smbios_errno(hdl)));
232 		return (B_FALSE);
233 	}
234 
235 	if (prop.smbsp_prop_id != SMB_STRP_UEFI_DEVPATH) {
236 		warnx("property id incorrect, expected 0x%x, found 0x %x",
237 		    SMB_STRP_UEFI_DEVPATH, prop.smbsp_prop_id);
238 		ret = B_FALSE;
239 	}
240 
241 	if (strcmp(smbios_strprop_id_desc(prop.smbsp_prop_id),
242 	    "UEFI device path") != 0) {
243 		warnx("property id string incorrect, found %s",
244 		    smbios_strprop_id_desc(prop.smbsp_prop_id));
245 		ret = B_FALSE;
246 	}
247 
248 	if (strcmp(prop.smbsp_prop_val, "") != 0) {
249 		warnx("property value incorrect, found %s",
250 		    prop.smbsp_prop_val);
251 		ret = B_FALSE;
252 	}
253 
254 	return (ret);
255 }
256