xref: /freebsd/lib/libc/tests/string/memset_s_test.c (revision 559a218c9b257775fb249b67945fe4a05b7a6b9f)
19851b340SKonstantin Belousov /*-
29851b340SKonstantin Belousov  * Copyright (c) 2017 Juniper Networks.  All rights reserved.
39851b340SKonstantin Belousov  *
49851b340SKonstantin Belousov  * Redistribution and use in source and binary forms, with or without
59851b340SKonstantin Belousov  * modification, are permitted provided that the following conditions
69851b340SKonstantin Belousov  * are met:
79851b340SKonstantin Belousov  * 1. Redistributions of source code must retain the above copyright
89851b340SKonstantin Belousov  *    notice, this list of conditions and the following disclaimer.
99851b340SKonstantin Belousov  * 2. Redistributions in binary form must reproduce the above copyright
109851b340SKonstantin Belousov  *    notice, this list of conditions and the following disclaimer in the
119851b340SKonstantin Belousov  *    documentation and/or other materials provided with the distribution.
129851b340SKonstantin Belousov  *
139851b340SKonstantin Belousov  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
149851b340SKonstantin Belousov  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
159851b340SKonstantin Belousov  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
169851b340SKonstantin Belousov  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
179851b340SKonstantin Belousov  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
189851b340SKonstantin Belousov  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
199851b340SKonstantin Belousov  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
209851b340SKonstantin Belousov  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
219851b340SKonstantin Belousov  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
229851b340SKonstantin Belousov  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
239851b340SKonstantin Belousov  * SUCH DAMAGE.
249851b340SKonstantin Belousov  */
259851b340SKonstantin Belousov 
269851b340SKonstantin Belousov #include <assert.h>
279851b340SKonstantin Belousov #include <stdint.h>
289851b340SKonstantin Belousov #include <stdlib.h>
299851b340SKonstantin Belousov #include <string.h>
309851b340SKonstantin Belousov 
319851b340SKonstantin Belousov #include <atf-c.h>
329851b340SKonstantin Belousov 
339851b340SKonstantin Belousov static errno_t e;
349851b340SKonstantin Belousov static const char * restrict m;
359851b340SKonstantin Belousov 
369851b340SKonstantin Belousov void
h(const char * restrict msg,void * restrict ptr __unused,errno_t error)379851b340SKonstantin Belousov h(const char * restrict msg, void * restrict ptr __unused, errno_t error)
389851b340SKonstantin Belousov {
399851b340SKonstantin Belousov 	e = error;
409851b340SKonstantin Belousov 	m = msg;
419851b340SKonstantin Belousov }
429851b340SKonstantin Belousov 
439851b340SKonstantin Belousov /* null ptr */
449851b340SKonstantin Belousov ATF_TC_WITHOUT_HEAD(null_ptr);
ATF_TC_BODY(null_ptr,tc)459851b340SKonstantin Belousov ATF_TC_BODY(null_ptr, tc)
469851b340SKonstantin Belousov {
479851b340SKonstantin Belousov 	assert(memset_s(0, 1, 1, 1) != 0);
489851b340SKonstantin Belousov }
499851b340SKonstantin Belousov 
509851b340SKonstantin Belousov /* smax > rmax */
519851b340SKonstantin Belousov ATF_TC_WITHOUT_HEAD(smax_gt_rmax);
ATF_TC_BODY(smax_gt_rmax,tc)529851b340SKonstantin Belousov ATF_TC_BODY(smax_gt_rmax, tc)
539851b340SKonstantin Belousov {
549851b340SKonstantin Belousov 	char b;
559851b340SKonstantin Belousov 
569851b340SKonstantin Belousov 	assert(memset_s(&b, RSIZE_MAX + 1, 1, 1) != 0);
579851b340SKonstantin Belousov }
589851b340SKonstantin Belousov 
599851b340SKonstantin Belousov /* smax < 0 */
609851b340SKonstantin Belousov ATF_TC_WITHOUT_HEAD(smax_lt_zero);
ATF_TC_BODY(smax_lt_zero,tc)619851b340SKonstantin Belousov ATF_TC_BODY(smax_lt_zero, tc)
629851b340SKonstantin Belousov {
639851b340SKonstantin Belousov 	char b;
649851b340SKonstantin Belousov 
659851b340SKonstantin Belousov 	assert(memset_s(&b, -1, 1, 1) != 0);
669851b340SKonstantin Belousov }
679851b340SKonstantin Belousov 
689851b340SKonstantin Belousov /* normal */
699851b340SKonstantin Belousov ATF_TC_WITHOUT_HEAD(normal);
ATF_TC_BODY(normal,tc)709851b340SKonstantin Belousov ATF_TC_BODY(normal, tc)
719851b340SKonstantin Belousov {
729851b340SKonstantin Belousov 	char b;
739851b340SKonstantin Belousov 
749851b340SKonstantin Belousov 	b = 3;
759851b340SKonstantin Belousov 	assert(memset_s(&b, 1, 5, 1) == 0);
769851b340SKonstantin Belousov 	assert(b == 5);
779851b340SKonstantin Belousov }
789851b340SKonstantin Belousov 
799851b340SKonstantin Belousov /* n > rmax */
809851b340SKonstantin Belousov ATF_TC_WITHOUT_HEAD(n_gt_rmax);
ATF_TC_BODY(n_gt_rmax,tc)819851b340SKonstantin Belousov ATF_TC_BODY(n_gt_rmax, tc)
829851b340SKonstantin Belousov {
839851b340SKonstantin Belousov 	char b;
849851b340SKonstantin Belousov 
859851b340SKonstantin Belousov 	assert(memset_s(&b, 1, 1, RSIZE_MAX + 1) != 0);
869851b340SKonstantin Belousov }
879851b340SKonstantin Belousov 
889851b340SKonstantin Belousov /* n < 0 */
899851b340SKonstantin Belousov ATF_TC_WITHOUT_HEAD(n_lt_zero);
ATF_TC_BODY(n_lt_zero,tc)909851b340SKonstantin Belousov ATF_TC_BODY(n_lt_zero, tc)
919851b340SKonstantin Belousov {
929851b340SKonstantin Belousov 	char b;
939851b340SKonstantin Belousov 
949851b340SKonstantin Belousov 	assert(memset_s(&b, 1, 1, -1) != 0);
959851b340SKonstantin Belousov }
969851b340SKonstantin Belousov 
979851b340SKonstantin Belousov /* n < smax */
989851b340SKonstantin Belousov ATF_TC_WITHOUT_HEAD(n_lt_smax);
ATF_TC_BODY(n_lt_smax,tc)999851b340SKonstantin Belousov ATF_TC_BODY(n_lt_smax, tc)
1009851b340SKonstantin Belousov {
1019851b340SKonstantin Belousov 	char b[3] = {1, 2, 3};
1029851b340SKonstantin Belousov 
1039851b340SKonstantin Belousov 	assert(memset_s(&b[0], 3, 9, 1) == 0);
1049851b340SKonstantin Belousov 	assert(b[0] == 9);
1059851b340SKonstantin Belousov 	assert(b[1] == 2);
1069851b340SKonstantin Belousov 	assert(b[2] == 3);
1079851b340SKonstantin Belousov }
1089851b340SKonstantin Belousov 
109*25b73e63SKonstantin Belousov /* n > smax, handler */
1109851b340SKonstantin Belousov ATF_TC_WITHOUT_HEAD(n_gt_smax);
ATF_TC_BODY(n_gt_smax,tc)1119851b340SKonstantin Belousov ATF_TC_BODY(n_gt_smax, tc)
1129851b340SKonstantin Belousov {
1139851b340SKonstantin Belousov 	char b[3] = {1, 2, 3};
1149851b340SKonstantin Belousov 
115*25b73e63SKonstantin Belousov 	e = 0;
116*25b73e63SKonstantin Belousov 	m = NULL;
117*25b73e63SKonstantin Belousov 	set_constraint_handler_s(h);
118*25b73e63SKonstantin Belousov 	assert(memset_s(&b[0], 1, 9, 3) != 0);
119*25b73e63SKonstantin Belousov 	assert(e > 0);
120*25b73e63SKonstantin Belousov 	assert(strcmp(m, "memset_s : n > smax") == 0);
1219851b340SKonstantin Belousov 	assert(b[0] == 9);
1229851b340SKonstantin Belousov 	assert(b[1] == 2);
1239851b340SKonstantin Belousov 	assert(b[2] == 3);
1249851b340SKonstantin Belousov }
1259851b340SKonstantin Belousov 
1269851b340SKonstantin Belousov /* smax > rmax, handler */
1279851b340SKonstantin Belousov ATF_TC_WITHOUT_HEAD(smax_gt_rmax_handler);
ATF_TC_BODY(smax_gt_rmax_handler,tc)1289851b340SKonstantin Belousov ATF_TC_BODY(smax_gt_rmax_handler, tc)
1299851b340SKonstantin Belousov {
1309851b340SKonstantin Belousov 	char b;
1319851b340SKonstantin Belousov 
1329851b340SKonstantin Belousov 	e = 0;
1339851b340SKonstantin Belousov 	m = NULL;
1349851b340SKonstantin Belousov 	set_constraint_handler_s(h);
1359851b340SKonstantin Belousov 	assert(memset_s(&b, RSIZE_MAX + 1, 1, 1) != 0);
1369851b340SKonstantin Belousov 	assert(e > 0);
1379851b340SKonstantin Belousov 	assert(strcmp(m, "memset_s : smax > RSIZE_MAX") == 0);
1389851b340SKonstantin Belousov }
1399851b340SKonstantin Belousov 
1409851b340SKonstantin Belousov /* smax < 0, handler */
1419851b340SKonstantin Belousov ATF_TC_WITHOUT_HEAD(smax_lt_zero_handler);
ATF_TC_BODY(smax_lt_zero_handler,tc)1429851b340SKonstantin Belousov ATF_TC_BODY(smax_lt_zero_handler, tc)
1439851b340SKonstantin Belousov {
1449851b340SKonstantin Belousov 	char b;
1459851b340SKonstantin Belousov 
1469851b340SKonstantin Belousov 	e = 0;
1479851b340SKonstantin Belousov 	m = NULL;
1489851b340SKonstantin Belousov 	set_constraint_handler_s(h);
1499851b340SKonstantin Belousov 	assert(memset_s(&b, -1, 1, 1) != 0);
1509851b340SKonstantin Belousov 	assert(e > 0);
1519851b340SKonstantin Belousov 	assert(strcmp(m, "memset_s : smax > RSIZE_MAX") == 0);
1529851b340SKonstantin Belousov }
1539851b340SKonstantin Belousov 
1549851b340SKonstantin Belousov /* n > rmax, handler */
1559851b340SKonstantin Belousov ATF_TC_WITHOUT_HEAD(n_gt_rmax_handler);
ATF_TC_BODY(n_gt_rmax_handler,tc)1569851b340SKonstantin Belousov ATF_TC_BODY(n_gt_rmax_handler, tc)
1579851b340SKonstantin Belousov {
1589851b340SKonstantin Belousov 	char b;
1599851b340SKonstantin Belousov 
1609851b340SKonstantin Belousov 	e = 0;
1619851b340SKonstantin Belousov 	m = NULL;
1629851b340SKonstantin Belousov 	set_constraint_handler_s(h);
1639851b340SKonstantin Belousov 	assert(memset_s(&b, 1, 1, RSIZE_MAX + 1) != 0);
1649851b340SKonstantin Belousov 	assert(e > 0);
1659851b340SKonstantin Belousov 	assert(strcmp(m, "memset_s : n > RSIZE_MAX") == 0);
1669851b340SKonstantin Belousov }
1679851b340SKonstantin Belousov 
1689851b340SKonstantin Belousov /* n < 0, handler */
1699851b340SKonstantin Belousov ATF_TC_WITHOUT_HEAD(n_lt_zero_handler);
ATF_TC_BODY(n_lt_zero_handler,tc)1709851b340SKonstantin Belousov ATF_TC_BODY(n_lt_zero_handler, tc)
1719851b340SKonstantin Belousov {
1729851b340SKonstantin Belousov 	char b;
1739851b340SKonstantin Belousov 
1749851b340SKonstantin Belousov 	e = 0;
1759851b340SKonstantin Belousov 	m = NULL;
1769851b340SKonstantin Belousov 	set_constraint_handler_s(h);
1779851b340SKonstantin Belousov 	assert(memset_s(&b, 1, 1, -1) != 0);
1789851b340SKonstantin Belousov 	assert(e > 0);
1799851b340SKonstantin Belousov 	assert(strcmp(m, "memset_s : n > RSIZE_MAX") == 0);
1809851b340SKonstantin Belousov }
1819851b340SKonstantin Belousov 
ATF_TP_ADD_TCS(tp)1829851b340SKonstantin Belousov ATF_TP_ADD_TCS(tp)
1839851b340SKonstantin Belousov {
1849851b340SKonstantin Belousov 	ATF_TP_ADD_TC(tp, null_ptr);
1859851b340SKonstantin Belousov 	ATF_TP_ADD_TC(tp, smax_gt_rmax);
1869851b340SKonstantin Belousov 	ATF_TP_ADD_TC(tp, smax_lt_zero);
1879851b340SKonstantin Belousov 	ATF_TP_ADD_TC(tp, normal);
1889851b340SKonstantin Belousov 	ATF_TP_ADD_TC(tp, n_gt_rmax);
1899851b340SKonstantin Belousov 	ATF_TP_ADD_TC(tp, n_lt_zero);
1909851b340SKonstantin Belousov 	ATF_TP_ADD_TC(tp, n_gt_smax);
1919851b340SKonstantin Belousov 	ATF_TP_ADD_TC(tp, n_lt_smax);
1929851b340SKonstantin Belousov 	ATF_TP_ADD_TC(tp, smax_gt_rmax_handler);
1939851b340SKonstantin Belousov 	ATF_TP_ADD_TC(tp, smax_lt_zero_handler);
1949851b340SKonstantin Belousov 	ATF_TP_ADD_TC(tp, n_gt_rmax_handler);
1959851b340SKonstantin Belousov 	ATF_TP_ADD_TC(tp, n_lt_zero_handler);
1969851b340SKonstantin Belousov 	return (atf_no_error());
1979851b340SKonstantin Belousov }
198