100efb5e1SYuri Pankov /*
200efb5e1SYuri Pankov  * Copyright (c) 2017 Juniper Networks.  All rights reserved.
300efb5e1SYuri Pankov  *
400efb5e1SYuri Pankov  * Redistribution and use in source and binary forms, with or without
500efb5e1SYuri Pankov  * modification, are permitted provided that the following conditions
600efb5e1SYuri Pankov  * are met:
700efb5e1SYuri Pankov  * 1. Redistributions of source code must retain the above copyright
800efb5e1SYuri Pankov  *    notice, this list of conditions and the following disclaimer.
900efb5e1SYuri Pankov  * 2. Redistributions in binary form must reproduce the above copyright
1000efb5e1SYuri Pankov  *    notice, this list of conditions and the following disclaimer in the
1100efb5e1SYuri Pankov  *    documentation and/or other materials provided with the distribution.
1200efb5e1SYuri Pankov  *
1300efb5e1SYuri Pankov  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
1400efb5e1SYuri Pankov  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1500efb5e1SYuri Pankov  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1600efb5e1SYuri Pankov  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
1700efb5e1SYuri Pankov  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1800efb5e1SYuri Pankov  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
1900efb5e1SYuri Pankov  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2000efb5e1SYuri Pankov  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2100efb5e1SYuri Pankov  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2200efb5e1SYuri Pankov  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2300efb5e1SYuri Pankov  * SUCH DAMAGE.
2400efb5e1SYuri Pankov  */
2500efb5e1SYuri Pankov 
2600efb5e1SYuri Pankov #include <assert.h>
27acab0a4fSYuri Pankov #include <errno.h>
2800efb5e1SYuri Pankov #include <stdint.h>
2900efb5e1SYuri Pankov #include <stdlib.h>
3000efb5e1SYuri Pankov #include <string.h>
3100efb5e1SYuri Pankov 
3200efb5e1SYuri Pankov static errno_t e;
3300efb5e1SYuri Pankov static const char *_RESTRICT_KYWD m;
3400efb5e1SYuri Pankov 
3500efb5e1SYuri Pankov void
h(const char * _RESTRICT_KYWD msg,void * _RESTRICT_KYWD ptr,errno_t error)3600efb5e1SYuri Pankov h(const char *_RESTRICT_KYWD msg, void *_RESTRICT_KYWD ptr, errno_t error)
3700efb5e1SYuri Pankov {
3800efb5e1SYuri Pankov 	e = error;
3900efb5e1SYuri Pankov 	m = msg;
4000efb5e1SYuri Pankov }
4100efb5e1SYuri Pankov 
4200efb5e1SYuri Pankov int
main(void)4300efb5e1SYuri Pankov main(void)
4400efb5e1SYuri Pankov {
4500efb5e1SYuri Pankov 	char a;
4600efb5e1SYuri Pankov 	char b[3];
4700efb5e1SYuri Pankov 
4800efb5e1SYuri Pankov 	/* null ptr */
49*b36afad7SRobert Mustacchi 	(void) set_constraint_handler_s(ignore_handler_s);
5000efb5e1SYuri Pankov 	assert(memset_s(0, 1, 1, 1) != 0);
5100efb5e1SYuri Pankov 
5200efb5e1SYuri Pankov 	/* smax > rmax */
53*b36afad7SRobert Mustacchi 	(void) set_constraint_handler_s(ignore_handler_s);
5400efb5e1SYuri Pankov 	assert(memset_s(&b, RSIZE_MAX + 1, 1, 1) != 0);
5500efb5e1SYuri Pankov 
5600efb5e1SYuri Pankov 	/* smax < 0 */
57*b36afad7SRobert Mustacchi 	(void) set_constraint_handler_s(ignore_handler_s);
5800efb5e1SYuri Pankov 	assert(memset_s(&a, -1, 1, 1) != 0);
5900efb5e1SYuri Pankov 
6000efb5e1SYuri Pankov 	/* normal */
61*b36afad7SRobert Mustacchi 	(void) set_constraint_handler_s(ignore_handler_s);
6200efb5e1SYuri Pankov 	a = 3;
6300efb5e1SYuri Pankov 	assert(memset_s(&a, 1, 5, 1) == 0);
6400efb5e1SYuri Pankov 	assert(a == 5);
6500efb5e1SYuri Pankov 
6600efb5e1SYuri Pankov 	/* n > rmax */
67*b36afad7SRobert Mustacchi 	(void) set_constraint_handler_s(ignore_handler_s);
6800efb5e1SYuri Pankov 	assert(memset_s(&a, 1, 1, RSIZE_MAX + 1) != 0);
6900efb5e1SYuri Pankov 
7000efb5e1SYuri Pankov 	/* n < 0 */
71*b36afad7SRobert Mustacchi 	(void) set_constraint_handler_s(ignore_handler_s);
7200efb5e1SYuri Pankov 	assert(memset_s(&a, 1, 1, -1) != 0);
7300efb5e1SYuri Pankov 
7400efb5e1SYuri Pankov 	/* n < smax */
75*b36afad7SRobert Mustacchi 	(void) set_constraint_handler_s(ignore_handler_s);
7600efb5e1SYuri Pankov 	b[0] = 1; b[1] = 2; b[2] = 3;
7700efb5e1SYuri Pankov 	assert(memset_s(&b[0], 3, 9, 1) == 0);
7800efb5e1SYuri Pankov 	assert(b[0] == 9);
7900efb5e1SYuri Pankov 	assert(b[1] == 2);
8000efb5e1SYuri Pankov 	assert(b[2] == 3);
8100efb5e1SYuri Pankov 
8200efb5e1SYuri Pankov 	/* n > smax, handler */
83*b36afad7SRobert Mustacchi 	(void) set_constraint_handler_s(h);
8400efb5e1SYuri Pankov 	e = 0;
8500efb5e1SYuri Pankov 	m = NULL;
8600efb5e1SYuri Pankov 	b[0] = 1; b[1] = 2; b[2] = 3;
8700efb5e1SYuri Pankov 	assert(memset_s(&b[0], 1, 9, 3) != 0);
8800efb5e1SYuri Pankov 	assert(e > 0);
8900efb5e1SYuri Pankov 	assert(strcmp(m, "memset_s: n > smax") == 0);
9000efb5e1SYuri Pankov 	assert(b[0] == 9);
9100efb5e1SYuri Pankov 	assert(b[1] == 2);
9200efb5e1SYuri Pankov 	assert(b[2] == 3);
9300efb5e1SYuri Pankov 
9400efb5e1SYuri Pankov 	/* smax > rmax, handler */
95*b36afad7SRobert Mustacchi 	(void) set_constraint_handler_s(h);
9600efb5e1SYuri Pankov 	e = 0;
9700efb5e1SYuri Pankov 	m = NULL;
9800efb5e1SYuri Pankov 	assert(memset_s(&a, RSIZE_MAX + 1, 1, 1) != 0);
9900efb5e1SYuri Pankov 	assert(e > 0);
10000efb5e1SYuri Pankov 	assert(strcmp(m, "memset_s: smax > RSIZE_MAX") == 0);
10100efb5e1SYuri Pankov 
10200efb5e1SYuri Pankov 	/* smax < 0, handler */
103*b36afad7SRobert Mustacchi 	(void) set_constraint_handler_s(h);
10400efb5e1SYuri Pankov 	e = 0;
10500efb5e1SYuri Pankov 	m = NULL;
10600efb5e1SYuri Pankov 	assert(memset_s(&a, -1, 1, 1) != 0);
10700efb5e1SYuri Pankov 	assert(e > 0);
10800efb5e1SYuri Pankov 	assert(strcmp(m, "memset_s: smax > RSIZE_MAX") == 0);
10900efb5e1SYuri Pankov 
11000efb5e1SYuri Pankov 	/* n > rmax, handler */
111*b36afad7SRobert Mustacchi 	(void) set_constraint_handler_s(h);
11200efb5e1SYuri Pankov 	e = 0;
11300efb5e1SYuri Pankov 	m = NULL;
11400efb5e1SYuri Pankov 	assert(memset_s(&a, 1, 1, RSIZE_MAX + 1) != 0);
11500efb5e1SYuri Pankov 	assert(e > 0);
11600efb5e1SYuri Pankov 	assert(strcmp(m, "memset_s: n > RSIZE_MAX") == 0);
11700efb5e1SYuri Pankov 
11800efb5e1SYuri Pankov 	/* n < 0, handler */
119*b36afad7SRobert Mustacchi 	(void) set_constraint_handler_s(h);
12000efb5e1SYuri Pankov 	e = 0;
12100efb5e1SYuri Pankov 	m = NULL;
12200efb5e1SYuri Pankov 	assert(memset_s(&a, 1, 1, -1) != 0);
12300efb5e1SYuri Pankov 	assert(e > 0);
12400efb5e1SYuri Pankov 	assert(strcmp(m, "memset_s: n > RSIZE_MAX") == 0);
12500efb5e1SYuri Pankov 
12600efb5e1SYuri Pankov 	return (0);
12700efb5e1SYuri Pankov }
128