From 7fffe6961ae287b26b245d654914481e420f0027 Mon Sep 17 00:00:00 2001
From: Florian Pose <fp@igh-essen.com>
Date: Thu, 19 Jun 2008 08:06:49 +0000
Subject: [PATCH] Check for data sizes when reading Pdo assignment/mapping from
 CoE.

---
 TODO                 |  3 ++-
 master/fsm_coe_map.c | 33 ++++++++++++++++++++++++++++++++-
 2 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/TODO b/TODO
index 08583db2..15957c9f 100644
--- a/TODO
+++ b/TODO
@@ -14,9 +14,10 @@ Version 1.4.0:
 * Adapt remaining examples.
 * READMEs for examples.
 * Update documentation.
-* Check for sizes of uploaded Sdos when reading mapping from CoE.
 * Attach Pdo names from SII or Coe dictioary to Pdos read via CoE.
 * Add a -n (numeric) switch to ethercat command.
+* Remove Eoe cylces and Idle cycles.
+* Store Sdo abort code in sdo_request_t and output it in user space.
 
 Future issues:
 
diff --git a/master/fsm_coe_map.c b/master/fsm_coe_map.c
index 3a46020a..8d24e7bd 100644
--- a/master/fsm_coe_map.c
+++ b/master/fsm_coe_map.c
@@ -216,6 +216,14 @@ void ec_fsm_coe_map_state_pdo_count(
         return;
     }
 
+    if (fsm->request.data_size != sizeof(uint8_t)) {
+        EC_ERR("Invalid data size %u returned when uploading Sdo 0x%04X:%02X "
+                "from slave %u.\n", fsm->request.data_size,
+                fsm->request.index, fsm->request.subindex,
+                fsm->slave->ring_position);
+        fsm->state = ec_fsm_coe_map_state_error;
+        return;
+    }
     fsm->sync_subindices = EC_READ_U8(fsm->request.data);
 
     if (fsm->slave->master->debug_level)
@@ -280,6 +288,15 @@ void ec_fsm_coe_map_state_pdo(
         return;
     }
 
+    if (fsm->request.data_size != sizeof(uint16_t)) {
+        EC_ERR("Invalid data size %u returned when uploading Sdo 0x%04X:%02X "
+                "from slave %u.\n", fsm->request.data_size,
+                fsm->request.index, fsm->request.subindex,
+                fsm->slave->ring_position);
+        fsm->state = ec_fsm_coe_map_state_error;
+        return;
+    }
+
     if (!(fsm->pdo = (ec_pdo_t *)
                 kmalloc(sizeof(ec_pdo_t), GFP_KERNEL))) {
         EC_ERR("Failed to allocate Pdo.\n");
@@ -323,6 +340,14 @@ void ec_fsm_coe_map_state_pdo_entry_count(
         return;
     }
 
+    if (fsm->request.data_size != sizeof(uint8_t)) {
+        EC_ERR("Invalid data size %u returned when uploading Sdo 0x%04X:%02X "
+                "from slave %u.\n", fsm->request.data_size,
+                fsm->request.index, fsm->request.subindex,
+                fsm->slave->ring_position);
+        fsm->state = ec_fsm_coe_map_state_error;
+        return;
+    }
     fsm->pdo_subindices = EC_READ_U8(fsm->request.data);
 
     if (fsm->slave->master->debug_level)
@@ -377,7 +402,13 @@ void ec_fsm_coe_map_state_pdo_entry(
         return;
     }
 
-    {
+    if (fsm->request.data_size != sizeof(uint32_t)) {
+        EC_ERR("Invalid data size %u returned when uploading Sdo 0x%04X:%02X "
+                "from slave %u.\n", fsm->request.data_size,
+                fsm->request.index, fsm->request.subindex,
+                fsm->slave->ring_position);
+        fsm->state = ec_fsm_coe_map_state_error;
+    } else {
         uint32_t pdo_entry_info;
         ec_pdo_entry_t *pdo_entry;
 
-- 
GitLab