116f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng/*
216f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng * Copyright (c) 2017 Fujitsu Ltd.
316f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng *  Ported: Guangwen Feng <fenggw-fnst@cn.fujitsu.com>
416f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng *
516f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng * This program is free software: you can redistribute it and/or modify
616f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng * it under the terms of the GNU General Public License as published by
716f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng * the Free Software Foundation, either version 2 of the License, or
816f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng * (at your option) any later version.
916f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng *
1016f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng * This program is distributed in the hope that it will be useful,
1116f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng * but WITHOUT ANY WARRANTY; without even the implied warranty of
1216f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1316f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng * GNU General Public License for more details.
1416f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng *
1516f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng * You should have received a copy of the GNU General Public License
1616f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng * along with this program, if not, see <http://www.gnu.org/licenses/>.
1716f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng */
1816f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng
1916f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng/*
2016f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng * This regression test can crash the buggy kernel,
2116f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng * and the bug was fixed in:
2216f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng *
2316f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng *  commit f05819df10d7b09f6d1eb6f8534a8f68e5a4fe61
2416f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng *  Author: David Howells <dhowells@redhat.com>
2516f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng *  Date:   Thu Oct 15 17:21:37 2015 +0100
2616f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng *
2716f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng *  KEYS: Fix crash when attempt to garbage collect
2816f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng *        an uninstantiated keyring
2916f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng */
3016f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng
3116f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng#include <errno.h>
3216f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng#include <sys/types.h>
3316f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng
34974a9282b5bda74c221d0c998c949b1266e4efc5Guangwen Feng#include "tst_test.h"
35974a9282b5bda74c221d0c998c949b1266e4efc5Guangwen Feng#include "lapi/keyctl.h"
3616f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng
3716f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Fengstatic void do_test(void)
3816f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng{
3916f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng	key_serial_t key;
4016f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng
4116f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng	key = add_key("user", "ltptestkey", "a", 1, KEY_SPEC_SESSION_KEYRING);
4216f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng	if (key == -1)
4316f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng		tst_brk(TBROK, "Failed to add key");
4416f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng
4516f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng	request_key("keyring", "foo", "bar", KEY_SPEC_THREAD_KEYRING);
4616f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng
4716f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng	TEST(keyctl(KEYCTL_UNLINK, key, KEY_SPEC_SESSION_KEYRING));
4816f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng	if (TEST_RETURN)
4916f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng		tst_res(TFAIL | TTERRNO, "keyctl unlink failed");
5016f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng	else
5116f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng		tst_res(TPASS, "Bug not reproduced");
5216f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng}
5316f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng
5416f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Fengstatic struct tst_test test = {
5516f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng	.test_all = do_test,
5616f4d568c0b63e0caa01be8ad6f408b3573ef132Guangwen Feng};
57