Hi,

this is v4l-test 0.13 patch for LTP.

Changes:
Added string content validation;
Test cases added for VIDIOC_REQBUFS

Signed-off-by: Márton Németh <[email protected]>

Regards,

        Márton Németh
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/doc/index.html ltp/testcases/kernel/device-drivers/v4l/user_space/doc/index.html
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/doc/index.html	2009-04-21 11:23:00.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/doc/index.html	2009-04-29 20:39:35.000000000 +0200
@@ -1,7 +1,7 @@
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd";>
 <html>
 <head>
-  <meta content="text/html;charset=ISO-8859-2" http-equiv="Content-Type">
+  <meta content="text/html;charset=UTF-8" http-equiv="Content-Type">
   <title>v4l-test: Test environment for Video For Linux Two API</title>
 </head>
 <body>
@@ -416,7 +416,7 @@ implemented test cases.</p>
     </tr>
     <tr>
       <td>ioctl <a href="spec/r13696.htm">VIDIOC_REQBUFS</a></td>
-      <td>no</td>
+      <td>yes, only when STREAM_OFF</td>
       <td>Opt.</td>
     </tr>
     <tr>
@@ -504,10 +504,11 @@ The following documents and articles are
   <a href="http://lwn.net/Articles/203924/";>The Video4Linux2 API series</a> at
   <a href="http://lwn.net/";>lwn.net</a>
   </li>
-  <li><a href="http://people.atrpms.net/~hdegoede/libv4l.spec";>libv4l</a>
+  <li><a href="http://freshmeat.net/projects/libv4l";>libv4l</a>
       <a href="http://people.atrpms.net/~hdegoede/libv4l-0.5.8.tar.gz";>0.5.8</a>
   </li>
-  <li>Simple V4L2 video viewer: <a href="http://moinejf.free.fr/svv.c";>svv.c</a>
+  <li>Simple V4L2 video viewer: <a href="http://moinejf.free.fr/svv.c";>svv.c</a>,
+      writen by <a href="http://moinejf.free.fr/";>Jean-François Moine</a>
   </li>
 </ul>
 
@@ -515,7 +516,7 @@ The following documents and articles are
 <p>Any feedbacks, comments, ideas, etc. are welcome at the author's email address.</p>
 <hr style="width: 100%; height: 2px;">
 <p>Last changed:
-Sun Apr 19 11:03:40 CEST 2009
+Wed Apr 29 20:39:28 CEST 2009
 </p>
 <p>
   <a href="http://validator.w3.org/check?uri=referer";><img
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/Makefile ltp/testcases/kernel/device-drivers/v4l/user_space/Makefile
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/Makefile	2009-04-13 09:25:29.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/Makefile	2009-04-25 17:49:54.000000000 +0200
@@ -1,6 +1,7 @@
 #
 # v4l-test: Test environment for Video For Linux Two API
 #
+# 25 Apr 2009  0.14 test_VIDIOC_REQBUFS.c added
 #  5 Apr 2009  0.13 test_VIDIOC_QUERYMENU.c added
 #  4 Apr 2009  0.12 test_VIDIOC_FMT.c added
 # 22 Mar 2009  0.11 test_VIDIOC_OUTPUT.c added,
@@ -60,6 +61,7 @@ OBJS = dev_video.o \
        test_VIDIOC_CTRL.o \
        test_VIDIOC_PARM.o \
        test_VIDIOC_FMT.o \
+       test_VIDIOC_REQBUFS.o \
        test_invalid_ioctl.o \
        v4l2_test.o
 
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/README ltp/testcases/kernel/device-drivers/v4l/user_space/README
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/README	2009-04-21 11:22:59.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/README	2009-04-29 20:26:20.000000000 +0200
@@ -3,6 +3,8 @@
 
 Release History
 ---------------
+29 Apr 2009  0.13 Added string content validation;
+                  Test cases added for VIDIOC_REQBUFS
 19 Apr 2009  0.12 Test cases added for VIDIOC_S_FMT;
                   NULL parameter test suite split to read only, write only
                   and write/read ioctl suite;
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_AUDIO.c ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_AUDIO.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_AUDIO.c	2009-04-21 11:23:00.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_AUDIO.c	2009-04-20 20:08:49.000000000 +0200
@@ -1,6 +1,7 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ * 20 Apr 2009  0.7  Added string content validation
  * 18 Apr 2009  0.6  More strict check for strings
  * 29 Mar 2009  0.5  Clean up test case for NULL parameter
  * 25 Mar 2009  0.4  Cleaned up dprintf() outputs and ret and errno names
@@ -30,6 +31,7 @@
 #include "v4l2_test.h"
 #include "dev_video.h"
 #include "video_limits.h"
+#include "v4l2_validator.h"
 
 #include "test_VIDIOC_ENUMAUDIO.h"
 
@@ -75,9 +77,8 @@ void test_VIDIOC_G_AUDIO() {
 
 		//CU_ASSERT_EQUAL(audio.index, ?);
 
-		//CU_ASSERT_EQUAL(audio.name, ?);
 		CU_ASSERT(0 < strlen( (char*)audio.name ));
-		CU_ASSERT(strlen( (char*)audio.name ) < sizeof(audio.name));
+		CU_ASSERT(valid_string((char*)audio.name, sizeof(audio.name)));
 
 		CU_ASSERT(valid_audio_capability(audio.capability));
 		CU_ASSERT(valid_audio_mode(audio.mode));
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_AUDOUT.c ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_AUDOUT.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_AUDOUT.c	2009-04-21 11:23:00.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_AUDOUT.c	2009-04-20 20:06:41.000000000 +0200
@@ -1,6 +1,7 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ * 20 Apr 2009  0.7  Added string content validation
  * 18 Apr 2009  0.6  More strict check for strings
  * 29 Mar 2009  0.5  Clean up test case for NULL parameter
  * 22 Mar 2009  0.4  Cleaned up dprintf() messages
@@ -30,6 +31,7 @@
 #include "v4l2_test.h"
 #include "dev_video.h"
 #include "video_limits.h"
+#include "v4l2_validator.h"
 
 #include "test_VIDIOC_AUDOUT.h"
 
@@ -61,9 +63,8 @@ void test_VIDIOC_G_AUDOUT() {
 
 		//CU_ASSERT_EQUAL(audioout.index, ?);
 
-		//CU_ASSERT_EQUAL(audioout.name, ?);
 		CU_ASSERT(0 < strlen( (char*)audioout.name ));
-		CU_ASSERT(strlen( (char*)audioout.name ) < sizeof(audioout.name));
+		CU_ASSERT(valid_string((char*)audioout.name, sizeof(audioout.name)));
 
 		CU_ASSERT_EQUAL(audioout.capability, 0);
 		CU_ASSERT_EQUAL(audioout.mode, 0);
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUMAUDIO.c ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUMAUDIO.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUMAUDIO.c	2009-04-21 11:23:00.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUMAUDIO.c	2009-04-20 20:06:22.000000000 +0200
@@ -1,6 +1,7 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ * 20 Apr 2009  0.7  Added string content validation
  * 18 Apr 2009  0.6  More strict check for strings
  * 29 Mar 2009  0.5  Clean up test case for NULL parameter
  * 28 Mar 2009  0.4  Clean up ret and errno variable names and dprintf() output
@@ -30,6 +31,7 @@
 #include "v4l2_test.h"
 #include "dev_video.h"
 #include "video_limits.h"
+#include "v4l2_validator.h"
 
 #include "test_VIDIOC_ENUMAUDIO.h"
 
@@ -53,8 +55,8 @@ void test_VIDIOC_ENUMAUDIO() {
 			CU_ASSERT_EQUAL(ret_enum, 0);
 			CU_ASSERT_EQUAL(audio.index, i);
 
-			//CU_ASSERT_EQUAL(audio.name, ?);
 			CU_ASSERT(0 < strlen( (char*)audio.name ));
+			CU_ASSERT(valid_string((char*)audio.name, sizeof(audio.name)));
 
 			//CU_ASSERT_EQUAL(audio.capability, ?);
 			//CU_ASSERT_EQUAL(audio.mode, ?);
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUMAUDOUT.c ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUMAUDOUT.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUMAUDOUT.c	2009-04-21 11:23:00.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUMAUDOUT.c	2009-04-20 20:09:31.000000000 +0200
@@ -1,6 +1,7 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ * 20 Apr 2009  0.4  Added string content validation
  * 18 Apr 2009  0.3  More strict check for strings
  * 25 Mar 2009  0.2  Typos corrected, cleaned up dprintf() outputs;
  *                   cleaned up ret and errno variable names
@@ -35,6 +36,7 @@
 #include "v4l2_test.h"
 #include "dev_video.h"
 #include "video_limits.h"
+#include "v4l2_validator.h"
 
 #include "test_VIDIOC_ENUMAUDOUT.h"
 
@@ -57,8 +59,8 @@ void test_VIDIOC_ENUMAUDOUT() {
 			CU_ASSERT_EQUAL(ret_enum, 0);
 			CU_ASSERT_EQUAL(audioout.index, i);
 
-			//CU_ASSERT_EQUAL(audioout.name, ?);
 			CU_ASSERT(0 < strlen( (char*)audioout.name ));
+			CU_ASSERT(valid_string((char*)audioout.name, sizeof(audioout.name)));
 
 			//CU_ASSERT_EQUAL(audioout.capability, ?);
 			//CU_ASSERT_EQUAL(audioout.mode, ?);
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUM_FMT.c ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUM_FMT.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUM_FMT.c	2009-04-21 11:23:00.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUM_FMT.c	2009-04-20 20:09:42.000000000 +0200
@@ -1,6 +1,7 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ * 20 Apr 2009  0.9  Added string content validation
  * 18 Apr 2009  0.8  More strict check for strings
  * 13 Apr 2009  0.7  Also show type in debug output;
  *                   Add some debug output
@@ -34,6 +35,7 @@
 #include "v4l2_test.h"
 #include "dev_video.h"
 #include "video_limits.h"
+#include "v4l2_validator.h"
 
 #include "test_VIDIOC_ENUM_FMT.h"
 
@@ -60,8 +62,8 @@ static void do_enumerate_formats(enum v4
 			//CU_ASSERT_EQUAL(format.type, ?);
 			//CU_ASSERT_EQUAL(format.flags, ?);
 
-			//CU_ASSERT_EQUAL(format.description, ?);
 			CU_ASSERT(0 < strlen( (char*)format.description ));
+			CU_ASSERT(valid_string((char*)format.description, sizeof(format.description)));
 
 			//CU_ASSERT_EQUAL(format.pixelformat, ?);
 			CU_ASSERT_EQUAL(format.reserved[0], 0);
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUMINPUT.c ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUMINPUT.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUMINPUT.c	2009-04-21 11:23:00.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUMINPUT.c	2009-04-20 20:03:41.000000000 +0200
@@ -1,6 +1,8 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ * 20 Apr 2009  0.9  Added string content validation
+ * 19 Apr 2009  0.8  Also check std field
  * 18 Apr 2009  0.7  More strict check for strings
  *  3 Apr 2009  0.6  Test case for NULL parameter reworked
  * 28 Mar 2009  0.5  Clean up ret and errno variable names and dprintf() output
@@ -32,6 +34,7 @@
 #include "v4l2_test.h"
 #include "dev_video.h"
 #include "video_limits.h"
+#include "v4l2_validator.h"
 
 #include "test_VIDIOC_ENUMINPUT.h"
 
@@ -55,13 +58,13 @@ void test_VIDIOC_ENUMINPUT() {
 			CU_ASSERT_EQUAL(ret_enum, 0);
 			CU_ASSERT_EQUAL(input.index, i);
 
-			//CU_ASSERT_EQUAL(input.name, ?);
 			CU_ASSERT(0 < strlen( (char*)input.name ));
+			CU_ASSERT(valid_string((char*)input.name, sizeof(input.name)));
 
 			//CU_ASSERT_EQUAL(input.type, ?);
 			//CU_ASSERT_EQUAL(input.audioset, ?);
 			//CU_ASSERT_EQUAL(input.tuner, ?);
-			//CU_ASSERT_EQUAL(input.std, ?);
+			CU_ASSERT(valid_v4l2_std_id(input.std));
 			//CU_ASSERT_EQUAL(input.status, ?);
 			CU_ASSERT_EQUAL(input.reserved[0], 0);
 			CU_ASSERT_EQUAL(input.reserved[1], 0);
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUMOUTPUT.c ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUMOUTPUT.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUMOUTPUT.c	2009-04-21 11:23:00.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUMOUTPUT.c	2009-04-20 20:03:03.000000000 +0200
@@ -1,6 +1,8 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ * 20 Apr 2009  0.6  Added string content validation
+ * 19 Apr 2009  0.5  Also check std field
  * 18 Apr 2009  0.4  More strict check for strings
  *  3 Apr 2009  0.3  Test case for NULL parameter reworked
  * 28 Mar 2009  0.2  Clean up ret and errno variable names and dprintf() output
@@ -28,6 +30,7 @@
 #include "v4l2_test.h"
 #include "dev_video.h"
 #include "video_limits.h"
+#include "v4l2_validator.h"
 
 #include "test_VIDIOC_ENUMOUTPUT.h"
 
@@ -51,13 +54,13 @@ void test_VIDIOC_ENUMOUTPUT() {
 			CU_ASSERT_EQUAL(ret_enum, 0);
 			CU_ASSERT_EQUAL(output.index, i);
 
-			//CU_ASSERT_EQUAL(output.name, ?);
 			CU_ASSERT(0 < strlen( (char*)output.name ));
+			CU_ASSERT(valid_string((char*)output.name, sizeof(output.name)));
 
 			//CU_ASSERT_EQUAL(output.type, ?);
 			//CU_ASSERT_EQUAL(output.audioset, ?);
 			//CU_ASSERT_EQUAL(output.modulator, ?);
-			//CU_ASSERT_EQUAL(output.std, ?);
+			CU_ASSERT(valid_v4l2_std_id(output.std));
 			CU_ASSERT_EQUAL(output.reserved[0], 0);
 			CU_ASSERT_EQUAL(output.reserved[1], 0);
 			CU_ASSERT_EQUAL(output.reserved[2], 0);
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUMSTD.c ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUMSTD.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUMSTD.c	2009-04-21 11:23:00.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_ENUMSTD.c	2009-04-20 20:02:19.000000000 +0200
@@ -1,6 +1,8 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ * 20 Apr 2009  0.9  Added string content validation
+ * 19 Apr 2009  0.8  Also check std field
  * 18 Apr 2009  0.7  More strict check for strings
  *  3 Apr 2009  0.6  Test case for NULL parameter reworked
  * 28 Mar 2009  0.5  Clean up ret and errno variable names and dprintf() output
@@ -37,6 +39,7 @@
 #include "v4l2_test.h"
 #include "dev_video.h"
 #include "video_limits.h"
+#include "v4l2_validator.h"
 
 #include "test_VIDIOC_ENUMSTD.h"
 
@@ -59,10 +62,10 @@ void test_VIDIOC_ENUMSTD() {
 		if (ret_enum == 0) {
 			CU_ASSERT_EQUAL(ret_enum, 0);
 			CU_ASSERT_EQUAL(std.index, i);
-			//CU_ASSERT_EQUAL(std.id, ?);
+			CU_ASSERT(valid_v4l2_std_id(std.id));
 
-			//CU_ASSERT_EQUAL(std.name, ?);
 			CU_ASSERT(0 < strlen( (char*)std.name ));
+			CU_ASSERT(valid_string((char*)std.name, sizeof(std.name)));
 
 			//CU_ASSERT_EQUAL(std.frameperiod.numerator, ?);
 			//CU_ASSERT_EQUAL(std.frameperiod.denominator, ?);
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_MODULATOR.c ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_MODULATOR.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_MODULATOR.c	2009-04-21 11:23:00.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_MODULATOR.c	2009-04-20 20:02:54.000000000 +0200
@@ -1,6 +1,7 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ * 20 Apr 2009  0.4  Added string content validation
  * 18 Apr 2009  0.3  More strict check for strings
  * 28 Mar 2009  0.2  Clean up ret and errno variable names and dprintf() output
  *  2 Feb 2009  0.1  First release
@@ -67,6 +68,7 @@ static int do_get_modulator(int f, __u32
 		CU_ASSERT_EQUAL(modulator.index, index);
 
 		CU_ASSERT(0 < strlen( (char*)modulator.name ));
+		CU_ASSERT(valid_string((char*)modulator.name, sizeof(modulator.name)));
 
 		CU_ASSERT(valid_modulator_capability(modulator.capability));
 
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_QUERYCAP.c ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_QUERYCAP.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_QUERYCAP.c	2009-04-21 11:23:00.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_QUERYCAP.c	2009-04-20 20:23:21.000000000 +0200
@@ -1,6 +1,7 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ * 20 Apr 2009  0.5  Added string content validation
  * 18 Apr 2009  0.4  More strict check for strings
  * 29 Mar 2009  0.3  Clean up ret and errno variable names and dprintf() output
  * 22 Dec 2008  0.2  Test case with NULL parameter added
@@ -28,6 +29,7 @@
 #include "v4l2_test.h"
 #include "dev_video.h"
 #include "video_limits.h"
+#include "v4l2_validator.h"
 
 #include "test_VIDIOC_QUERYCAP.h"
 
@@ -87,16 +89,16 @@ void test_VIDIOC_QUERYCAP() {
 	/* This ioctl must be implemented by ALL drivers */
 	CU_ASSERT_EQUAL(ret, 0);
 	if (ret == 0) {
-		//CU_ASSERT_EQUAL(cap.driver, ?);
 		CU_ASSERT(0 < strlen( (char*)cap.driver) );
-		CU_ASSERT(strlen( (char*)cap.driver) < sizeof(cap.driver));
+		CU_ASSERT(valid_string((char*)cap.driver, sizeof(cap.driver)));
 
-		//CU_ASSERT_EQUAL(cap.card, ?);
 		CU_ASSERT(0 < strlen( (char*)cap.card) );
-		CU_ASSERT(strlen( (char*)cap.card) < sizeof(cap.card) );
+		CU_ASSERT(valid_string((char*)cap.card, sizeof(cap.card)));
 
-		//CU_ASSERT_EQUAL(cap.bus_info, ?);
-		CU_ASSERT(strlen( (char*)cap.bus_info) < sizeof(cap.bus_info) );
+		/* cap.bus_info is allowed to be an empty string ("") if no
+		 * is info available
+		 */
+		CU_ASSERT(valid_string((char*)cap.bus_info, sizeof(cap.bus_info)));
 
 		//CU_ASSERT_EQUAL(cap.version, ?);
 		CU_ASSERT(valid_capabilities(cap.capabilities));
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_QUERYCTRL.c ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_QUERYCTRL.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_QUERYCTRL.c	2009-04-21 11:23:00.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_QUERYCTRL.c	2009-04-20 20:10:04.000000000 +0200
@@ -1,6 +1,7 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ * 20 Apr 2009  0.4  Added string content validation
  * 18 Apr 2009  0.3  More strict check for strings
  * 28 Mar 2009  0.2  Clean up ret and errno variable names and dprintf() output
  *  2 Jan 2009  0.1  First release
@@ -25,6 +26,7 @@
 #include "v4l2_test.h"
 #include "dev_video.h"
 #include "video_limits.h"
+#include "v4l2_validator.h"
 
 #include "test_VIDIOC_QUERYCTRL.h"
 
@@ -69,6 +71,20 @@ void test_VIDIOC_QUERYCTRL() {
 	struct v4l2_queryctrl queryctrl2;
 	__u32 i;
 
+	/* The available controls and their parameters
+	 * may change with different
+	 *  - input or output
+	 *  - tuner or modulator
+	 *  - audio input or audio output
+	 * See V4L API specification rev. 0.24, Chapter 1.8.
+	 * "User Controls" for details
+	 *
+	 * TODO: iterate through the mentioned settings.
+	 * TODO: check for deprecated controls (maybe in a
+	 * separated test case which could fail when a
+	 * deprecated control is supported)
+	 */
+
 	for (i = V4L2_CID_BASE; i < V4L2_CID_LASTP1; i++) {
 
 		memset(&queryctrl, 0xff, sizeof(queryctrl));
@@ -83,8 +99,8 @@ void test_VIDIOC_QUERYCTRL() {
 			CU_ASSERT_EQUAL(ret_query, 0);
 			CU_ASSERT_EQUAL(queryctrl.id, i);
 
-			//CU_ASSERT_EQUAL(queryctrl.name, ?);
 			CU_ASSERT(0 < strlen( (char*)queryctrl.name ));
+			CU_ASSERT(valid_string((char*)queryctrl.name, sizeof(queryctrl.name)));
 
 			CU_ASSERT(valid_control_type(queryctrl.type));
 
@@ -423,8 +439,8 @@ void test_VIDIOC_QUERYCTRL_private() {
 			CU_ASSERT_EQUAL(ret_query, 0);
 			CU_ASSERT_EQUAL(queryctrl.id, i);
 
-			//CU_ASSERT_EQUAL(queryctrl.name, ?);
 			CU_ASSERT(0 < strlen( (char*)queryctrl.name ));
+			CU_ASSERT(valid_string((char*)queryctrl.name, sizeof(queryctrl.name)));
 
 			CU_ASSERT(valid_control_type(queryctrl.type));
 
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_QUERYMENU.c ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_QUERYMENU.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_QUERYMENU.c	2009-04-21 11:23:00.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_QUERYMENU.c	2009-04-20 20:09:16.000000000 +0200
@@ -1,6 +1,7 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ * 20 Apr 2009  0.3  Added string content validation
  * 18 Apr 2009  0.2  More strict check for strings
  *  5 Apr 2009  0.1  First release
  *
@@ -24,6 +25,7 @@
 #include "v4l2_test.h"
 #include "dev_video.h"
 #include "video_limits.h"
+#include "v4l2_validator.h"
 
 #include "test_VIDIOC_QUERYCTRL.h"
 
@@ -47,9 +49,8 @@ static void do_check_menu(__u32 id, __u3
 		CU_ASSERT_EQUAL(menu->id, id);
 		CU_ASSERT_EQUAL(menu->index, index);
 
-		//CU_ASSERT_EQUAL(menu->name, ???);
 		CU_ASSERT(0 < strlen((char*)menu->name));
-		CU_ASSERT(strlen((char*)menu->name) < sizeof(menu->name));
+		CU_ASSERT(valid_string((char*)menu->name, sizeof(menu->name)));
 
 		CU_ASSERT_EQUAL(menu->reserved, 0);
 
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_REQBUFS.c ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_REQBUFS.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_REQBUFS.c	1970-01-01 01:00:00.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_REQBUFS.c	2009-04-29 20:14:41.000000000 +0200
@@ -0,0 +1,426 @@
+/*
+ * v4l-test: Test environment for Video For Linux Two API
+ *
+ * 29 Apr 2009  0.1  First release
+ *
+ * Written by Márton Németh <[email protected]>
+ * Released under GPL
+ */
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <errno.h>
+#include <string.h>
+
+#include <linux/videodev2.h>
+#include <linux/errno.h>
+
+#include <CUnit/CUnit.h>
+
+#include "v4l2_test.h"
+#include "dev_video.h"
+#include "video_limits.h"
+
+#include "test_VIDIOC_REQBUFS.h"
+
+static void show_v4l2_requestbuffers(struct v4l2_requestbuffers *reqbuf) {
+	dprintf("\treqbuf = { "
+		".count=%u, "
+		".type=%i, "
+		".memory=%i, "
+		".reserved = { 0x%X, 0x%X } "
+		"}\n",
+		reqbuf->count,
+		reqbuf->type,
+		reqbuf->memory,
+		reqbuf->reserved[0],
+		reqbuf->reserved[1]
+	);
+}
+
+static void do_VIDIOC_REQBUFS_capture_mmap(__u32 count) {
+	int ret_cap, errno_cap;
+	int ret_req, errno_req;
+	struct v4l2_capability cap;
+	struct v4l2_requestbuffers reqbuf;
+	struct v4l2_requestbuffers reqbuf2;
+
+	memset(&cap, 0, sizeof(cap));
+
+	ret_cap = ioctl(get_video_fd(), VIDIOC_QUERYCAP, &cap);
+	errno_cap = errno;
+
+	memset(&reqbuf, 0xff, sizeof(reqbuf));
+	reqbuf.count = count;
+	reqbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+	reqbuf.memory = V4L2_MEMORY_MMAP;
+
+	ret_req = ioctl(get_video_fd(), VIDIOC_REQBUFS, &reqbuf);
+	errno_req = errno;
+
+	dprintf("\t%s:%u: VIDIOC_REQBUF, count=%u, ret_req=%i, errno_req=%i\n",
+		__FILE__, __LINE__, count, ret_req, errno_req);
+
+	if (ret_cap == 0 &&
+	    (cap.capabilities & V4L2_CAP_STREAMING) &&
+	    (cap.capabilities & V4L2_CAP_VIDEO_CAPTURE)) {
+
+		CU_ASSERT_EQUAL(ret_cap, 0);
+		CU_ASSERT(cap.capabilities & V4L2_CAP_STREAMING);
+
+		CU_ASSERT_EQUAL(ret_req, 0);
+		//CU_ASSERT_EQUAL(reqbuf.count, ???);
+		CU_ASSERT_EQUAL(reqbuf.type, V4L2_BUF_TYPE_VIDEO_CAPTURE);
+		CU_ASSERT_EQUAL(reqbuf.memory, V4L2_MEMORY_MMAP);
+		CU_ASSERT_EQUAL(reqbuf.reserved[0], 0);
+		CU_ASSERT_EQUAL(reqbuf.reserved[1], 0);
+
+	} else {
+		CU_ASSERT_EQUAL(ret_req, -1);
+		CU_ASSERT_EQUAL(errno_req, EINVAL);
+
+		memset(&reqbuf2, 0xff, sizeof(reqbuf2));
+		reqbuf2.count = count;
+		reqbuf2.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+		reqbuf2.memory = V4L2_MEMORY_MMAP;
+
+		CU_ASSERT_EQUAL(memcmp(&reqbuf, &reqbuf2, sizeof(reqbuf)), 0);
+	}
+
+	if (ret_req == 0) {
+		show_v4l2_requestbuffers(&reqbuf);
+	}
+
+}
+
+void test_VIDIOC_REQBUFS_capture_mmap() {
+	do_VIDIOC_REQBUFS_capture_mmap(0);
+	do_VIDIOC_REQBUFS_capture_mmap(1);
+	do_VIDIOC_REQBUFS_capture_mmap(2);
+	do_VIDIOC_REQBUFS_capture_mmap(3);
+	do_VIDIOC_REQBUFS_capture_mmap(4);
+	do_VIDIOC_REQBUFS_capture_mmap((__u32)S16_MIN);
+	do_VIDIOC_REQBUFS_capture_mmap((__u32)S16_MAX);
+	do_VIDIOC_REQBUFS_capture_mmap(U32_MAX);
+	do_VIDIOC_REQBUFS_capture_mmap(0);
+}
+
+static void do_VIDIOC_REQBUFS_capture_userptr(__u32 count) {
+	int ret_cap, errno_cap;
+	int ret_req, errno_req;
+	struct v4l2_capability cap;
+	struct v4l2_requestbuffers reqbuf;
+	struct v4l2_requestbuffers reqbuf2;
+
+	memset(&cap, 0, sizeof(cap));
+
+	ret_cap = ioctl(get_video_fd(), VIDIOC_QUERYCAP, &cap);
+	errno_cap = errno;
+
+	memset(&reqbuf, 0xff, sizeof(reqbuf));
+	reqbuf.count = count;
+	reqbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+	reqbuf.memory = V4L2_MEMORY_USERPTR;
+
+	ret_req = ioctl(get_video_fd(), VIDIOC_REQBUFS, &reqbuf);
+	errno_req = errno;
+
+	dprintf("\t%s:%u: VIDIOC_REQBUF, count=%u, ret_req=%i, errno_req=%i\n",
+		__FILE__, __LINE__, count, ret_req, errno_req);
+
+	if (ret_cap == 0 &&
+	    (cap.capabilities & V4L2_CAP_STREAMING) &&
+	    (cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) &&
+	    ret_req == 0
+	    ) {
+		CU_ASSERT_EQUAL(ret_cap, 0);
+		CU_ASSERT(cap.capabilities & V4L2_CAP_STREAMING);
+
+		CU_ASSERT_EQUAL(ret_req, 0);
+		//CU_ASSERT_EQUAL(reqbuf.count, ???);
+		CU_ASSERT_EQUAL(reqbuf.type, V4L2_BUF_TYPE_VIDEO_CAPTURE);
+		CU_ASSERT_EQUAL(reqbuf.memory, V4L2_MEMORY_USERPTR);
+		CU_ASSERT_EQUAL(reqbuf.reserved[0], 0);
+		CU_ASSERT_EQUAL(reqbuf.reserved[1], 0);
+
+	} else {
+		CU_ASSERT_EQUAL(ret_req, -1);
+		CU_ASSERT_EQUAL(errno_req, EINVAL);
+
+		memset(&reqbuf2, 0xff, sizeof(reqbuf2));
+		reqbuf2.count = count;
+		reqbuf2.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+		reqbuf2.memory = V4L2_MEMORY_USERPTR;
+
+		CU_ASSERT_EQUAL(memcmp(&reqbuf, &reqbuf2, sizeof(reqbuf)), 0);
+	}
+
+	if (ret_req == 0) {
+		show_v4l2_requestbuffers(&reqbuf);
+	}
+
+}
+
+void test_VIDIOC_REQBUFS_capture_userptr() {
+	do_VIDIOC_REQBUFS_capture_userptr(0);
+	do_VIDIOC_REQBUFS_capture_userptr(1);
+	do_VIDIOC_REQBUFS_capture_userptr((__u32)S16_MIN);
+	do_VIDIOC_REQBUFS_capture_userptr((__u32)S16_MAX);
+	do_VIDIOC_REQBUFS_capture_userptr(U32_MAX);
+	do_VIDIOC_REQBUFS_capture_userptr(0);
+}
+
+static void do_VIDIOC_REQBUFS_output_mmap(__u32 count) {
+	int ret_cap, errno_cap;
+	int ret_req, errno_req;
+	struct v4l2_capability cap;
+	struct v4l2_requestbuffers reqbuf;
+	struct v4l2_requestbuffers reqbuf2;
+
+	memset(&cap, 0, sizeof(cap));
+
+	ret_cap = ioctl(get_video_fd(), VIDIOC_QUERYCAP, &cap);
+	errno_cap = errno;
+
+	memset(&reqbuf, 0xff, sizeof(reqbuf));
+	reqbuf.count = count;
+	reqbuf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
+	reqbuf.memory = V4L2_MEMORY_MMAP;
+
+	ret_req = ioctl(get_video_fd(), VIDIOC_REQBUFS, &reqbuf);
+	errno_req = errno;
+
+	dprintf("\t%s:%u: VIDIOC_REQBUF, count=%u, ret_req=%i, errno_req=%i\n",
+		__FILE__, __LINE__, count, ret_req, errno_req);
+
+	if (ret_cap == 0 &&
+	    (cap.capabilities & V4L2_CAP_STREAMING) &&
+	    (cap.capabilities & V4L2_CAP_VIDEO_OUTPUT)) {
+
+		CU_ASSERT_EQUAL(ret_cap, 0);
+		CU_ASSERT(cap.capabilities & V4L2_CAP_STREAMING);
+
+		CU_ASSERT_EQUAL(ret_req, 0);
+		//CU_ASSERT_EQUAL(reqbuf.count, ???);
+		CU_ASSERT_EQUAL(reqbuf.type, V4L2_BUF_TYPE_VIDEO_OUTPUT);
+		CU_ASSERT_EQUAL(reqbuf.memory, V4L2_MEMORY_MMAP);
+		CU_ASSERT_EQUAL(reqbuf.reserved[0], 0);
+		CU_ASSERT_EQUAL(reqbuf.reserved[1], 0);
+
+	} else {
+		CU_ASSERT_EQUAL(ret_req, -1);
+		CU_ASSERT_EQUAL(errno_req, EINVAL);
+
+		memset(&reqbuf2, 0xff, sizeof(reqbuf2));
+		reqbuf2.count = count;
+		reqbuf2.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
+		reqbuf2.memory = V4L2_MEMORY_MMAP;
+
+		CU_ASSERT_EQUAL(memcmp(&reqbuf, &reqbuf2, sizeof(reqbuf)), 0);
+	}
+
+	if (ret_req == 0) {
+		show_v4l2_requestbuffers(&reqbuf);
+	}
+
+}
+
+void test_VIDIOC_REQBUFS_output_mmap() {
+	do_VIDIOC_REQBUFS_output_mmap(0);
+	do_VIDIOC_REQBUFS_output_mmap(1);
+	do_VIDIOC_REQBUFS_output_mmap(2);
+	do_VIDIOC_REQBUFS_output_mmap(3);
+	do_VIDIOC_REQBUFS_output_mmap(4);
+	do_VIDIOC_REQBUFS_output_mmap((__u32)S16_MIN);
+	do_VIDIOC_REQBUFS_output_mmap((__u32)S16_MAX);
+	do_VIDIOC_REQBUFS_output_mmap(U32_MAX);
+	do_VIDIOC_REQBUFS_output_mmap(0);
+}
+
+static void do_VIDIOC_REQBUFS_output_userptr(__u32 count) {
+	int ret_cap, errno_cap;
+	int ret_req, errno_req;
+	struct v4l2_capability cap;
+	struct v4l2_requestbuffers reqbuf;
+	struct v4l2_requestbuffers reqbuf2;
+
+	memset(&cap, 0, sizeof(cap));
+
+	ret_cap = ioctl(get_video_fd(), VIDIOC_QUERYCAP, &cap);
+	errno_cap = errno;
+
+	memset(&reqbuf, 0xff, sizeof(reqbuf));
+	reqbuf.count = count;
+	reqbuf.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
+	reqbuf.memory = V4L2_MEMORY_USERPTR;
+
+	ret_req = ioctl(get_video_fd(), VIDIOC_REQBUFS, &reqbuf);
+	errno_req = errno;
+
+	dprintf("\t%s:%u: VIDIOC_REQBUF, count=%u, ret_req=%i, errno_req=%i\n",
+		__FILE__, __LINE__, count, ret_req, errno_req);
+
+	if (ret_cap == 0 &&
+	    (cap.capabilities & V4L2_CAP_STREAMING) &&
+	    (cap.capabilities & V4L2_CAP_VIDEO_OUTPUT) &&
+	    ret_req == 0
+	    ) {
+		CU_ASSERT_EQUAL(ret_cap, 0);
+		CU_ASSERT(cap.capabilities & V4L2_CAP_STREAMING);
+
+		CU_ASSERT_EQUAL(ret_req, 0);
+		//CU_ASSERT_EQUAL(reqbuf.count, ???);
+		CU_ASSERT_EQUAL(reqbuf.type, V4L2_BUF_TYPE_VIDEO_OUTPUT);
+		CU_ASSERT_EQUAL(reqbuf.memory, V4L2_MEMORY_USERPTR);
+		CU_ASSERT_EQUAL(reqbuf.reserved[0], 0);
+		CU_ASSERT_EQUAL(reqbuf.reserved[1], 0);
+
+	} else {
+		CU_ASSERT_EQUAL(ret_req, -1);
+		CU_ASSERT_EQUAL(errno_req, EINVAL);
+
+		memset(&reqbuf2, 0xff, sizeof(reqbuf2));
+		reqbuf2.count = count;
+		reqbuf2.type = V4L2_BUF_TYPE_VIDEO_OUTPUT;
+		reqbuf2.memory = V4L2_MEMORY_USERPTR;
+
+		CU_ASSERT_EQUAL(memcmp(&reqbuf, &reqbuf2, sizeof(reqbuf)), 0);
+	}
+
+	if (ret_req == 0) {
+		show_v4l2_requestbuffers(&reqbuf);
+	}
+
+}
+
+void test_VIDIOC_REQBUFS_output_userptr() {
+	do_VIDIOC_REQBUFS_output_userptr(0);
+	do_VIDIOC_REQBUFS_output_userptr(1);
+	do_VIDIOC_REQBUFS_output_userptr((__u32)S16_MIN);
+	do_VIDIOC_REQBUFS_output_userptr((__u32)S16_MAX);
+	do_VIDIOC_REQBUFS_output_userptr(U32_MAX);
+	do_VIDIOC_REQBUFS_output_userptr(0);
+}
+
+static void do_VIDIOC_REQBUFS_invalid_memory(enum v4l2_buf_type type, enum v4l2_memory memory) {
+	int ret_req, errno_req;
+	struct v4l2_requestbuffers reqbuf;
+	struct v4l2_requestbuffers reqbuf2;
+
+	memset(&reqbuf, 0xff, sizeof(reqbuf));
+	reqbuf.count = 0;
+	reqbuf.type = type;
+	reqbuf.memory = memory;
+
+	ret_req = ioctl(get_video_fd(), VIDIOC_REQBUFS, &reqbuf);
+	errno_req = errno;
+
+	dprintf("\t%s:%u: VIDIOC_REQBUF, type=0%x, ret_req=%i, errno_req=%i\n",
+		__FILE__, __LINE__, type, ret_req, errno_req);
+
+	CU_ASSERT_EQUAL(ret_req, -1);
+	CU_ASSERT_EQUAL(errno_req, EINVAL);
+
+	memset(&reqbuf2, 0xff, sizeof(reqbuf2));
+	reqbuf2.count = 0;
+	reqbuf2.type = type;
+	reqbuf2.memory = memory;
+
+	CU_ASSERT_EQUAL(memcmp(&reqbuf, &reqbuf2, sizeof(reqbuf)), 0);
+
+	if (ret_req == 0) {
+		show_v4l2_requestbuffers(&reqbuf);
+	}
+
+}
+
+void test_VIDIOC_REQBUFS_invalid_memory_capture() {
+	do_VIDIOC_REQBUFS_invalid_memory(V4L2_BUF_TYPE_VIDEO_CAPTURE, SINT_MIN);
+	do_VIDIOC_REQBUFS_invalid_memory(V4L2_BUF_TYPE_VIDEO_CAPTURE, 0);
+	do_VIDIOC_REQBUFS_invalid_memory(V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_MEMORY_OVERLAY);
+	do_VIDIOC_REQBUFS_invalid_memory(V4L2_BUF_TYPE_VIDEO_CAPTURE, V4L2_MEMORY_OVERLAY+1);
+	do_VIDIOC_REQBUFS_invalid_memory(V4L2_BUF_TYPE_VIDEO_CAPTURE, SINT_MAX);
+}
+
+void test_VIDIOC_REQBUFS_invalid_memory_output() {
+	do_VIDIOC_REQBUFS_invalid_memory(V4L2_BUF_TYPE_VIDEO_OUTPUT, SINT_MIN);
+	do_VIDIOC_REQBUFS_invalid_memory(V4L2_BUF_TYPE_VIDEO_OUTPUT, 0);
+	do_VIDIOC_REQBUFS_invalid_memory(V4L2_BUF_TYPE_VIDEO_OUTPUT, V4L2_MEMORY_OVERLAY);
+	do_VIDIOC_REQBUFS_invalid_memory(V4L2_BUF_TYPE_VIDEO_OUTPUT, V4L2_MEMORY_OVERLAY+1);
+	do_VIDIOC_REQBUFS_invalid_memory(V4L2_BUF_TYPE_VIDEO_OUTPUT, SINT_MAX);
+}
+
+
+static void do_VIDIOC_REQBUFS_invalid_type(enum v4l2_memory memory, enum v4l2_buf_type type) {
+	int ret_req, errno_req;
+	struct v4l2_requestbuffers reqbuf;
+	struct v4l2_requestbuffers reqbuf2;
+	__u32 count;
+
+	count = 1;
+
+	memset(&reqbuf, 0xff, sizeof(reqbuf));
+	reqbuf.count = count;
+	reqbuf.type = type;
+	reqbuf.memory = memory;
+
+	ret_req = ioctl(get_video_fd(), VIDIOC_REQBUFS, &reqbuf);
+	errno_req = errno;
+
+	dprintf("\t%s:%u: VIDIOC_REQBUF, type=0x%x, memory=%i, ret_req=%i, errno_req=%i\n",
+		__FILE__, __LINE__, type, memory, ret_req, errno_req);
+
+	CU_ASSERT_EQUAL(ret_req, -1);
+	CU_ASSERT_EQUAL(errno_req, EINVAL);
+
+	memset(&reqbuf2, 0xff, sizeof(reqbuf2));
+	reqbuf2.count = count;
+	reqbuf2.type = type;
+	reqbuf2.memory = memory;
+
+	CU_ASSERT_EQUAL(memcmp(&reqbuf, &reqbuf2, sizeof(reqbuf)), 0);
+
+	if (ret_req == 0) {
+		show_v4l2_requestbuffers(&reqbuf);
+	}
+}
+
+void test_VIDIOC_REQUBUFS_invalid_type_mmap() {
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, 0);
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_VIDEO_OVERLAY);
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_VBI_CAPTURE);
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_VBI_OUTPUT);
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_SLICED_VBI_CAPTURE);
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_SLICED_VBI_OUTPUT);
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY);
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_PRIVATE-1);
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_PRIVATE);
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, V4L2_BUF_TYPE_PRIVATE+1);
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, S32_MAX);
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, (__s32)((__u32)S32_MAX+1));
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, U32_MAX-1);
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_MMAP, U32_MAX);
+
+}
+
+void test_VIDIOC_REQUBUFS_invalid_type_userptr() {
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, 0);
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_VIDEO_OVERLAY);
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_VBI_CAPTURE);
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_VBI_OUTPUT);
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_SLICED_VBI_CAPTURE);
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_SLICED_VBI_OUTPUT);
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY);
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_PRIVATE-1);
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_PRIVATE);
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, V4L2_BUF_TYPE_PRIVATE+1);
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, S32_MAX);
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, (__s32)((__u32)S32_MAX+1));
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, U32_MAX-1);
+	do_VIDIOC_REQBUFS_invalid_type(V4L2_MEMORY_USERPTR, U32_MAX);
+
+}
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_REQBUFS.h ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_REQBUFS.h
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_REQBUFS.h	1970-01-01 01:00:00.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_REQBUFS.h	2009-04-29 20:14:36.000000000 +0200
@@ -0,0 +1,20 @@
+/*
+ * v4l-test: Test environment for Video For Linux Two API
+ *
+ * 29 Apr 2009  0.1  First release
+ *
+ * Written by Márton Németh <[email protected]>
+ * Released under GPL
+ */
+
+void test_VIDIOC_REQBUFS_capture_mmap(void);
+void test_VIDIOC_REQBUFS_capture_userptr(void);
+
+void test_VIDIOC_REQBUFS_output_mmap(void);
+void test_VIDIOC_REQBUFS_output_userptr(void);
+
+void test_VIDIOC_REQBUFS_invalid_memory_capture(void);
+void test_VIDIOC_REQBUFS_invalid_memory_output(void);
+
+void test_VIDIOC_REQUBUFS_invalid_type_mmap(void);
+void test_VIDIOC_REQUBUFS_invalid_type_userptr(void);
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_STD.c ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_STD.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_STD.c	2009-04-21 11:23:00.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_STD.c	2009-04-19 16:48:42.000000000 +0200
@@ -41,6 +41,18 @@ void test_VIDIOC_G_STD() {
 	int ret_get, errno_get;
 	v4l2_std_id std_id;
 
+	/* TODO: Iterate trough all inputs and all outputs
+	 * with VIDIOC_ENUMINPUT and VIDIOC_ENUMOUTPUT.
+	 * Also ensure tahat VIDIC_G_STD is called at least
+	 * once even if VIDIOC_ENUMINPUT and VIDIOC_ENUMOUTPUT
+	 * always return EINVAL.
+	 *
+	 * V4L2 API specification rev. 0.24, Chapter 1.7.
+	 * "Video Standards" specifies if the std field
+	 * of v4l2_input and v4l2_output is zero then
+	 * VIDIOC_G_STD shall always return EINVAL.
+	 */
+
 	memset(&std_id, 0xff, sizeof(std_id));
 	ret_get = ioctl(get_video_fd(), VIDIOC_G_STD, &std_id);
 	errno_get = errno;
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_TUNER.c ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_TUNER.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_TUNER.c	2009-04-21 11:23:00.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/test_VIDIOC_TUNER.c	2009-04-20 20:03:16.000000000 +0200
@@ -1,6 +1,7 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ * 20 Apr 2009  0.5  Added string content validation
  * 18 Apr 2009  0.4  More strict check for strings
  * 28 Mar 2009  0.3  Clean up ret and errno variable names and dprintf() output
  *  9 Feb 2009  0.2  Added test cases for VIDIOC_S_TUNER;
@@ -105,6 +106,7 @@ static int do_get_tuner(int f, __u32 ind
 		CU_ASSERT_EQUAL(tuner.index, index);
 
 		CU_ASSERT(0 < strlen( (char*)tuner.name ));
+		CU_ASSERT(valid_string((char*)tuner.name, sizeof(tuner.name)));
 
 		CU_ASSERT(valid_tuner_type(tuner.type));
 		CU_ASSERT(valid_tuner_capability(tuner.capability));
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/v4l2_test.c ltp/testcases/kernel/device-drivers/v4l/user_space/v4l2_test.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/v4l2_test.c	2009-04-21 11:23:00.000000000 +0200
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/v4l2_test.c	2009-04-29 20:15:25.000000000 +0200
@@ -1,6 +1,7 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ * 29 Apr 2009  0.21 Test cases added for VIDIOC_REQBUFS
  * 18 Apr 2009  0.20 NULL parameter test suite split to read only, write only
  *                   and write/read ioctl suite
  * 16 Apr 2009  0.19 Test cases added for VIDIOC_S_FMT
@@ -81,6 +82,8 @@
 #include "test_VIDIOC_PARM.h"
 #include "test_VIDIOC_FMT.h"
 
+#include "test_VIDIOC_REQBUFS.h"
+
 #include "test_VIDIOC_LOG_STATUS.h"
 #include "test_invalid_ioctl.h"
 
@@ -234,6 +237,19 @@ static CU_TestInfo suite_querystd[] = {
   CU_TEST_INFO_NULL,
 };
 
+static CU_TestInfo suite_buffs[] = {
+  { "VIDIOC_REQBUFS with memory map capture streaming i/o", test_VIDIOC_REQBUFS_capture_mmap },
+  { "VIDIOC_REQBUFS with user pointer capture streaming i/o", test_VIDIOC_REQBUFS_capture_userptr },
+  { "VIDIOC_REQBUFS with memory map output streaming i/o", test_VIDIOC_REQBUFS_output_mmap },
+  { "VIDIOC_REQBUFS with user pointer output streaming i/o", test_VIDIOC_REQBUFS_output_userptr },
+  { "VIDIOC_REQBUFS with invalid memory parameter, capture", test_VIDIOC_REQBUFS_invalid_memory_capture },
+  { "VIDIOC_REQBUFS with invalid memory parameter, output", test_VIDIOC_REQBUFS_invalid_memory_output },
+  { "VIDIOC_REQBUFS with invalid type parameter, memory mapped i/o", test_VIDIOC_REQUBUFS_invalid_type_mmap },
+  { "VIDIOC_REQBUFS with invalid type parameter, user pointer i/o", test_VIDIOC_REQUBUFS_invalid_type_userptr },
+
+  CU_TEST_INFO_NULL,
+};
+
 static CU_TestInfo suite_null_readonly[] = {
   { "VIDIOC_QUERYCAP with NULL parameter", test_VIDIOC_QUERYCAP_NULL },
   /* { "VIDIOC_G_FBUF with NULL parameter", }, */
@@ -311,6 +327,8 @@ static CU_TestInfo suite_null_writeread[
   CU_TEST_INFO_NULL,
 };
 
+
+
 static CU_TestInfo suite_invalid_ioctl[] = {
   { "invalid ioctl _IO(0, 0)", test_invalid_ioctl_1 },
   { "invalid ioctl _IO(0xFF, 0xFF)", test_invalid_ioctl_2 },
@@ -331,6 +349,7 @@ static CU_SuiteInfo suites[] = {
   { "VIDIOC_ENUM* ioctl calls", open_video, close_video, suite_enums },
   { "VIDIOC_G_*, VIDIOC_S_* and VIDIOC_TRY_* ioctl calls", open_video, close_video, suite_get_set_try },
   { "VIDIOC_QUERYSTD", open_video, close_video, suite_querystd },
+  { "buffer i/o", open_video, close_video, suite_buffs },
   { "read only IOCTLs with NULL parameter", open_video, close_video, suite_null_readonly },
   { "write only IOCTLs with NULL parameter", open_video, close_video, suite_null_writeonly },
   { "write and read IOCTLs with NULL parameter", open_video, close_video, suite_null_writeread },
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/v4l2_validator.c ltp/testcases/kernel/device-drivers/v4l/user_space/v4l2_validator.c
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/v4l2_validator.c	2009-02-05 12:05:04.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/v4l2_validator.c	2009-04-20 19:39:53.000000000 +0200
@@ -82,3 +82,28 @@ int valid_tuner_capability(__u32 capabil
 int valid_modulator_capability(__u32 capability) {
 	return valid_tuner_capability(capability);
 }
+
+int valid_string(char* str, unsigned int max_length) {
+	int valid = 1;
+	unsigned int i;
+
+	i = 0;
+	while (i < max_length && str[i] != 0) {
+		/* Printable characters start with SPACE (32) and
+		 * ends with '~' (126) inclusively.
+		 */
+		if (str[i] < 32 || 126 < str[i]) {
+			valid = 0;
+			break;
+		}
+		i++;
+	}
+
+	/* check if the string was closed with zero byte properly */
+	if (i == max_length) {
+		valid = 0;
+	}
+
+	return valid;
+}
+
diff -uprN ltp.orig/testcases/kernel/device-drivers/v4l/user_space/v4l2_validator.h ltp/testcases/kernel/device-drivers/v4l/user_space/v4l2_validator.h
--- ltp.orig/testcases/kernel/device-drivers/v4l/user_space/v4l2_validator.h	2009-02-05 12:05:04.000000000 +0100
+++ ltp/testcases/kernel/device-drivers/v4l/user_space/v4l2_validator.h	2009-04-20 19:40:16.000000000 +0200
@@ -1,6 +1,7 @@
 /*
  * v4l-test: Test environment for Video For Linux Two API
  *
+ * 20 Apr 2009  0.2  Printable string validator added
  * 30 Jan 2009  0.1  First release
  *
  * Written by Márton Németh <[email protected]>
@@ -12,3 +13,4 @@
 int valid_v4l2_std_id(v4l2_std_id std_id);
 int valid_tuner_capability(__u32 capability);
 int valid_modulator_capability(__u32 capability);
+int valid_string(char* str, unsigned int max_length);
------------------------------------------------------------------------------
Register Now & Save for Velocity, the Web Performance & Operations 
Conference from O'Reilly Media. Velocity features a full day of 
expert-led, hands-on workshops and two days of sessions from industry 
leaders in dedicated Performance & Operations tracks. Use code vel09scf 
and Save an extra 15% before 5/3. http://p.sf.net/sfu/velocityconf
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to