devices: Size limit when reading RFS data
authorPaul Kocialkowski <contact@paulk.fr>
Sat, 2 Aug 2014 14:19:28 +0000 (16:19 +0200)
committerPaul Kocialkowski <contact@paulk.fr>
Sat, 2 Aug 2014 14:19:28 +0000 (16:19 +0200)
Signed-off-by: Paul Kocialkowski <contact@paulk.fr>
samsung-ipc/devices/aries/aries.c
samsung-ipc/devices/aries/aries.h
samsung-ipc/devices/crespo/crespo.c
samsung-ipc/devices/xmm626/xmm626.h
samsung-ipc/devices/xmm626/xmm626_sec_modem.c
samsung-ipc/devices/xmm626/xmm626_sec_modem.h

index 99b60c7..c285ba6 100644 (file)
@@ -435,6 +435,10 @@ int aries_rfs_recv(struct ipc_client *client, struct ipc_message *message)
     }
 
     header = (struct ipc_rfs_header *) buffer;
+    if (header->length > ARIES_DATA_SIZE_LIMIT) {
+        ipc_client_log(client, "Invalid RFS header length: %u", header->length);
+        goto error;
+    }
 
     ipc_rfs_message_setup(header, message);
 
index efa7870..263f0ae 100644 (file)
@@ -32,6 +32,7 @@
 #define ARIES_ONEDRAM_DEINIT                                    0xABCDABCD
 #define ARIES_SOCKET_RFS_MAGIC                                  0x80000
 #define ARIES_BUFFER_LENGTH                                     4032
+#define ARIES_DATA_SIZE_LIMIT                                   0x80000
 
 #define SO_IPC_RFS                                              0x21
 #define ARIES_MODEM_FMT_SPN                                     0x01
index 97c1541..31bf273 100644 (file)
@@ -180,7 +180,7 @@ int crespo_fmt_recv(struct ipc_client *client, struct ipc_message *message)
     mio.data = calloc(1, mio.size);
 
     rc = client->handlers->read(client->handlers->transport_data, &mio, sizeof(struct modem_io) + mio.size);
-    if (rc < 0 || mio.data == NULL || mio.size < sizeof(struct ipc_fmt_header)) {
+    if (rc < 0 || mio.data == NULL || mio.size < sizeof(struct ipc_fmt_header) || mio.size > CRESPO_BUFFER_LENGTH) {
         ipc_client_log(client, "Reading FMT data failed");
         goto error;
     }
@@ -264,7 +264,7 @@ int crespo_rfs_recv(struct ipc_client *client, struct ipc_message *message)
     mio.data = calloc(1, mio.size);
 
     rc = client->handlers->read(client->handlers->transport_data, &mio, sizeof(struct modem_io) + mio.size);
-    if (rc < 0 || mio.data == NULL || mio.size <= 0) {
+    if (rc < 0 || mio.data == NULL || mio.size <= 0 || mio.size > CRESPO_BUFFER_LENGTH) {
         ipc_client_log(client, "Reading RFS data failed");
         goto error;
     }
index e93aca3..2648cc1 100644 (file)
@@ -26,6 +26,7 @@
 #define XMM626_SEC_END_MAGIC                                   0x0000
 #define XMM626_HW_RESET_MAGIC                                  0x111001
 #define XMM626_DATA_SIZE                                       0x1000
+#define XMM626_DATA_SIZE_LIMIT                                 0x80000
 
 #define XMM626_COMMAND_SET_PORT_CONFIG                         0x86
 #define XMM626_COMMAND_SEC_START                               0x204
index eedce07..ffe46a5 100644 (file)
@@ -360,6 +360,10 @@ int xmm626_sec_modem_rfs_recv(struct ipc_client *client,
     }
 
     header = (struct ipc_rfs_header *) buffer;
+    if (header->length > XMM626_DATA_SIZE_LIMIT) {
+        ipc_client_log(client, "Invalid RFS header length: %u", header->length);
+        goto error;
+    }
 
     ipc_rfs_message_setup(header, message);
 
index 6d4ce12..ed2af82 100644 (file)
@@ -20,6 +20,8 @@
 #ifndef __XMM626_SEC_MODEM_H__
 #define __XMM626_SEC_MODEM_H__
 
+#define XMM626_SEC_MODEM_BUFFER_SIZE_MAX                        0x80000
+
 #define XMM626_SEC_MODEM_BOOT0_DEVICE          "/dev/umts_boot0"
 #define XMM626_SEC_MODEM_BOOT1_DEVICE          "/dev/umts_boot1"
 #define XMM626_SEC_MODEM_IPC0_DEVICE           "/dev/umts_ipc0"