From eeec8a4f815ddd774108760a11bea8d76fa1d9fa Mon Sep 17 00:00:00 2001 From: Florian Pose Date: Thu, 16 Jul 2026 13:52:53 +0200 Subject: [PATCH] More general approach: Check for maximum datagram size in pre-alloc. --- master/datagram.c | 12 ++++++++++-- master/fmmu_config.c | 12 ++---------- master/fmmu_config.h | 2 +- master/slave_config.c | 7 +------ 4 files changed, 14 insertions(+), 19 deletions(-) diff --git a/master/datagram.c b/master/datagram.c index c0f3360a..f35323a8 100644 --- a/master/datagram.c +++ b/master/datagram.c @@ -1,6 +1,6 @@ /***************************************************************************** * - * Copyright (C) 2006-2008 Florian Pose, Ingenieurgemeinschaft IgH + * Copyright (C) 2006-2026 Florian Pose, Ingenieurgemeinschaft IgH * * This file is part of the IgH EtherCAT Master. * @@ -145,8 +145,16 @@ int ec_datagram_prealloc( ) { if (datagram->data_origin == EC_ORIG_EXTERNAL - || size <= datagram->mem_size) + || size <= datagram->mem_size) { return 0; + } + + if (size > EC_MAX_DATA_SIZE) { + EC_ERR("%s(datagram = %p, size = %zu): Exceeding the" + " maximum datagram size of %u bytes.\n", + __func__, datagram, size, EC_MAX_DATA_SIZE); + return -EOVERFLOW; + } if (datagram->data) { kfree(datagram->data); diff --git a/master/fmmu_config.c b/master/fmmu_config.c index 7d3f452a..52985952 100644 --- a/master/fmmu_config.c +++ b/master/fmmu_config.c @@ -1,6 +1,6 @@ /***************************************************************************** * - * Copyright (C) 2006-2008 Florian Pose, Ingenieurgemeinschaft IgH + * Copyright (C) 2006-2026 Florian Pose, Ingenieurgemeinschaft IgH * * This file is part of the IgH EtherCAT Master. * @@ -39,7 +39,7 @@ * process data size for the mapped PDOs of the given direction to the domain * data size. */ -int ec_fmmu_config_init( +void ec_fmmu_config_init( ec_fmmu_config_t *fmmu, /**< EtherCAT FMMU configuration. */ ec_slave_config_t *sc, /**< EtherCAT slave configuration. */ ec_domain_t *domain, /**< EtherCAT domain. */ @@ -56,15 +56,7 @@ int ec_fmmu_config_init( fmmu->data_size = ec_pdo_list_total_size( &sc->sync_configs[sync_index].pdos); - if (fmmu->data_size > EC_MAX_DATA_SIZE) { - EC_CONFIG_ERR(fmmu->sc, "FMMU with data size %3u bytes would exceed" - " maximum datagram size (%u bytes).\n", - fmmu->data_size, EC_MAX_DATA_SIZE); - return -ENOMEM; - } - ec_domain_add_fmmu_config(domain, fmmu); - return 0; } /****************************************************************************/ diff --git a/master/fmmu_config.h b/master/fmmu_config.h index bd74e98a..a2323038 100644 --- a/master/fmmu_config.h +++ b/master/fmmu_config.h @@ -47,7 +47,7 @@ typedef struct { /****************************************************************************/ -int ec_fmmu_config_init(ec_fmmu_config_t *, ec_slave_config_t *, +void ec_fmmu_config_init(ec_fmmu_config_t *, ec_slave_config_t *, ec_domain_t *, uint8_t, ec_direction_t); void ec_fmmu_config_page(const ec_fmmu_config_t *, const ec_sync_t *, diff --git a/master/slave_config.c b/master/slave_config.c index 9f6a0dcf..311e6147 100644 --- a/master/slave_config.c +++ b/master/slave_config.c @@ -222,7 +222,6 @@ int ec_slave_config_prepare_fmmu( { unsigned int i; ec_fmmu_config_t *fmmu; - int ret = 0; // FMMU configuration already prepared? for (i = 0; i < sc->used_fmmus; i++) { @@ -239,13 +238,9 @@ int ec_slave_config_prepare_fmmu( fmmu = &sc->fmmu_configs[sc->used_fmmus++]; down(&sc->master->master_sem); - ret = ec_fmmu_config_init(fmmu, sc, domain, sync_index, dir); + ec_fmmu_config_init(fmmu, sc, domain, sync_index, dir); up(&sc->master->master_sem); - if (ret < 0) { - return ret; - } - return fmmu->logical_start_address; }