1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 *   Copyright (c) International Business Machines  Corp., 2002
4 *
5 *   01/02/2003	Port to LTP	avenkat@us.ibm.com
6 *   06/30/2001	Port to Linux	nsharoff@us.ibm.com
7 */
8
9/*\
10 * [Description]
11 *
12 * The testcase for buffer copy by check boundary conditions.
13 */
14
15#include <stdio.h>
16#include <string.h>
17#include <unistd.h>
18#include <string.h>
19#include <errno.h>
20
21#include "tst_test.h"
22
23#define BSIZE	4096
24#define LEN	100
25
26char buf[BSIZE];
27
28static void clearit(void)
29{
30	register int i;
31
32	for (i = 0; i < BSIZE; i++)
33		buf[i] = 0;
34}
35
36static void fill(char *str, int len)
37{
38	register int i;
39	for (i = 0; i < len; i++)
40		*str++ = 'a';
41}
42
43static int checkit(char *str, int len)
44{
45	register int i;
46	for (i = 0; i < len; i++)
47		if (*str++ != 'a')
48			return (-1);
49
50	return 0;
51}
52
53static struct test_case {
54	char *p;
55	char *q;
56	int len;
57} tcases[] = {
58	{&buf[100], &buf[800], LEN},
59	{&buf[800], &buf[100], LEN},
60};
61
62static void setup(void)
63{
64	clearit();
65
66	return;
67}
68
69static void verify_memcpy(char *p, char *q, int len)
70{
71	fill(p, len);
72	memcpy(q, p, LEN);
73
74	if (checkit(q, len)) {
75		tst_res(TFAIL, "copy failed - missed data");
76		goto out;
77	}
78
79	if (p[-1] || p[LEN]) {
80		tst_res(TFAIL, "copy failed - 'to' bounds");
81		goto out;
82	}
83
84	if (q[-1] || q[LEN]) {
85		tst_res(TFAIL, "copy failed - 'from' bounds");
86		goto out;
87	}
88
89	tst_res(TPASS, "Test passed");
90out:
91	return;
92}
93
94static void run_test(unsigned int nr)
95{
96	struct test_case *tc = &tcases[nr];
97
98	clearit();
99	verify_memcpy(tc->p, tc->q, tc->len);
100
101	return;
102}
103
104static struct tst_test test = {
105	.tcnt = ARRAY_SIZE(tcases),
106	.setup = setup,
107	.test = run_test,
108};
109