Home | History | Annotate | Download | only in keyctl
      1 /*
      2  * Copyright (c) 2017 Google, Inc.
      3  *
      4  * This program is free software: you can redistribute it and/or modify
      5  * it under the terms of the GNU General Public License as published by
      6  * the Free Software Foundation, either version 2 of the License, or
      7  * (at your option) any later version.
      8  *
      9  * This program is distributed in the hope that it will be useful,
     10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     12  * GNU General Public License for more details.
     13  *
     14  * You should have received a copy of the GNU General Public License
     15  * along with this program, if not, see <http://www.gnu.org/licenses/>.
     16  */
     17 
     18 /*
     19  * Regression test for:
     20  *
     21  *	commit e645016abc80 ("KEYS: fix writing past end of user-supplied buffer
     22  *	in keyring_read()").
     23  *
     24  * as well as its follow-on fix:
     25  *
     26  *	commit 3239b6f29bdf ("KEYS: return full count in keyring_read() if
     27  *	buffer is too small")
     28  *
     29  */
     30 
     31 #include <errno.h>
     32 
     33 #include "tst_test.h"
     34 #include "lapi/keyctl.h"
     35 
     36 static void add_test_key(const char *description)
     37 {
     38 	TEST(add_key("user", description, "payload", 7,
     39 		     KEY_SPEC_PROCESS_KEYRING));
     40 	if (TST_RET < 0)
     41 		tst_brk(TBROK | TTERRNO, "Failed to add test key");
     42 }
     43 
     44 static void do_test(void)
     45 {
     46 	key_serial_t key_ids[2];
     47 
     48 	add_test_key("key1");
     49 	add_test_key("key2");
     50 
     51 	memset(key_ids, 0, sizeof(key_ids));
     52 	TEST(keyctl(KEYCTL_READ, KEY_SPEC_PROCESS_KEYRING,
     53 		    (char *)key_ids, sizeof(key_serial_t)));
     54 	if (TST_RET < 0)
     55 		tst_brk(TBROK | TTERRNO, "KEYCTL_READ failed");
     56 
     57 	/*
     58 	 * Do not check key_ids[0], as the contents of the buffer are
     59 	 * unspecified if it was too small.  However, key_ids[1] must not have
     60 	 * been written to, as it was outside the buffer.
     61 	 */
     62 
     63 	if (key_ids[1] != 0)
     64 		tst_brk(TFAIL, "KEYCTL_READ overran the buffer");
     65 
     66 	if (TST_RET != sizeof(key_ids)) {
     67 		tst_brk(TFAIL, "KEYCTL_READ returned %ld but expected %zu",
     68 			TST_RET, sizeof(key_ids));
     69 	}
     70 
     71 	tst_res(TPASS,
     72 		"KEYCTL_READ returned full count but didn't overrun the buffer");
     73 }
     74 
     75 static struct tst_test test = {
     76 	.test_all = do_test,
     77 };
     78