17d1ffc32SGordon Ross /*
27d1ffc32SGordon Ross  * This file and its contents are supplied under the terms of the
37d1ffc32SGordon Ross  * Common Development and Distribution License ("CDDL"), version 1.0.
47d1ffc32SGordon Ross  * You may only use this file in accordance with the terms of version
57d1ffc32SGordon Ross  * 1.0 of the CDDL.
67d1ffc32SGordon Ross  *
77d1ffc32SGordon Ross  * A full copy of the text of the CDDL should have accompanied this
87d1ffc32SGordon Ross  * source.  A copy of the CDDL is also available via the Internet at
97d1ffc32SGordon Ross  * http://www.illumos.org/license/CDDL.
107d1ffc32SGordon Ross  */
117d1ffc32SGordon Ross 
127d1ffc32SGordon Ross /*
13*25a9a7aaSGordon Ross  * Copyright 2019 Nexenta by DDN, Inc. All rights reserved.
147d1ffc32SGordon Ross  */
157d1ffc32SGordon Ross 
167d1ffc32SGordon Ross /*
177d1ffc32SGordon Ross  * Test putting/getting unicode strings in mbchains.
187d1ffc32SGordon Ross  */
197d1ffc32SGordon Ross 
207d1ffc32SGordon Ross #include <sys/types.h>
217d1ffc32SGordon Ross #include <sys/debug.h>
227d1ffc32SGordon Ross #include <sys/varargs.h>
237d1ffc32SGordon Ross #include <smbsrv/smb_kproto.h>
247d1ffc32SGordon Ross #include <stdio.h>
257d1ffc32SGordon Ross #include <string.h>
267d1ffc32SGordon Ross #include <strings.h>
277d1ffc32SGordon Ross 
287d1ffc32SGordon Ross #include "test_defs.h"
297d1ffc32SGordon Ross 
307d1ffc32SGordon Ross static char mbsa[] = "A\xef\xbc\xa1.";		// A fwA . (5)
317d1ffc32SGordon Ross static char mbsp[] = "P\xf0\x9f\x92\xa9.";	// P poop . (6)
327d1ffc32SGordon Ross static smb_wchar_t wcsa[] = { 'A', 0xff21, '.', 0 };	// (3)
337d1ffc32SGordon Ross static smb_wchar_t wcsp[] = { 'P', 0xd83d, 0xdca9, '.', 0 }; // (4)
347d1ffc32SGordon Ross 
357d1ffc32SGordon Ross smb_session_t test_ssn;
367d1ffc32SGordon Ross smb_request_t test_sr;
377d1ffc32SGordon Ross 
387d1ffc32SGordon Ross /*
397d1ffc32SGordon Ross  * Put ASCII string with NULL
407d1ffc32SGordon Ross  */
417d1ffc32SGordon Ross static void
mbm_put_a0()427d1ffc32SGordon Ross mbm_put_a0()
437d1ffc32SGordon Ross {
447d1ffc32SGordon Ross 	uint8_t wire[] = { 'o', 'n', 'e', 0, 42, 0 };
457d1ffc32SGordon Ross 	mbuf_chain_t *mbc;
467d1ffc32SGordon Ross 	int rc;
477d1ffc32SGordon Ross 
487d1ffc32SGordon Ross 	mbc = smb_mbc_alloc(100);
497d1ffc32SGordon Ross 
507d1ffc32SGordon Ross 	rc = smb_mbc_encodef(mbc, "sw", "one", 42);
517d1ffc32SGordon Ross 	if (rc != 0) {
527d1ffc32SGordon Ross 		printf("Fail: mbm_put_a0 encode\n");
537d1ffc32SGordon Ross 		goto out;
547d1ffc32SGordon Ross 	}
557d1ffc32SGordon Ross 	if (mbc->chain->m_len != 6) {
567d1ffc32SGordon Ross 		printf("Fail: mbm_put_a0 len=%d\n",
577d1ffc32SGordon Ross 		    mbc->chain->m_len);
587d1ffc32SGordon Ross 		return;
597d1ffc32SGordon Ross 	}
607d1ffc32SGordon Ross 
617d1ffc32SGordon Ross 	if (memcmp(mbc->chain->m_data, wire, 6)) {
627d1ffc32SGordon Ross 		printf("Fail: mbm_put_a0 cmp:\n");
637d1ffc32SGordon Ross 		hexdump((uchar_t *)mbc->chain->m_data, 6);
647d1ffc32SGordon Ross 		return;
657d1ffc32SGordon Ross 	}
667d1ffc32SGordon Ross 
677d1ffc32SGordon Ross 	printf("Pass: mbm_put_a0\n");
687d1ffc32SGordon Ross 
697d1ffc32SGordon Ross out:
707d1ffc32SGordon Ross 	smb_mbc_free(mbc);
717d1ffc32SGordon Ross }
727d1ffc32SGordon Ross 
737d1ffc32SGordon Ross /*
747d1ffc32SGordon Ross  * Put ASCII string, no NULL
757d1ffc32SGordon Ross  */
767d1ffc32SGordon Ross static void
mbm_put_a1()777d1ffc32SGordon Ross mbm_put_a1()
787d1ffc32SGordon Ross {
797d1ffc32SGordon Ross 	uint8_t wire[] = { 'o', 'n', 'e', '.', 42, 0 };
807d1ffc32SGordon Ross 	mbuf_chain_t *mbc;
817d1ffc32SGordon Ross 	int rc;
827d1ffc32SGordon Ross 
837d1ffc32SGordon Ross 	mbc = smb_mbc_alloc(100);
847d1ffc32SGordon Ross 
857d1ffc32SGordon Ross 	rc = smb_mbc_encodef(mbc, "4sw", "one.", 42);
867d1ffc32SGordon Ross 	if (rc != 0) {
877d1ffc32SGordon Ross 		printf("Fail: mbm_put_a1 encode\n");
887d1ffc32SGordon Ross 		goto out;
897d1ffc32SGordon Ross 	}
907d1ffc32SGordon Ross 	if (mbc->chain->m_len != 6) {
917d1ffc32SGordon Ross 		printf("Fail: mbm_put_a1 len=%d\n",
927d1ffc32SGordon Ross 		    mbc->chain->m_len);
937d1ffc32SGordon Ross 		return;
947d1ffc32SGordon Ross 	}
957d1ffc32SGordon Ross 
967d1ffc32SGordon Ross 	if (memcmp(mbc->chain->m_data, wire, 6)) {
977d1ffc32SGordon Ross 		printf("Fail: mbm_put_a1 cmp:\n");
987d1ffc32SGordon Ross 		hexdump((uchar_t *)mbc->chain->m_data, 6);
997d1ffc32SGordon Ross 		return;
1007d1ffc32SGordon Ross 	}
1017d1ffc32SGordon Ross 
1027d1ffc32SGordon Ross 	printf("Pass: mbm_put_a1\n");
1037d1ffc32SGordon Ross 
1047d1ffc32SGordon Ross out:
1057d1ffc32SGordon Ross 	smb_mbc_free(mbc);
1067d1ffc32SGordon Ross }
1077d1ffc32SGordon Ross 
1087d1ffc32SGordon Ross static void
mbm_put_apad()1097d1ffc32SGordon Ross mbm_put_apad()
1107d1ffc32SGordon Ross {
1117d1ffc32SGordon Ross 	uint8_t wire[] = { 'o', 'n', 'e', 0, 0 };
1127d1ffc32SGordon Ross 	mbuf_chain_t *mbc;
1137d1ffc32SGordon Ross 	int rc;
1147d1ffc32SGordon Ross 
1157d1ffc32SGordon Ross 	mbc = smb_mbc_alloc(100);
1167d1ffc32SGordon Ross 
1177d1ffc32SGordon Ross 	/* Encode with wire length > strlen */
1187d1ffc32SGordon Ross 	rc = smb_mbc_encodef(mbc, "5s", "one");
1197d1ffc32SGordon Ross 	if (rc != 0) {
1207d1ffc32SGordon Ross 		printf("Fail: mbm_put_apad encode\n");
1217d1ffc32SGordon Ross 		goto out;
1227d1ffc32SGordon Ross 	}
1237d1ffc32SGordon Ross 	if (mbc->chain->m_len != 5) {
1247d1ffc32SGordon Ross 		printf("Fail: mbm_put_apad len=%d\n",
1257d1ffc32SGordon Ross 		    mbc->chain->m_len);
1267d1ffc32SGordon Ross 		return;
1277d1ffc32SGordon Ross 	}
1287d1ffc32SGordon Ross 
1297d1ffc32SGordon Ross 	if (memcmp(mbc->chain->m_data, wire, 5)) {
1307d1ffc32SGordon Ross 		printf("Fail: mbm_put_apad cmp:\n");
1317d1ffc32SGordon Ross 		hexdump((uchar_t *)mbc->chain->m_data, 5);
1327d1ffc32SGordon Ross 		return;
1337d1ffc32SGordon Ross 	}
1347d1ffc32SGordon Ross 
1357d1ffc32SGordon Ross 	printf("Pass: mbm_put_apad\n");
1367d1ffc32SGordon Ross 
1377d1ffc32SGordon Ross out:
1387d1ffc32SGordon Ross 	smb_mbc_free(mbc);
1397d1ffc32SGordon Ross }
1407d1ffc32SGordon Ross 
1417d1ffc32SGordon Ross static void
mbm_put_atrunc1()142*25a9a7aaSGordon Ross mbm_put_atrunc1()
1437d1ffc32SGordon Ross {
1447d1ffc32SGordon Ross 	uint8_t wire[] = { 'o', 'n', 'e', 't', };
1457d1ffc32SGordon Ross 	mbuf_chain_t *mbc;
1467d1ffc32SGordon Ross 	int rc;
1477d1ffc32SGordon Ross 
1487d1ffc32SGordon Ross 	mbc = smb_mbc_alloc(100);
1497d1ffc32SGordon Ross 
1507d1ffc32SGordon Ross 	/* Encode with wire length < strlen */
1517d1ffc32SGordon Ross 	rc = smb_mbc_encodef(mbc, "4s", "onetwo");
1527d1ffc32SGordon Ross 	if (rc != 0) {
153*25a9a7aaSGordon Ross 		printf("Fail: mbm_put_atrunc1 encode\n");
1547d1ffc32SGordon Ross 		goto out;
1557d1ffc32SGordon Ross 	}
1567d1ffc32SGordon Ross 	/* Trunc should put exactly 4 */
1577d1ffc32SGordon Ross 	if (mbc->chain->m_len != 4) {
158*25a9a7aaSGordon Ross 		printf("Fail: mbm_put_atrunc1 len=%d\n",
1597d1ffc32SGordon Ross 		    mbc->chain->m_len);
1607d1ffc32SGordon Ross 		return;
1617d1ffc32SGordon Ross 	}
1627d1ffc32SGordon Ross 
1637d1ffc32SGordon Ross 	if (memcmp(mbc->chain->m_data, wire, 4)) {
164*25a9a7aaSGordon Ross 		printf("Fail: mbm_put_atrunc1 cmp:\n");
1657d1ffc32SGordon Ross 		hexdump((uchar_t *)mbc->chain->m_data, 4);
1667d1ffc32SGordon Ross 		return;
1677d1ffc32SGordon Ross 	}
1687d1ffc32SGordon Ross 
169*25a9a7aaSGordon Ross 	printf("Pass: mbm_put_atrunc1\n");
170*25a9a7aaSGordon Ross 
171*25a9a7aaSGordon Ross out:
172*25a9a7aaSGordon Ross 	smb_mbc_free(mbc);
173*25a9a7aaSGordon Ross }
174*25a9a7aaSGordon Ross 
175*25a9a7aaSGordon Ross static void
mbm_put_atrunc2()176*25a9a7aaSGordon Ross mbm_put_atrunc2()
177*25a9a7aaSGordon Ross {
178*25a9a7aaSGordon Ross 	uint8_t wire[] = { 'o', 'n', 'e', 't', 0 };
179*25a9a7aaSGordon Ross 	mbuf_chain_t *mbc;
180*25a9a7aaSGordon Ross 	int rc;
181*25a9a7aaSGordon Ross 
182*25a9a7aaSGordon Ross 	mbc = smb_mbc_alloc(4);
183*25a9a7aaSGordon Ross 
184*25a9a7aaSGordon Ross 	/* Encode with wire length < strlen */
185*25a9a7aaSGordon Ross 	rc = smb_mbc_encodef(mbc, "s", "onetwo");
186*25a9a7aaSGordon Ross 	if (rc != 1) {
187*25a9a7aaSGordon Ross 		printf("Fail: mbm_put_atrunc2 encode rc=%d\n", rc);
188*25a9a7aaSGordon Ross 		goto out;
189*25a9a7aaSGordon Ross 	}
190*25a9a7aaSGordon Ross 	/* Trunc should put exactly 4 */
191*25a9a7aaSGordon Ross 	if (mbc->chain->m_len != 4) {
192*25a9a7aaSGordon Ross 		printf("Fail: mbm_put_atrunc2 len=%d\n",
193*25a9a7aaSGordon Ross 		    mbc->chain->m_len);
194*25a9a7aaSGordon Ross 		return;
195*25a9a7aaSGordon Ross 	}
196*25a9a7aaSGordon Ross 
197*25a9a7aaSGordon Ross 	if (memcmp(mbc->chain->m_data, wire, 5)) {
198*25a9a7aaSGordon Ross 		printf("Fail: mbm_put_atrunc2 cmp:\n");
199*25a9a7aaSGordon Ross 		hexdump((uchar_t *)mbc->chain->m_data, 4);
200*25a9a7aaSGordon Ross 		return;
201*25a9a7aaSGordon Ross 	}
202*25a9a7aaSGordon Ross 
203*25a9a7aaSGordon Ross 	printf("Pass: mbm_put_atrunc2\n");
2047d1ffc32SGordon Ross 
2057d1ffc32SGordon Ross out:
2067d1ffc32SGordon Ross 	smb_mbc_free(mbc);
2077d1ffc32SGordon Ross }
2087d1ffc32SGordon Ross 
2097d1ffc32SGordon Ross /*
2107d1ffc32SGordon Ross  * Put unicode string with NULL
2117d1ffc32SGordon Ross  */
2127d1ffc32SGordon Ross static void
mbm_put_u0()2137d1ffc32SGordon Ross mbm_put_u0()
2147d1ffc32SGordon Ross {
2157d1ffc32SGordon Ross 	uint16_t wire[] = { 'o', 'n', 'e', 0, 42, 0 };
2167d1ffc32SGordon Ross 	mbuf_chain_t *mbc;
2177d1ffc32SGordon Ross 	int rc;
2187d1ffc32SGordon Ross 
2197d1ffc32SGordon Ross 	mbc = smb_mbc_alloc(100);
2207d1ffc32SGordon Ross 
2217d1ffc32SGordon Ross 	rc = smb_mbc_encodef(mbc, "Uw", "one", 42);
2227d1ffc32SGordon Ross 	if (rc != 0) {
2237d1ffc32SGordon Ross 		printf("Fail: mbm_put_u0 encode\n");
2247d1ffc32SGordon Ross 		goto out;
2257d1ffc32SGordon Ross 	}
2267d1ffc32SGordon Ross 	if (mbc->chain->m_len != 10) {
2277d1ffc32SGordon Ross 		printf("Fail: mbm_put_u0 len=%d\n",
2287d1ffc32SGordon Ross 		    mbc->chain->m_len);
2297d1ffc32SGordon Ross 		return;
2307d1ffc32SGordon Ross 	}
2317d1ffc32SGordon Ross 
2327d1ffc32SGordon Ross 	if (memcmp(mbc->chain->m_data, wire, 10)) {
2337d1ffc32SGordon Ross 		printf("Fail: mbm_put_u0 cmp:\n");
2347d1ffc32SGordon Ross 		hexdump((uchar_t *)mbc->chain->m_data, 10);
2357d1ffc32SGordon Ross 		return;
2367d1ffc32SGordon Ross 	}
2377d1ffc32SGordon Ross 
2387d1ffc32SGordon Ross 	printf("Pass: mbm_put_u0\n");
2397d1ffc32SGordon Ross 
2407d1ffc32SGordon Ross out:
2417d1ffc32SGordon Ross 	smb_mbc_free(mbc);
2427d1ffc32SGordon Ross }
2437d1ffc32SGordon Ross 
2447d1ffc32SGordon Ross /*
2457d1ffc32SGordon Ross  * Put unicode string, no NULL
2467d1ffc32SGordon Ross  */
2477d1ffc32SGordon Ross static void
mbm_put_u1()2487d1ffc32SGordon Ross mbm_put_u1()
2497d1ffc32SGordon Ross {
2507d1ffc32SGordon Ross 	uint16_t wire[] = { 'o', 'n', 'e', '.', 42, 0 };
2517d1ffc32SGordon Ross 	mbuf_chain_t *mbc;
2527d1ffc32SGordon Ross 	int rc;
2537d1ffc32SGordon Ross 
2547d1ffc32SGordon Ross 	mbc = smb_mbc_alloc(100);
2557d1ffc32SGordon Ross 
2567d1ffc32SGordon Ross 	rc = smb_mbc_encodef(mbc, "8Uw", "one.", 42);
2577d1ffc32SGordon Ross 	if (rc != 0) {
2587d1ffc32SGordon Ross 		printf("Fail: mbm_put_u1 encode\n");
2597d1ffc32SGordon Ross 		goto out;
2607d1ffc32SGordon Ross 	}
2617d1ffc32SGordon Ross 	if (mbc->chain->m_len != 10) {
2627d1ffc32SGordon Ross 		printf("Fail: mbm_put_u1 len=%d\n",
2637d1ffc32SGordon Ross 		    mbc->chain->m_len);
2647d1ffc32SGordon Ross 		return;
2657d1ffc32SGordon Ross 	}
2667d1ffc32SGordon Ross 
2677d1ffc32SGordon Ross 	if (memcmp(mbc->chain->m_data, wire, 10)) {
2687d1ffc32SGordon Ross 		printf("Fail: mbm_put_u1 cmp:\n");
2697d1ffc32SGordon Ross 		hexdump((uchar_t *)mbc->chain->m_data, 10);
2707d1ffc32SGordon Ross 		return;
2717d1ffc32SGordon Ross 	}
2727d1ffc32SGordon Ross 
2737d1ffc32SGordon Ross 	printf("Pass: mbm_put_u1\n");
2747d1ffc32SGordon Ross 
2757d1ffc32SGordon Ross out:
2767d1ffc32SGordon Ross 	smb_mbc_free(mbc);
2777d1ffc32SGordon Ross }
2787d1ffc32SGordon Ross 
2797d1ffc32SGordon Ross static void
mbm_put_u3()2807d1ffc32SGordon Ross mbm_put_u3()
2817d1ffc32SGordon Ross {
2827d1ffc32SGordon Ross 	mbuf_chain_t *mbc;
2837d1ffc32SGordon Ross 	int rc;
2847d1ffc32SGordon Ross 
2857d1ffc32SGordon Ross 	mbc = smb_mbc_alloc(100);
2867d1ffc32SGordon Ross 
2877d1ffc32SGordon Ross 	rc = smb_mbc_encodef(mbc, "U", mbsa);
2887d1ffc32SGordon Ross 	if (rc != 0) {
2897d1ffc32SGordon Ross 		printf("Fail: mbm_put_u3 encode\n");
2907d1ffc32SGordon Ross 		goto out;
2917d1ffc32SGordon Ross 	}
2927d1ffc32SGordon Ross 	if (mbc->chain->m_len != 8) {
2937d1ffc32SGordon Ross 		printf("Fail: mbm_put_u3 len=%d\n",
2947d1ffc32SGordon Ross 		    mbc->chain->m_len);
2957d1ffc32SGordon Ross 		return;
2967d1ffc32SGordon Ross 	}
2977d1ffc32SGordon Ross 
2987d1ffc32SGordon Ross 	if (memcmp(mbc->chain->m_data, wcsa, 8)) {
2997d1ffc32SGordon Ross 		printf("Fail: mbm_put_u3 cmp:\n");
3007d1ffc32SGordon Ross 		hexdump((uchar_t *)mbc->chain->m_data, 8);
3017d1ffc32SGordon Ross 		return;
3027d1ffc32SGordon Ross 	}
3037d1ffc32SGordon Ross 
3047d1ffc32SGordon Ross 	printf("Pass: mbm_put_u3\n");
3057d1ffc32SGordon Ross 
3067d1ffc32SGordon Ross out:
3077d1ffc32SGordon Ross 	smb_mbc_free(mbc);
3087d1ffc32SGordon Ross }
3097d1ffc32SGordon Ross 
3107d1ffc32SGordon Ross static void
mbm_put_u4()3117d1ffc32SGordon Ross mbm_put_u4()
3127d1ffc32SGordon Ross {
3137d1ffc32SGordon Ross 	mbuf_chain_t *mbc;
3147d1ffc32SGordon Ross 	int rc;
3157d1ffc32SGordon Ross 
3167d1ffc32SGordon Ross 	mbc = smb_mbc_alloc(100);
3177d1ffc32SGordon Ross 
3187d1ffc32SGordon Ross 	rc = smb_mbc_encodef(mbc, "U", mbsp);
3197d1ffc32SGordon Ross 	if (rc != 0) {
3207d1ffc32SGordon Ross 		printf("Fail: mbm_put_u4 encode\n");
3217d1ffc32SGordon Ross 		goto out;
3227d1ffc32SGordon Ross 	}
3237d1ffc32SGordon Ross 	if (mbc->chain->m_len != 10) {
3247d1ffc32SGordon Ross 		printf("Fail: mbm_put_u4 len=%d\n",
3257d1ffc32SGordon Ross 		    mbc->chain->m_len);
3267d1ffc32SGordon Ross 		return;
3277d1ffc32SGordon Ross 	}
3287d1ffc32SGordon Ross 
3297d1ffc32SGordon Ross 	if (memcmp(mbc->chain->m_data, wcsp, 10)) {
3307d1ffc32SGordon Ross 		printf("Fail: mbm_put_u4 cmp:\n");
3317d1ffc32SGordon Ross 		hexdump((uchar_t *)mbc->chain->m_data, 10);
3327d1ffc32SGordon Ross 		return;
3337d1ffc32SGordon Ross 	}
3347d1ffc32SGordon Ross 
3357d1ffc32SGordon Ross 	printf("Pass: mbm_put_u4\n");
3367d1ffc32SGordon Ross 
3377d1ffc32SGordon Ross out:
3387d1ffc32SGordon Ross 	smb_mbc_free(mbc);
3397d1ffc32SGordon Ross }
3407d1ffc32SGordon Ross 
3417d1ffc32SGordon Ross static void
mbm_put_upad()3427d1ffc32SGordon Ross mbm_put_upad()
3437d1ffc32SGordon Ross {
3447d1ffc32SGordon Ross 	uint16_t wire[] = { 'o', 'n', 'e', 0, 0 };
3457d1ffc32SGordon Ross 	mbuf_chain_t *mbc;
3467d1ffc32SGordon Ross 	int rc;
3477d1ffc32SGordon Ross 
3487d1ffc32SGordon Ross 	mbc = smb_mbc_alloc(100);
3497d1ffc32SGordon Ross 
3507d1ffc32SGordon Ross 	/* Encode with wire length > strlen */
3517d1ffc32SGordon Ross 	rc = smb_mbc_encodef(mbc, "10U", "one");
3527d1ffc32SGordon Ross 	if (rc != 0) {
3537d1ffc32SGordon Ross 		printf("Fail: mbm_put_upad encode\n");
3547d1ffc32SGordon Ross 		goto out;
3557d1ffc32SGordon Ross 	}
3567d1ffc32SGordon Ross 	if (mbc->chain->m_len != 10) {
3577d1ffc32SGordon Ross 		printf("Fail: mbm_put_upad len=%d\n",
3587d1ffc32SGordon Ross 		    mbc->chain->m_len);
3597d1ffc32SGordon Ross 		return;
3607d1ffc32SGordon Ross 	}
3617d1ffc32SGordon Ross 
3627d1ffc32SGordon Ross 	if (memcmp(mbc->chain->m_data, wire, 10)) {
3637d1ffc32SGordon Ross 		printf("Fail: mbm_put_upad cmp:\n");
3647d1ffc32SGordon Ross 		hexdump((uchar_t *)mbc->chain->m_data, 10);
3657d1ffc32SGordon Ross 		return;
3667d1ffc32SGordon Ross 	}
3677d1ffc32SGordon Ross 
3687d1ffc32SGordon Ross 	printf("Pass: mbm_put_upad\n");
3697d1ffc32SGordon Ross 
3707d1ffc32SGordon Ross out:
3717d1ffc32SGordon Ross 	smb_mbc_free(mbc);
3727d1ffc32SGordon Ross }
3737d1ffc32SGordon Ross 
3747d1ffc32SGordon Ross static void
mbm_put_utrunc1()375*25a9a7aaSGordon Ross mbm_put_utrunc1()
3767d1ffc32SGordon Ross {
3777d1ffc32SGordon Ross 	uint16_t wire[] = { 'o', 'n', 'e', 't' };
3787d1ffc32SGordon Ross 	mbuf_chain_t *mbc;
3797d1ffc32SGordon Ross 	int rc;
3807d1ffc32SGordon Ross 
3817d1ffc32SGordon Ross 	mbc = smb_mbc_alloc(100);
3827d1ffc32SGordon Ross 
3837d1ffc32SGordon Ross 	/* Encode with wire length < strlen */
3847d1ffc32SGordon Ross 	rc = smb_mbc_encodef(mbc, "8U", "onetwo");
3857d1ffc32SGordon Ross 	if (rc != 0) {
386*25a9a7aaSGordon Ross 		printf("Fail: mbm_put_utrunc1 encode\n");
3877d1ffc32SGordon Ross 		goto out;
3887d1ffc32SGordon Ross 	}
3897d1ffc32SGordon Ross 	/* Trunc should put exactly 8 */
3907d1ffc32SGordon Ross 	if (mbc->chain->m_len != 8) {
391*25a9a7aaSGordon Ross 		printf("Fail: mbm_put_utrunc1 len=%d\n",
3927d1ffc32SGordon Ross 		    mbc->chain->m_len);
3937d1ffc32SGordon Ross 		return;
3947d1ffc32SGordon Ross 	}
3957d1ffc32SGordon Ross 
3967d1ffc32SGordon Ross 	if (memcmp(mbc->chain->m_data, wire, 8)) {
397*25a9a7aaSGordon Ross 		printf("Fail: mbm_put_utrunc1 cmp:\n");
398*25a9a7aaSGordon Ross 		hexdump((uchar_t *)mbc->chain->m_data, 8);
399*25a9a7aaSGordon Ross 		return;
400*25a9a7aaSGordon Ross 	}
401*25a9a7aaSGordon Ross 
402*25a9a7aaSGordon Ross 	printf("Pass: mbm_put_utrunc1\n");
403*25a9a7aaSGordon Ross 
404*25a9a7aaSGordon Ross out:
405*25a9a7aaSGordon Ross 	smb_mbc_free(mbc);
406*25a9a7aaSGordon Ross }
407*25a9a7aaSGordon Ross 
408*25a9a7aaSGordon Ross static void
mbm_put_utrunc2()409*25a9a7aaSGordon Ross mbm_put_utrunc2()
410*25a9a7aaSGordon Ross {
411*25a9a7aaSGordon Ross 	uint16_t wire[] = { 'o', 'n', 'e', 't', 0 };
412*25a9a7aaSGordon Ross 	mbuf_chain_t *mbc;
413*25a9a7aaSGordon Ross 	int rc;
414*25a9a7aaSGordon Ross 
415*25a9a7aaSGordon Ross 	mbc = smb_mbc_alloc(8);
416*25a9a7aaSGordon Ross 
417*25a9a7aaSGordon Ross 	/* Encode with wire length < strlen */
418*25a9a7aaSGordon Ross 	rc = smb_mbc_encodef(mbc, "U", "onetwo");
419*25a9a7aaSGordon Ross 	if (rc != 1) {
420*25a9a7aaSGordon Ross 		printf("Fail: mbm_put_utrunc2 encode rc=%d\n", rc);
421*25a9a7aaSGordon Ross 		goto out;
422*25a9a7aaSGordon Ross 	}
423*25a9a7aaSGordon Ross 	/* Trunc should put exactly 8 */
424*25a9a7aaSGordon Ross 	if (mbc->chain->m_len != 8) {
425*25a9a7aaSGordon Ross 		printf("Fail: mbm_put_utrunc2 len=%d\n",
426*25a9a7aaSGordon Ross 		    mbc->chain->m_len);
427*25a9a7aaSGordon Ross 		return;
428*25a9a7aaSGordon Ross 	}
429*25a9a7aaSGordon Ross 
430*25a9a7aaSGordon Ross 	if (memcmp(mbc->chain->m_data, wire, 10)) {
431*25a9a7aaSGordon Ross 		printf("Fail: mbm_put_utrunc2 cmp:\n");
4327d1ffc32SGordon Ross 		hexdump((uchar_t *)mbc->chain->m_data, 8);
4337d1ffc32SGordon Ross 		return;
4347d1ffc32SGordon Ross 	}
4357d1ffc32SGordon Ross 
436*25a9a7aaSGordon Ross 	printf("Pass: mbm_put_utrunc2\n");
4377d1ffc32SGordon Ross 
4387d1ffc32SGordon Ross out:
4397d1ffc32SGordon Ross 	smb_mbc_free(mbc);
4407d1ffc32SGordon Ross }
4417d1ffc32SGordon Ross 
4427d1ffc32SGordon Ross /*
4437d1ffc32SGordon Ross  * Parse an ascii string.
4447d1ffc32SGordon Ross  */
4457d1ffc32SGordon Ross static void
mbm_get_a0()4467d1ffc32SGordon Ross mbm_get_a0()
4477d1ffc32SGordon Ross {
4487d1ffc32SGordon Ross 	uint8_t wire[] = { 'o', 'n', 'e', 0, 42, 0 };
4497d1ffc32SGordon Ross 	mbuf_chain_t mbc;
4507d1ffc32SGordon Ross 	char *s;
4517d1ffc32SGordon Ross 	int rc;
4527d1ffc32SGordon Ross 	uint16_t w;
4537d1ffc32SGordon Ross 
4547d1ffc32SGordon Ross 	bzero(&mbc, sizeof (mbc));
4557d1ffc32SGordon Ross 	MBC_ATTACH_BUF(&mbc, (uchar_t *)wire, sizeof (wire));
4567d1ffc32SGordon Ross 
4577d1ffc32SGordon Ross 	rc = smb_mbc_decodef(&mbc, "%sw", &test_sr, &s, &w);
4587d1ffc32SGordon Ross 	if (rc != 0) {
4597d1ffc32SGordon Ross 		printf("Fail: mbm_get_a0 decode\n");
4607d1ffc32SGordon Ross 		goto out;
4617d1ffc32SGordon Ross 	}
4627d1ffc32SGordon Ross 	/*
4637d1ffc32SGordon Ross 	 * Decode a word after the string to make sure we
4647d1ffc32SGordon Ross 	 * end up positioned correctly after the string.
4657d1ffc32SGordon Ross 	 */
4667d1ffc32SGordon Ross 	if (w != 42) {
4677d1ffc32SGordon Ross 		printf("Fail: mbm_get_a0 w=%d\n", w);
4687d1ffc32SGordon Ross 		return;
4697d1ffc32SGordon Ross 	}
4707d1ffc32SGordon Ross 	if (strcmp(s, "one") != 0) {
4717d1ffc32SGordon Ross 		printf("Fail: mbm_get_a0 cmp: <%s>\n", s);
4727d1ffc32SGordon Ross 		return;
4737d1ffc32SGordon Ross 	}
4747d1ffc32SGordon Ross 
4757d1ffc32SGordon Ross 	printf("Pass: mbm_get_a0\n");
4767d1ffc32SGordon Ross 
4777d1ffc32SGordon Ross out:
4787d1ffc32SGordon Ross 	MBC_FLUSH(&mbc);
4797d1ffc32SGordon Ross }
4807d1ffc32SGordon Ross 
4817d1ffc32SGordon Ross /*
4827d1ffc32SGordon Ross  * Parse an ascii string, no NULL
4837d1ffc32SGordon Ross  */
4847d1ffc32SGordon Ross static void
mbm_get_a1()4857d1ffc32SGordon Ross mbm_get_a1()
4867d1ffc32SGordon Ross {
4877d1ffc32SGordon Ross 	uint8_t wire[] = { 'o', 'n', 'e', '.', 42, 0 };
4887d1ffc32SGordon Ross 	mbuf_chain_t mbc;
4897d1ffc32SGordon Ross 	char *s;
4907d1ffc32SGordon Ross 	int rc;
4917d1ffc32SGordon Ross 	uint16_t w;
4927d1ffc32SGordon Ross 
4937d1ffc32SGordon Ross 	bzero(&mbc, sizeof (mbc));
4947d1ffc32SGordon Ross 	MBC_ATTACH_BUF(&mbc, (uchar_t *)wire, sizeof (wire));
4957d1ffc32SGordon Ross 
4967d1ffc32SGordon Ross 	rc = smb_mbc_decodef(&mbc, "%3s.w", &test_sr, &s, &w);
4977d1ffc32SGordon Ross 	if (rc != 0) {
4987d1ffc32SGordon Ross 		printf("Fail: mbm_get_a1 decode\n");
4997d1ffc32SGordon Ross 		goto out;
5007d1ffc32SGordon Ross 	}
5017d1ffc32SGordon Ross 	/*
5027d1ffc32SGordon Ross 	 * Decode a word after the string to make sure we
5037d1ffc32SGordon Ross 	 * end up positioned correctly after the string.
5047d1ffc32SGordon Ross 	 */
5057d1ffc32SGordon Ross 	if (w != 42) {
5067d1ffc32SGordon Ross 		printf("Fail: mbm_get_a1 w=%d\n", w);
5077d1ffc32SGordon Ross 		return;
5087d1ffc32SGordon Ross 	}
5097d1ffc32SGordon Ross 	if (strcmp(s, "one") != 0) {
5107d1ffc32SGordon Ross 		printf("Fail: mbm_get_a1 cmp: <%s>\n", s);
5117d1ffc32SGordon Ross 		return;
5127d1ffc32SGordon Ross 	}
5137d1ffc32SGordon Ross 
5147d1ffc32SGordon Ross 	printf("Pass: mbm_get_a1\n");
5157d1ffc32SGordon Ross 
5167d1ffc32SGordon Ross out:
5177d1ffc32SGordon Ross 	MBC_FLUSH(&mbc);
5187d1ffc32SGordon Ross }
5197d1ffc32SGordon Ross 
5207d1ffc32SGordon Ross /* parse exactly to end of data */
5217d1ffc32SGordon Ross static void
mbm_get_a2()5227d1ffc32SGordon Ross mbm_get_a2()
5237d1ffc32SGordon Ross {
5247d1ffc32SGordon Ross 	uint8_t wire[] = { 'o', 'n', 'e' };
5257d1ffc32SGordon Ross 	mbuf_chain_t mbc;
5267d1ffc32SGordon Ross 	char *s;
5277d1ffc32SGordon Ross 	int rc;
5287d1ffc32SGordon Ross 
5297d1ffc32SGordon Ross 	bzero(&mbc, sizeof (mbc));
5307d1ffc32SGordon Ross 	MBC_ATTACH_BUF(&mbc, (uchar_t *)wire, sizeof (wire));
5317d1ffc32SGordon Ross 
5327d1ffc32SGordon Ross 	rc = smb_mbc_decodef(&mbc, "%3s", &test_sr, &s);
5337d1ffc32SGordon Ross 	if (rc != 0) {
5347d1ffc32SGordon Ross 		printf("Fail: mbm_get_a2 decode\n");
5357d1ffc32SGordon Ross 		goto out;
5367d1ffc32SGordon Ross 	}
5377d1ffc32SGordon Ross 	if (mbc.chain_offset != 3) {
5387d1ffc32SGordon Ross 		printf("Fail: mbm_get_a2 wrong pos\n");
5397d1ffc32SGordon Ross 		return;
5407d1ffc32SGordon Ross 	}
5417d1ffc32SGordon Ross 	if (strcmp(s, "one") != 0) {
5427d1ffc32SGordon Ross 		printf("Fail: mbm_get_a2 cmp: <%s>\n", s);
5437d1ffc32SGordon Ross 		return;
5447d1ffc32SGordon Ross 	}
5457d1ffc32SGordon Ross 
5467d1ffc32SGordon Ross 	printf("Pass: mbm_get_a2\n");
5477d1ffc32SGordon Ross 
5487d1ffc32SGordon Ross out:
5497d1ffc32SGordon Ross 	MBC_FLUSH(&mbc);
5507d1ffc32SGordon Ross }
5517d1ffc32SGordon Ross 
5527d1ffc32SGordon Ross /*
5537d1ffc32SGordon Ross  * Parse a unicode string.
5547d1ffc32SGordon Ross  */
5557d1ffc32SGordon Ross static void
mbm_get_u0()5567d1ffc32SGordon Ross mbm_get_u0()
5577d1ffc32SGordon Ross {
5587d1ffc32SGordon Ross 	uint16_t wire[] = { 'o', 'n', 'e', 0, 42, 0 };
5597d1ffc32SGordon Ross 	mbuf_chain_t mbc;
5607d1ffc32SGordon Ross 	char *s;
5617d1ffc32SGordon Ross 	int rc;
5627d1ffc32SGordon Ross 	uint16_t w;
5637d1ffc32SGordon Ross 
5647d1ffc32SGordon Ross 	bzero(&mbc, sizeof (mbc));
5657d1ffc32SGordon Ross 	MBC_ATTACH_BUF(&mbc, (uchar_t *)wire, sizeof (wire));
5667d1ffc32SGordon Ross 
5677d1ffc32SGordon Ross 	rc = smb_mbc_decodef(&mbc, "%Uw", &test_sr, &s, &w);
5687d1ffc32SGordon Ross 	if (rc != 0) {
5697d1ffc32SGordon Ross 		printf("Fail: mbm_get_u0 decode\n");
5707d1ffc32SGordon Ross 		goto out;
5717d1ffc32SGordon Ross 	}
5727d1ffc32SGordon Ross 	/*
5737d1ffc32SGordon Ross 	 * Decode a word after the string to make sure we
5747d1ffc32SGordon Ross 	 * end up positioned correctly after the string.
5757d1ffc32SGordon Ross 	 */
5767d1ffc32SGordon Ross 	if (w != 42) {
5777d1ffc32SGordon Ross 		printf("Fail: mbm_get_u0 w=%d\n", w);
5787d1ffc32SGordon Ross 		return;
5797d1ffc32SGordon Ross 	}
5807d1ffc32SGordon Ross 	if (strcmp(s, "one") != 0) {
5817d1ffc32SGordon Ross 		printf("Fail: mbm_get_u0 cmp: <%s>\n", s);
5827d1ffc32SGordon Ross 		return;
5837d1ffc32SGordon Ross 	}
5847d1ffc32SGordon Ross 
5857d1ffc32SGordon Ross 	printf("Pass: mbm_get_u0\n");
5867d1ffc32SGordon Ross 
5877d1ffc32SGordon Ross out:
5887d1ffc32SGordon Ross 	MBC_FLUSH(&mbc);
5897d1ffc32SGordon Ross }
5907d1ffc32SGordon Ross 
5917d1ffc32SGordon Ross /*
5927d1ffc32SGordon Ross  * Parse a string that's NOT null terminated.
5937d1ffc32SGordon Ross  */
5947d1ffc32SGordon Ross static void
mbm_get_u1()5957d1ffc32SGordon Ross mbm_get_u1()
5967d1ffc32SGordon Ross {
5977d1ffc32SGordon Ross 	uint16_t wire[] = { 'o', 'n', 'e', '.', 42, 0 };
5987d1ffc32SGordon Ross 	mbuf_chain_t mbc;
5997d1ffc32SGordon Ross 	char *s;
6007d1ffc32SGordon Ross 	int rc;
6017d1ffc32SGordon Ross 	uint16_t w;
6027d1ffc32SGordon Ross 
6037d1ffc32SGordon Ross 	bzero(&mbc, sizeof (mbc));
6047d1ffc32SGordon Ross 	MBC_ATTACH_BUF(&mbc, (uchar_t *)wire, sizeof (wire));
6057d1ffc32SGordon Ross 
6067d1ffc32SGordon Ross 	rc = smb_mbc_decodef(&mbc, "%6U..w", &test_sr, &s, &w);
6077d1ffc32SGordon Ross 	if (rc != 0) {
6087d1ffc32SGordon Ross 		printf("Fail: mbm_get_u1 decode\n");
6097d1ffc32SGordon Ross 		goto out;
6107d1ffc32SGordon Ross 	}
6117d1ffc32SGordon Ross 	/*
6127d1ffc32SGordon Ross 	 * Decode a word after the string to make sure we
6137d1ffc32SGordon Ross 	 * end up positioned correctly after the string.
6147d1ffc32SGordon Ross 	 */
6157d1ffc32SGordon Ross 	if (w != 42) {
6167d1ffc32SGordon Ross 		printf("Fail: mbm_get_u1 w=%d\n", w);
6177d1ffc32SGordon Ross 		return;
6187d1ffc32SGordon Ross 	}
6197d1ffc32SGordon Ross 	if (strcmp(s, "one") != 0) {
6207d1ffc32SGordon Ross 		printf("Fail: mbm_get_u1 cmp: <%s>\n", s);
6217d1ffc32SGordon Ross 		return;
6227d1ffc32SGordon Ross 	}
6237d1ffc32SGordon Ross 
6247d1ffc32SGordon Ross 	printf("Pass: mbm_get_u1\n");
6257d1ffc32SGordon Ross 
6267d1ffc32SGordon Ross out:
6277d1ffc32SGordon Ross 	MBC_FLUSH(&mbc);
6287d1ffc32SGordon Ross }
6297d1ffc32SGordon Ross 
6307d1ffc32SGordon Ross /* parse exactly to end of data */
6317d1ffc32SGordon Ross static void
mbm_get_u2()6327d1ffc32SGordon Ross mbm_get_u2()
6337d1ffc32SGordon Ross {
6347d1ffc32SGordon Ross 	uint16_t wire[] = { 't', 'w', 'o' };
6357d1ffc32SGordon Ross 	mbuf_chain_t mbc;
6367d1ffc32SGordon Ross 	char *s;
6377d1ffc32SGordon Ross 	int rc;
6387d1ffc32SGordon Ross 
6397d1ffc32SGordon Ross 	bzero(&mbc, sizeof (mbc));
6407d1ffc32SGordon Ross 	MBC_ATTACH_BUF(&mbc, (uchar_t *)wire, sizeof (wire));
6417d1ffc32SGordon Ross 
6427d1ffc32SGordon Ross 	rc = smb_mbc_decodef(&mbc, "%6U", &test_sr, &s);
6437d1ffc32SGordon Ross 	if (rc != 0) {
6447d1ffc32SGordon Ross 		printf("Fail: mbm_get_u2 decode\n");
6457d1ffc32SGordon Ross 		goto out;
6467d1ffc32SGordon Ross 	}
6477d1ffc32SGordon Ross 	if (mbc.chain_offset != 6) {
6487d1ffc32SGordon Ross 		printf("Fail: mbm_get_u2 wrong pos\n");
6497d1ffc32SGordon Ross 		return;
6507d1ffc32SGordon Ross 	}
6517d1ffc32SGordon Ross 	if (strcmp(s, "two") != 0) {
6527d1ffc32SGordon Ross 		printf("Fail: mbm_get_u2 cmp: <%s>\n", s);
6537d1ffc32SGordon Ross 		return;
6547d1ffc32SGordon Ross 	}
6557d1ffc32SGordon Ross 
6567d1ffc32SGordon Ross 	printf("Pass: mbm_get_a2\n");
6577d1ffc32SGordon Ross 
6587d1ffc32SGordon Ross out:
6597d1ffc32SGordon Ross 	MBC_FLUSH(&mbc);
6607d1ffc32SGordon Ross }
6617d1ffc32SGordon Ross 
6627d1ffc32SGordon Ross static void
mbm_get_u3()6637d1ffc32SGordon Ross mbm_get_u3()
6647d1ffc32SGordon Ross {
6657d1ffc32SGordon Ross 	mbuf_chain_t mbc;
6667d1ffc32SGordon Ross 	char *s;
6677d1ffc32SGordon Ross 	int rc;
6687d1ffc32SGordon Ross 
6697d1ffc32SGordon Ross 	bzero(&mbc, sizeof (mbc));
6707d1ffc32SGordon Ross 	MBC_ATTACH_BUF(&mbc, (uchar_t *)wcsa, sizeof (wcsa));
6717d1ffc32SGordon Ross 
6727d1ffc32SGordon Ross 	rc = smb_mbc_decodef(&mbc, "%#U", &test_sr, sizeof (wcsa), &s);
6737d1ffc32SGordon Ross 	if (rc != 0) {
6747d1ffc32SGordon Ross 		printf("Fail: mbm_get_u3 decode\n");
6757d1ffc32SGordon Ross 		goto out;
6767d1ffc32SGordon Ross 	}
6777d1ffc32SGordon Ross 	if (strcmp(s, mbsa) != 0) {
6787d1ffc32SGordon Ross 		printf("Fail: mbm_get_u3 cmp: <%s>\n", s);
6797d1ffc32SGordon Ross 		return;
6807d1ffc32SGordon Ross 	}
6817d1ffc32SGordon Ross 
6827d1ffc32SGordon Ross 	printf("Pass: mbm_get_u3\n");
6837d1ffc32SGordon Ross 
6847d1ffc32SGordon Ross out:
6857d1ffc32SGordon Ross 	MBC_FLUSH(&mbc);
6867d1ffc32SGordon Ross }
6877d1ffc32SGordon Ross 
6887d1ffc32SGordon Ross static void
mbm_get_u4()6897d1ffc32SGordon Ross mbm_get_u4()
6907d1ffc32SGordon Ross {
6917d1ffc32SGordon Ross 	mbuf_chain_t mbc;
6927d1ffc32SGordon Ross 	char *s;
6937d1ffc32SGordon Ross 	int rc;
6947d1ffc32SGordon Ross 
6957d1ffc32SGordon Ross 	bzero(&mbc, sizeof (mbc));
6967d1ffc32SGordon Ross 	MBC_ATTACH_BUF(&mbc, (uchar_t *)wcsp, sizeof (wcsp));
6977d1ffc32SGordon Ross 
6987d1ffc32SGordon Ross 	rc = smb_mbc_decodef(&mbc, "%#U", &test_sr, sizeof (wcsp), &s);
6997d1ffc32SGordon Ross 	if (rc != 0) {
7007d1ffc32SGordon Ross 		printf("Fail: mbm_get_u4 decode\n");
7017d1ffc32SGordon Ross 		goto out;
7027d1ffc32SGordon Ross 	}
7037d1ffc32SGordon Ross 	if (strcmp(s, mbsp) != 0) {
7047d1ffc32SGordon Ross 		printf("Fail: mbm_get_u4 cmp: <%s>\n", s);
7057d1ffc32SGordon Ross 		return;
7067d1ffc32SGordon Ross 	}
7077d1ffc32SGordon Ross 
7087d1ffc32SGordon Ross 	printf("Pass: mbm_get_u4\n");
7097d1ffc32SGordon Ross 
7107d1ffc32SGordon Ross out:
7117d1ffc32SGordon Ross 	MBC_FLUSH(&mbc);
7127d1ffc32SGordon Ross }
7137d1ffc32SGordon Ross 
7147d1ffc32SGordon Ross void
test_mbmarshal()7157d1ffc32SGordon Ross test_mbmarshal()
7167d1ffc32SGordon Ross {
7177d1ffc32SGordon Ross 
7187d1ffc32SGordon Ross 	smb_mbc_init();
7197d1ffc32SGordon Ross 
7207d1ffc32SGordon Ross 	test_ssn.dialect = 0x210;	// SMB 2.1
7217d1ffc32SGordon Ross 	test_sr.session = &test_ssn;
7227d1ffc32SGordon Ross 	test_sr.sr_magic = SMB_REQ_MAGIC;
7237d1ffc32SGordon Ross 	smb_srm_init(&test_sr);
7247d1ffc32SGordon Ross 
7257d1ffc32SGordon Ross 	mbm_put_a0();
7267d1ffc32SGordon Ross 	mbm_put_a1();
7277d1ffc32SGordon Ross 	mbm_put_apad();
728*25a9a7aaSGordon Ross 	mbm_put_atrunc1();
729*25a9a7aaSGordon Ross 	mbm_put_atrunc2();
7307d1ffc32SGordon Ross 
7317d1ffc32SGordon Ross 	mbm_put_u0();
7327d1ffc32SGordon Ross 	mbm_put_u1();
7337d1ffc32SGordon Ross 	mbm_put_u3();
7347d1ffc32SGordon Ross 	mbm_put_u4();
7357d1ffc32SGordon Ross 	mbm_put_upad();
736*25a9a7aaSGordon Ross 	mbm_put_utrunc1();
737*25a9a7aaSGordon Ross 	mbm_put_utrunc2();
7387d1ffc32SGordon Ross 
7397d1ffc32SGordon Ross 	mbm_get_a0();
7407d1ffc32SGordon Ross 	mbm_get_a1();
7417d1ffc32SGordon Ross 	mbm_get_a2();
7427d1ffc32SGordon Ross 	mbm_get_u0();
7437d1ffc32SGordon Ross 	mbm_get_u1();
7447d1ffc32SGordon Ross 	mbm_get_u2();
7457d1ffc32SGordon Ross 	mbm_get_u3();
7467d1ffc32SGordon Ross 	mbm_get_u4();
7477d1ffc32SGordon Ross 
7487d1ffc32SGordon Ross 	smb_srm_fini(&test_sr);
7497d1ffc32SGordon Ross 	smb_mbc_fini();
7507d1ffc32SGordon Ross }
751