ret = misc_register(&misc1);
KUNIT_EXPECT_EQ(test, ret, 0);
KUNIT_EXPECT_TRUE(test, is_valid_dynamic_minor(misc1.minor));
ret = misc_register(&misc2);
KUNIT_EXPECT_EQ(test, ret, -EEXIST); if (ret == 0)
misc_deregister(&misc2);
misc_deregister(&misc1);
}
/* * Test that after a duplicate name failure, the reserved minor number is * freed to be allocated next.
*/ staticvoid miscdev_test_duplicate_name_leak(struct kunit *test)
{ struct miscdevice misc1 = {
.minor = MISC_DYNAMIC_MINOR,
.name = "misc1",
.fops = &miscdev_test_fops,
}; struct miscdevice misc2 = {
.minor = MISC_DYNAMIC_MINOR,
.name = "misc1",
.fops = &miscdev_test_fops,
}; struct miscdevice misc3 = {
.minor = MISC_DYNAMIC_MINOR,
.name = "misc3",
.fops = &miscdev_test_fops,
}; int ret; int dyn_minor;
ret = misc_register(&misc1);
KUNIT_EXPECT_EQ(test, ret, 0);
KUNIT_EXPECT_TRUE(test, is_valid_dynamic_minor(misc1.minor));
/* * Find out what is the next minor number available.
*/
ret = misc_register(&misc3);
KUNIT_EXPECT_EQ(test, ret, 0);
KUNIT_EXPECT_TRUE(test, is_valid_dynamic_minor(misc3.minor));
dyn_minor = misc3.minor;
misc_deregister(&misc3);
misc3.minor = MISC_DYNAMIC_MINOR;
ret = misc_register(&misc2);
KUNIT_EXPECT_EQ(test, ret, -EEXIST); if (ret == 0)
misc_deregister(&misc2);
/* * Now check that we can still get the same minor we found before.
*/
ret = misc_register(&misc3);
KUNIT_EXPECT_EQ(test, ret, 0);
KUNIT_EXPECT_TRUE(test, is_valid_dynamic_minor(misc3.minor));
KUNIT_EXPECT_EQ(test, misc3.minor, dyn_minor);
misc_deregister(&misc3);
misc_deregister(&misc1);
}
/* * Try to register a static minor with a duplicate name. That might not * deallocate the minor, preventing it from being used again.
*/ staticvoid miscdev_test_duplicate_error(struct kunit *test)
{ struct miscdevice miscdyn = {
.minor = MISC_DYNAMIC_MINOR,
.name = "name1",
.fops = &miscdev_test_fops,
}; struct miscdevice miscstat = {
.name = "name1",
.fops = &miscdev_test_fops,
}; struct miscdevice miscnew = {
.name = "name2",
.fops = &miscdev_test_fops,
}; int ret; conststruct miscdev_test_case *params = test->param_value;
for (i = 0; i < dynamic_minors; i++) {
miscdev[i].minor = MISC_DYNAMIC_MINOR;
miscdev[i].name = kasprintf(GFP_KERNEL, "misc_test%d", i);
miscdev[i].fops = &miscdev_test_fops;
ret = misc_register(&miscdev[i]); if (ret != 0) break; /* * This is the bug we are looking for! * We asked for a dynamic minor and got a minor in the static range space.
*/ if (miscdev[i].minor >= 0 && miscdev[i].minor <= 15) {
KUNIT_FAIL(test, "misc_register allocated minor %d\n", miscdev[i].minor);
i++; break;
}
KUNIT_EXPECT_TRUE(test, is_valid_dynamic_minor(miscdev[i].minor));
}
for (i--; i >= 0; i--) {
miscdev_test_can_open(test, &miscdev[i]);
misc_deregister(&miscdev[i]);
kfree_const(miscdev[i].name);
}
ret = misc_register(&miscdyn);
KUNIT_ASSERT_EQ(test, ret, 0);
KUNIT_EXPECT_TRUE(test, is_valid_dynamic_minor(miscdyn.minor));
/* * Try to register a static minor with the same minor as the * dynamic one.
*/
miscstat.minor = miscdyn.minor;
ret = misc_register(&miscstat);
KUNIT_EXPECT_EQ(test, ret, -EBUSY); if (ret == 0)
misc_deregister(&miscstat);
/* * Find the first available dynamic minor to use it as a static * minor later on.
*/
ret = misc_register(&miscdyn);
KUNIT_ASSERT_EQ(test, ret, 0);
KUNIT_EXPECT_TRUE(test, is_valid_dynamic_minor(miscdyn.minor));
miscstat.minor = miscdyn.minor;
misc_deregister(&miscdyn);
ret = misc_register(&miscstat);
KUNIT_EXPECT_EQ(test, ret, 0);
KUNIT_EXPECT_EQ(test, miscstat.minor, miscdyn.minor);
/* * Try to register a dynamic minor after registering a static minor * within the dynamic range. It should work but get a different * minor.
*/
miscdyn.minor = MISC_DYNAMIC_MINOR;
ret = misc_register(&miscdyn);
KUNIT_EXPECT_EQ(test, ret, 0);
KUNIT_EXPECT_NE(test, miscdyn.minor, miscstat.minor);
KUNIT_EXPECT_TRUE(test, is_valid_dynamic_minor(miscdyn.minor)); if (ret == 0)
misc_deregister(&miscdyn);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Vimal Agrawal");
MODULE_AUTHOR("Thadeu Lima de Souza Cascardo ");
MODULE_DESCRIPTION("Test module for misc character devices");
Messung V0.5
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.