More general approach: Check for maximum datagram size in pre-alloc.

This commit is contained in:
Florian Pose
2026-07-16 13:52:53 +02:00
parent 2faafd771c
commit eeec8a4f81
4 changed files with 14 additions and 19 deletions
+10 -2
View File
@@ -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);
+2 -10
View File
@@ -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;
}
/****************************************************************************/
+1 -1
View File
@@ -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 *,
+1 -6
View File
@@ -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;
}