Resguardo inicial

This commit is contained in:
lastdragon
2026-09-06 12:53:21 -06:00
parent 662efe3c2a
commit ad2088d178
94853 changed files with 43200404 additions and 0 deletions
@@ -0,0 +1,4 @@
# SPDX-License-Identifier: GPL-2.0-only
media_device_test
media_device_open
video_device_test
@@ -0,0 +1,6 @@
# SPDX-License-Identifier: GPL-2.0
#
CFLAGS += -I../ $(KHDR_INCLUDES)
TEST_GEN_PROGS := media_device_test media_device_open video_device_test
include ../lib.mk
@@ -0,0 +1,13 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# Find device number in /sys/bus/usb/drivers/drivername
# Edit this file to update the driver numer and name
# Example test for uvcvideo driver
#i=0
# while :; do
# i=$((i+1))
# echo 1-5:1.0 > /sys/bus/usb/drivers/uvcvideo/unbind;
# echo 1-5:1.0 > /sys/bus/usb/drivers/uvcvideo/bind;
# clear
# echo $i
#done
@@ -0,0 +1,85 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# Media Device Allocator API test script
# Copyright (c) 2019 Shuah Khan <shuah@kernel.org>
echo "Media Device Allocator testing: unbind and bind"
echo "media driver $1 audio driver $2"
MDRIVER=/sys/bus/usb/drivers/$1
cd $MDRIVER
MDEV=$(ls -d *\-*)
ADRIVER=/sys/bus/usb/drivers/$2
cd $ADRIVER
ADEV=$(ls -d *\-*.1)
echo "=================================="
echo "Test unbind both devices - start"
echo "Running unbind of $MDEV from $MDRIVER"
echo $MDEV > $MDRIVER/unbind;
echo "Media device should still be present!"
ls -l /dev/media*
echo "sound driver is at: $ADRIVER"
echo "Device is: $ADEV"
echo "Running unbind of $ADEV from $ADRIVER"
echo $ADEV > $ADRIVER/unbind;
echo "Media device should have been deleted!"
ls -l /dev/media*
echo "Test unbind both devices - end"
echo "=================================="
echo "Test bind both devices - start"
echo "Running bind of $MDEV from $MDRIVER"
echo $MDEV > $MDRIVER/bind;
echo "Media device should be present!"
ls -l /dev/media*
echo "Running bind of $ADEV from $ADRIVER"
echo $ADEV > $ADRIVER/bind;
echo "Media device should be there!"
ls -l /dev/media*
echo "Test bind both devices - end"
echo "=================================="
echo "Test unbind $MDEV - bind $MDEV - unbind $ADEV - bind $ADEV start"
echo "Running unbind of $MDEV from $MDRIVER"
echo $MDEV > $MDRIVER/unbind;
echo "Media device should be there!"
ls -l /dev/media*
sleep 1
echo "Running bind of $MDEV from $MDRIVER"
echo $MDEV > $MDRIVER/bind;
echo "Media device should be there!"
ls -l /dev/media*
echo "Running unbind of $ADEV from $ADRIVER"
echo $ADEV > $ADRIVER/unbind;
echo "Media device should be there!"
ls -l /dev/media*
sleep 1
echo "Running bind of $ADEV from $ADRIVER"
echo $ADEV > $ADRIVER/bind;
echo "Media device should be there!"
ls -l /dev/media*
echo "Test unbind $MDEV - bind $MDEV - unbind $ADEV - bind $ADEV end"
echo "=================================="
@@ -0,0 +1,82 @@
// SPDX-License-Identifier: GPL-2.0
/*
* media_device_open.c - Media Controller Device Open Test
*
* Copyright (c) 2016 Shuah Khan <shuahkh@osg.samsung.com>
* Copyright (c) 2016 Samsung Electronics Co., Ltd.
*
*/
/*
* This file adds a test for Media Controller API.
* This test should be run as root and should not be
* included in the Kselftest run. This test should be
* run when hardware and driver that makes use Media
* Controller API are present in the system.
*
* This test opens user specified Media Device and calls
* MEDIA_IOC_DEVICE_INFO ioctl, closes the file, and exits.
*
* Usage:
* sudo ./media_device_open -d /dev/mediaX
*
* Run this test is a loop and run bind/unbind on the driver.
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <linux/media.h>
#include "kselftest.h"
int main(int argc, char **argv)
{
int opt;
char media_device[256];
int count = 0;
struct media_device_info mdi;
int ret;
int fd;
if (argc < 2) {
printf("Usage: %s [-d </dev/mediaX>]\n", argv[0]);
exit(-1);
}
/* Process arguments */
while ((opt = getopt(argc, argv, "d:")) != -1) {
switch (opt) {
case 'd':
strncpy(media_device, optarg, sizeof(media_device) - 1);
media_device[sizeof(media_device)-1] = '\0';
break;
default:
printf("Usage: %s [-d </dev/mediaX>]\n", argv[0]);
exit(-1);
}
}
if (getuid() != 0)
ksft_exit_skip("Please run the test as root - Exiting.\n");
/* Open Media device and keep it open */
fd = open(media_device, O_RDWR);
if (fd == -1) {
printf("Media Device open errno %s\n", strerror(errno));
exit(-1);
}
ret = ioctl(fd, MEDIA_IOC_DEVICE_INFO, &mdi);
if (ret < 0)
printf("Media Device Info errno %s\n", strerror(errno));
else
printf("Media device model %s driver %s\n",
mdi.model, mdi.driver);
}
@@ -0,0 +1,103 @@
// SPDX-License-Identifier: GPL-2.0
/*
* media_device_test.c - Media Controller Device ioctl loop Test
*
* Copyright (c) 2016 Shuah Khan <shuahkh@osg.samsung.com>
* Copyright (c) 2016 Samsung Electronics Co., Ltd.
*
*/
/*
* This file adds a test for Media Controller API.
* This test should be run as root and should not be
* included in the Kselftest run. This test should be
* run when hardware and driver that makes use Media
* Controller API are present in the system.
*
* This test opens user specified Media Device and calls
* MEDIA_IOC_DEVICE_INFO ioctl in a loop once every 10
* seconds.
*
* Usage:
* sudo ./media_device_test -d /dev/mediaX
*
* While test is running, remove the device and
* ensure there are no use after free errors and
* other Oops in the dmesg. Enable KaSan kernel
* config option for use-after-free error detection.
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <time.h>
#include <linux/media.h>
#include "kselftest.h"
int main(int argc, char **argv)
{
int opt;
char media_device[256];
int count;
struct media_device_info mdi;
int ret;
int fd;
if (argc < 2) {
printf("Usage: %s [-d </dev/mediaX>]\n", argv[0]);
exit(-1);
}
/* Process arguments */
while ((opt = getopt(argc, argv, "d:")) != -1) {
switch (opt) {
case 'd':
strncpy(media_device, optarg, sizeof(media_device) - 1);
media_device[sizeof(media_device)-1] = '\0';
break;
default:
printf("Usage: %s [-d </dev/mediaX>]\n", argv[0]);
exit(-1);
}
}
if (getuid() != 0)
ksft_exit_skip("Please run the test as root - Exiting.\n");
/* Generate random number of interations */
srand((unsigned int) time(NULL));
count = rand();
/* Open Media device and keep it open */
fd = open(media_device, O_RDWR);
if (fd == -1) {
printf("Media Device open errno %s\n", strerror(errno));
exit(-1);
}
printf("\nNote:\n"
"While test is running, remove the device and\n"
"ensure there are no use after free errors and\n"
"other Oops in the dmesg. Enable KaSan kernel\n"
"config option for use-after-free error detection.\n\n");
printf("Running test for %d iterations\n", count);
while (count > 0) {
ret = ioctl(fd, MEDIA_IOC_DEVICE_INFO, &mdi);
if (ret < 0)
printf("Media Device Info errno %s\n", strerror(errno));
else
printf("Media device model %s driver %s - count %d\n",
mdi.model, mdi.driver, count);
sleep(10);
count--;
}
}
@@ -0,0 +1,11 @@
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
i=0
file=/dev/media$1
while :; do
echo $file
i=$((i+1))
R=$(./media_device_open -d $file);
# clear
echo -e "Loop $i\n$R"
done
@@ -0,0 +1,43 @@
Testing for regressions in Media Controller API register, ioctl, syscall,
and unregister paths. There have a few problems that result in use-after
free on media_device, media_devnode, and cdev pointers when the driver is
unbound while ioctl is in progress.
Test Procedure:
Run bin/unbind loop while ioctls are in progress.
Run rmmod and modprobe.
Disconnect the device.
Setup:
Build media_device_test
cd tools/testing/selftests/media_tests
make
Regressions test for cdev use-after-free error on /dev/mediaX when driver
is unbound:
Start media_device_test to regression test media devnode dynamic alloc
and cdev use-after-free fixes. This opens media dev files and sits in
a loop running media ioctl MEDIA_IOC_DEVICE_INFO command once every 10
seconds. The idea is when device file goes away, media devnode and cdev
should stick around until this test exits.
The test for a random number of iterations or until user kills it with a
sleep 10 in between the ioctl calls.
sudo ./media_device_test -d /dev/mediaX
Regression test for media_devnode unregister race with ioctl_syscall:
Start 6 open_loop_test.sh tests with different /dev/mediaX files. When
device file goes away after unbind, device file name changes. Start the
test with possible device names. If we start with /dev/media0 for example,
after unbind, /dev/media1 or /dev/media2 could get created. The idea is
keep ioctls going while bind/unbind runs.
Copy bind_unbind_sample.txt and make changes to specify the driver name
and number to run bind and unbind. Start the bind_unbind.sh
Run dmesg looking for any use-after-free errors or mutex lock errors.
@@ -0,0 +1,156 @@
// SPDX-License-Identifier: GPL-2.0
/*
* video_device_test - Video Device Test
*
* Copyright (c) 2016 Shuah Khan <shuahkh@osg.samsung.com>
* Copyright (c) 2016 Samsung Electronics Co., Ltd.
*
*/
/*
* This file adds a test for Video Device. This test should not be included
* in the Kselftest run. This test should be run when hardware and driver
* that makes use of V4L2 API is present.
*
* This test opens user specified Video Device and calls video ioctls in a
* loop once every 10 seconds.
*
* Usage:
* sudo ./video_device_test -d /dev/videoX
*
* While test is running, remove the device or unbind the driver and
* ensure there are no use after free errors and other Oops in the
* dmesg.
* When possible, enable KaSan kernel config option for use-after-free
* error detection.
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <time.h>
#include <linux/videodev2.h>
#define PRIORITY_MAX 4
int priority_test(int fd)
{
/* This test will try to update the priority associated with a file descriptor */
enum v4l2_priority old_priority, new_priority, priority_to_compare;
int ret;
int result = 0;
ret = ioctl(fd, VIDIOC_G_PRIORITY, &old_priority);
if (ret < 0) {
printf("Failed to get priority: %s\n", strerror(errno));
return -1;
}
new_priority = (old_priority + 1) % PRIORITY_MAX;
ret = ioctl(fd, VIDIOC_S_PRIORITY, &new_priority);
if (ret < 0) {
printf("Failed to set priority: %s\n", strerror(errno));
return -1;
}
ret = ioctl(fd, VIDIOC_G_PRIORITY, &priority_to_compare);
if (ret < 0) {
printf("Failed to get new priority: %s\n", strerror(errno));
result = -1;
goto cleanup;
}
if (priority_to_compare != new_priority) {
printf("Priority wasn't set - test failed\n");
result = -1;
}
cleanup:
ret = ioctl(fd, VIDIOC_S_PRIORITY, &old_priority);
if (ret < 0) {
printf("Failed to restore priority: %s\n", strerror(errno));
return -1;
}
return result;
}
int loop_test(int fd)
{
int count;
struct v4l2_tuner vtuner;
struct v4l2_capability vcap;
int ret;
/* Generate random number of interations */
srand((unsigned int) time(NULL));
count = rand();
printf("\nNote:\n"
"While test is running, remove the device or unbind\n"
"driver and ensure there are no use after free errors\n"
"and other Oops in the dmesg. When possible, enable KaSan\n"
"kernel config option for use-after-free error detection.\n\n");
while (count > 0) {
ret = ioctl(fd, VIDIOC_QUERYCAP, &vcap);
if (ret < 0)
printf("VIDIOC_QUERYCAP errno %s\n", strerror(errno));
else
printf("Video device driver %s\n", vcap.driver);
ret = ioctl(fd, VIDIOC_G_TUNER, &vtuner);
if (ret < 0)
printf("VIDIOC_G_TUNER, errno %s\n", strerror(errno));
else
printf("type %d rangelow %d rangehigh %d\n",
vtuner.type, vtuner.rangelow, vtuner.rangehigh);
sleep(10);
count--;
}
return 0;
}
int main(int argc, char **argv)
{
int opt;
char video_dev[256];
int fd;
int test_result;
if (argc < 2) {
printf("Usage: %s [-d </dev/videoX>]\n", argv[0]);
exit(-1);
}
/* Process arguments */
while ((opt = getopt(argc, argv, "d:")) != -1) {
switch (opt) {
case 'd':
strncpy(video_dev, optarg, sizeof(video_dev) - 1);
video_dev[sizeof(video_dev)-1] = '\0';
break;
default:
printf("Usage: %s [-d </dev/videoX>]\n", argv[0]);
exit(-1);
}
}
/* Open Video device and keep it open */
fd = open(video_dev, O_RDWR);
if (fd == -1) {
printf("Video Device open errno %s\n", strerror(errno));
exit(-1);
}
test_result = priority_test(fd);
if (!test_result)
printf("Priority test - PASSED\n");
else
printf("Priority test - FAILED\n");
loop_test(fd);
}