File: memmove_validate.c

package info (click to toggle)
linux 6.1.139-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm-proposed-updates
  • size: 1,495,880 kB
  • sloc: ansic: 23,469,452; asm: 266,614; sh: 110,522; makefile: 49,887; python: 36,990; perl: 36,834; cpp: 6,056; yacc: 4,908; lex: 2,725; awk: 1,440; ruby: 25; sed: 5
file content (58 lines) | stat: -rw-r--r-- 1,228 bytes parent folder | download | duplicates (15)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
// SPDX-License-Identifier: GPL-2.0
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include "utils.h"

void *TEST_MEMMOVE(const void *s1, const void *s2, size_t n);

#define BUF_LEN 65536
#define MAX_OFFSET 512

size_t max(size_t a, size_t b)
{
	if (a >= b)
		return a;
	return b;
}

static int testcase_run(void)
{
	size_t i, src_off, dst_off, len;

	char *usermap = memalign(BUF_LEN, BUF_LEN);
	char *kernelmap = memalign(BUF_LEN, BUF_LEN);

	assert(usermap != NULL);
	assert(kernelmap != NULL);

	memset(usermap, 0, BUF_LEN);
	memset(kernelmap, 0, BUF_LEN);

	for (i = 0; i < BUF_LEN; i++) {
		usermap[i] = i & 0xff;
		kernelmap[i] = i & 0xff;
	}

	for (src_off = 0; src_off < MAX_OFFSET; src_off++) {
		for (dst_off = 0; dst_off < MAX_OFFSET; dst_off++) {
			for (len = 1; len < MAX_OFFSET - max(src_off, dst_off); len++) {

				memmove(usermap + dst_off, usermap + src_off, len);
				TEST_MEMMOVE(kernelmap + dst_off, kernelmap + src_off, len);
				if (memcmp(usermap, kernelmap, MAX_OFFSET) != 0) {
					printf("memmove failed at %ld %ld %ld\n",
							src_off, dst_off, len);
					abort();
				}
			}
		}
	}
	return 0;
}

int main(void)
{
	return test_harness(testcase_run, "memmove");
}