You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
1.4 KiB
94 lines
1.4 KiB
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
/*
|
|
* Copyright (c) 2019 Cyril Hrubis <chrubis@suse.cz>
|
|
*/
|
|
|
|
/*
|
|
* Test that acces after guarded buffer causes segfault.
|
|
*/
|
|
|
|
#include <stdlib.h>
|
|
#include <sys/wait.h>
|
|
#include "tst_test.h"
|
|
|
|
#define BUF1_LEN 10
|
|
#define BUF2_LEN 4096
|
|
#define BUF3_LEN 12004
|
|
|
|
static char *buf1;
|
|
static char *buf2;
|
|
static char *buf3;
|
|
|
|
static void do_test(unsigned int n)
|
|
{
|
|
int pid;
|
|
int status;
|
|
|
|
if (n == 6) {
|
|
buf1[-1] = 0;
|
|
buf3[-1] = 0;
|
|
tst_res(TPASS, "Buffers dirtied!");
|
|
}
|
|
|
|
pid = SAFE_FORK();
|
|
if (!pid) {
|
|
switch (n) {
|
|
case 0:
|
|
buf1[BUF1_LEN - 1] = 0;
|
|
break;
|
|
case 1:
|
|
buf2[BUF2_LEN - 1] = 0;
|
|
break;
|
|
case 2:
|
|
buf3[BUF3_LEN - 1] = 0;
|
|
break;
|
|
case 3:
|
|
buf1[BUF1_LEN] = 0;
|
|
break;
|
|
case 4:
|
|
buf2[BUF2_LEN] = 0;
|
|
break;
|
|
case 5:
|
|
buf3[BUF3_LEN] = 0;
|
|
break;
|
|
case 6:
|
|
buf1[-2] = 0;
|
|
buf3[-2] = 0;
|
|
break;
|
|
}
|
|
|
|
exit(0);
|
|
}
|
|
|
|
SAFE_WAITPID(pid, &status, 0);
|
|
|
|
if (n == 6)
|
|
return;
|
|
|
|
if (n < 3) {
|
|
if (WIFEXITED(status) && WEXITSTATUS(status) == 0) {
|
|
tst_res(TPASS, "Exitted normally");
|
|
return;
|
|
}
|
|
} else {
|
|
if (WIFSIGNALED(status) && WTERMSIG(status) == SIGSEGV) {
|
|
tst_res(TPASS, "Killed by SIGSEGV");
|
|
return;
|
|
}
|
|
}
|
|
|
|
tst_res(TFAIL, "Child %s", tst_strstatus(status));
|
|
}
|
|
|
|
static struct tst_test test = {
|
|
.forks_child = 1,
|
|
.test = do_test,
|
|
.tcnt = 7,
|
|
.bufs = (struct tst_buffers []) {
|
|
{&buf1, .size = BUF1_LEN},
|
|
{&buf2, .size = BUF2_LEN},
|
|
{&buf3, .size = BUF3_LEN},
|
|
{}
|
|
}
|
|
};
|