SDL: SDL_hidapi.c: avoid possible NULL pointer dereferences.

From dd8c354843f26f258006bbb4c75df07292e8ff42 Mon Sep 17 00:00:00 2001
From: Ozkan Sezer <[EMAIL REDACTED]>
Date: Mon, 8 Nov 2021 17:00:56 +0300
Subject: [PATCH] SDL_hidapi.c: avoid possible NULL pointer dereferences.

---
 src/hidapi/SDL_hidapi.c | 77 ++++++++++++++++++++++++++++++++++-------
 1 file changed, 65 insertions(+), 12 deletions(-)

diff --git a/src/hidapi/SDL_hidapi.c b/src/hidapi/SDL_hidapi.c
index aeeb317aa1..80a0ee931b 100644
--- a/src/hidapi/SDL_hidapi.c
+++ b/src/hidapi/SDL_hidapi.c
@@ -846,7 +846,12 @@ SDL_hid_device *SDL_hid_open_path(const char *path, int bExclusive /* = false */
 int SDL_hid_write(SDL_hid_device *device, const unsigned char *data, size_t length)
 {
     HIDDeviceWrapper *wrapper = UnwrapHIDDevice(device);
-    int result = wrapper->backend->hid_write(wrapper->device, data, length);
+    int result;
+
+    if (!wrapper) {
+        return -1;
+    }
+    result = wrapper->backend->hid_write(wrapper->device, data, length);
     if (result < 0) {
         SDL_SetHIDAPIError(wrapper->backend->hid_error(wrapper->device));
     }
@@ -856,7 +861,12 @@ int SDL_hid_write(SDL_hid_device *device, const unsigned char *data, size_t leng
 int SDL_hid_read_timeout(SDL_hid_device *device, unsigned char *data, size_t length, int milliseconds)
 {
     HIDDeviceWrapper *wrapper = UnwrapHIDDevice(device);
-    int result = wrapper->backend->hid_read_timeout(wrapper->device, data, length, milliseconds);
+    int result;
+
+    if (!wrapper) {
+        return -1;
+    }
+    result = wrapper->backend->hid_read_timeout(wrapper->device, data, length, milliseconds);
     if (result < 0) {
         SDL_SetHIDAPIError(wrapper->backend->hid_error(wrapper->device));
     }
@@ -866,7 +876,12 @@ int SDL_hid_read_timeout(SDL_hid_device *device, unsigned char *data, size_t len
 int SDL_hid_read(SDL_hid_device *device, unsigned char *data, size_t length)
 {
     HIDDeviceWrapper *wrapper = UnwrapHIDDevice(device);
-    int result = wrapper->backend->hid_read(wrapper->device, data, length);
+    int result;
+
+    if (!wrapper) {
+        return -1;
+    }
+    result = wrapper->backend->hid_read(wrapper->device, data, length);
     if (result < 0) {
         SDL_SetHIDAPIError(wrapper->backend->hid_error(wrapper->device));
     }
@@ -876,7 +891,12 @@ int SDL_hid_read(SDL_hid_device *device, unsigned char *data, size_t length)
 int SDL_hid_set_nonblocking(SDL_hid_device *device, int nonblock)
 {
     HIDDeviceWrapper *wrapper = UnwrapHIDDevice(device);
-    int result = wrapper->backend->hid_set_nonblocking(wrapper->device, nonblock);
+    int result;
+
+    if (!wrapper) {
+        return -1;
+    }
+    result = wrapper->backend->hid_set_nonblocking(wrapper->device, nonblock);
     if (result < 0) {
         SDL_SetHIDAPIError(wrapper->backend->hid_error(wrapper->device));
     }
@@ -886,7 +906,12 @@ int SDL_hid_set_nonblocking(SDL_hid_device *device, int nonblock)
 int SDL_hid_send_feature_report(SDL_hid_device *device, const unsigned char *data, size_t length)
 {
     HIDDeviceWrapper *wrapper = UnwrapHIDDevice(device);
-    int result = wrapper->backend->hid_send_feature_report(wrapper->device, data, length);
+    int result;
+
+    if (!wrapper) {
+        return -1;
+    }
+    result = wrapper->backend->hid_send_feature_report(wrapper->device, data, length);
     if (result < 0) {
         SDL_SetHIDAPIError(wrapper->backend->hid_error(wrapper->device));
     }
@@ -896,7 +921,12 @@ int SDL_hid_send_feature_report(SDL_hid_device *device, const unsigned char *dat
 int SDL_hid_get_feature_report(SDL_hid_device *device, unsigned char *data, size_t length)
 {
     HIDDeviceWrapper *wrapper = UnwrapHIDDevice(device);
-    int result = wrapper->backend->hid_get_feature_report(wrapper->device, data, length);
+    int result;
+
+    if (!wrapper) {
+        return -1;
+    }
+    result = wrapper->backend->hid_get_feature_report(wrapper->device, data, length);
     if (result < 0) {
         SDL_SetHIDAPIError(wrapper->backend->hid_error(wrapper->device));
     }
@@ -906,14 +936,22 @@ int SDL_hid_get_feature_report(SDL_hid_device *device, unsigned char *data, size
 void SDL_hid_close(SDL_hid_device *device)
 {
     HIDDeviceWrapper *wrapper = UnwrapHIDDevice(device);
-    wrapper->backend->hid_close(wrapper->device);
-    DeleteHIDDeviceWrapper(wrapper);
+
+    if (wrapper) {
+        wrapper->backend->hid_close(wrapper->device);
+        DeleteHIDDeviceWrapper(wrapper);
+    }
 }
 
 int SDL_hid_get_manufacturer_string(SDL_hid_device *device, wchar_t *string, size_t maxlen)
 {
     HIDDeviceWrapper *wrapper = UnwrapHIDDevice(device);
-    int result = wrapper->backend->hid_get_manufacturer_string(wrapper->device, string, maxlen);
+    int result;
+
+    if (!wrapper) {
+        return -1;
+    }
+    result = wrapper->backend->hid_get_manufacturer_string(wrapper->device, string, maxlen);
     if (result < 0) {
         SDL_SetHIDAPIError(wrapper->backend->hid_error(wrapper->device));
     }
@@ -923,7 +961,12 @@ int SDL_hid_get_manufacturer_string(SDL_hid_device *device, wchar_t *string, siz
 int SDL_hid_get_product_string(SDL_hid_device *device, wchar_t *string, size_t maxlen)
 {
     HIDDeviceWrapper *wrapper = UnwrapHIDDevice(device);
-    int result = wrapper->backend->hid_get_product_string(wrapper->device, string, maxlen);
+    int result;
+
+    if (!wrapper) {
+        return -1;
+    }
+    result = wrapper->backend->hid_get_product_string(wrapper->device, string, maxlen);
     if (result < 0) {
         SDL_SetHIDAPIError(wrapper->backend->hid_error(wrapper->device));
     }
@@ -933,7 +976,12 @@ int SDL_hid_get_product_string(SDL_hid_device *device, wchar_t *string, size_t m
 int SDL_hid_get_serial_number_string(SDL_hid_device *device, wchar_t *string, size_t maxlen)
 {
     HIDDeviceWrapper *wrapper = UnwrapHIDDevice(device);
-    int result = wrapper->backend->hid_get_serial_number_string(wrapper->device, string, maxlen);
+    int result;
+
+    if (!wrapper) {
+        return -1;
+    }
+    result = wrapper->backend->hid_get_serial_number_string(wrapper->device, string, maxlen);
     if (result < 0) {
         SDL_SetHIDAPIError(wrapper->backend->hid_error(wrapper->device));
     }
@@ -943,7 +991,12 @@ int SDL_hid_get_serial_number_string(SDL_hid_device *device, wchar_t *string, si
 int SDL_hid_get_indexed_string(SDL_hid_device *device, int string_index, wchar_t *string, size_t maxlen)
 {
     HIDDeviceWrapper *wrapper = UnwrapHIDDevice(device);
-    int result = wrapper->backend->hid_get_indexed_string(wrapper->device, string_index, string, maxlen);
+    int result;
+
+    if (!wrapper) {
+        return -1;
+    }
+    result = wrapper->backend->hid_get_indexed_string(wrapper->device, string_index, string, maxlen);
     if (result < 0) {
         SDL_SetHIDAPIError(wrapper->backend->hid_error(wrapper->device));
     }