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