[PATCH 6/7] ntdll: IOCTL_DVD_READ_STRUCTURE rejects odd sized output buffers

Dan Kegel dank at kegel.com
Fri Feb 10 14:30:32 CST 2012


Change since yesterday: 
- Split this little change out into its own patch.

---
 dlls/kernel32/tests/cdrom.c |   43 +++++++++++++++++++++++++++++++++++++++++++
 dlls/ntdll/cdrom.c          |    1 +
 2 files changed, 44 insertions(+), 0 deletions(-)

diff --git a/dlls/kernel32/tests/cdrom.c b/dlls/kernel32/tests/cdrom.c
index ed9abbe..3b997f5 100644
--- a/dlls/kernel32/tests/cdrom.c
+++ b/dlls/kernel32/tests/cdrom.c
@@ -80,6 +80,48 @@ static void test_readStruct_input(HANDLE hdevice)
     }
 }
 
+/* Try IOCTL_DVD_READ_STRUCTURE.DvdPhysicalDescriptor
+ * with various size output buffers
+ */
+
+static void test_readStruct_layer(HANDLE hdevice)
+{
+    static struct {
+        int olen;
+        BOOL ret;
+        DWORD err;
+    } cases[] = {
+       {3,                               FALSE, ERROR_INSUFFICIENT_BUFFER },
+       {sizeof(xDVD_LAYER_DESCRIPTOR),   TRUE,  0                         },
+       {sizeof(xDVD_LAYER_DESCRIPTOR)+1, FALSE, ERROR_INVALID_PARAMETER   },
+       {0}
+    };
+    DVD_READ_STRUCTURE ibuf;
+    int i;
+
+    ZeroMemory(&ibuf, sizeof(ibuf));
+    ibuf.Format = DvdPhysicalDescriptor;
+
+    for (i=0; cases[i].olen; i++) {
+        char obuf[HUGEBUF];
+        DWORD bytes_read = 0;
+        BOOL bResult;
+
+        bResult = DeviceIoControl(hdevice, IOCTL_DVD_READ_STRUCTURE,
+                                  &ibuf, sizeof(ibuf),
+                                  obuf, cases[i].olen, &bytes_read, 0);
+        ok(bResult == cases[i].ret,
+           "case %d: DeviceIoControl returned %d, expected %d\n",
+           i, bResult, cases[i].ret);
+        if (cases[i].err) {
+            DWORD err = GetLastError();
+            ok(err == cases[i].err,
+               "case %d: Last error was %d, expected %d\n",
+               i, err, cases[i].err);
+        }
+    }
+}
+
 /* Backdoor way to do the same thing as IOCTL_DVD_READ_STRUCTURE */
 DWORD read_discStructure(HANDLE device, int format, void *obuf, int obuflen)
 {
@@ -190,6 +232,7 @@ START_TEST(cdrom)
     } else {
         /* DVD tests */
         test_readStruct_input(hdevice);
+        test_readStruct_layer(hdevice);
         test_readStruct_layer_vs_passthrough(hdevice);
     }
     CloseHandle(hdevice);
diff --git a/dlls/ntdll/cdrom.c b/dlls/ntdll/cdrom.c
index b151983..61c7db9 100644
--- a/dlls/ntdll/cdrom.c
+++ b/dlls/ntdll/cdrom.c
@@ -3101,6 +3101,7 @@ NTSTATUS CDROM_DeviceIoControl(HANDLE hDevice,
         sz = sizeof(DVD_LAYER_DESCRIPTOR);
         if (lpInBuffer == NULL || nInBufferSize < sizeof(DVD_READ_STRUCTURE)) status = STATUS_INVALID_PARAMETER;
         else if (nOutBufferSize < sz) status = STATUS_BUFFER_TOO_SMALL;
+        else if (nOutBufferSize & 1) status = STATUS_INVALID_PARAMETER;
         else
         {
             TRACE("doing DVD_READ_STRUCTURE\n");
-- 
1.7.9




More information about the wine-patches mailing list