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