diff -r 74853e018898 -r ed15eef57d5c master/slave.c --- a/master/slave.c Mon Nov 17 15:04:28 2008 +0000 +++ b/master/slave.c Mon Nov 17 17:18:02 2008 +0000 @@ -243,45 +243,47 @@ size_t data_size /**< number of bytes */ ) { - int i; + int i, err; size_t size; off_t offset; slave->sii.string_count = data[0]; - if (!slave->sii.string_count) - return 0; - - if (!(slave->sii.strings = - kmalloc(sizeof(char *) * slave->sii.string_count, - GFP_KERNEL))) { - EC_ERR("Failed to allocate string array memory.\n"); - goto out_zero; - } - - offset = 1; - for (i = 0; i < slave->sii.string_count; i++) { - size = data[offset]; - // allocate memory for string structure and data at a single blow - if (!(slave->sii.strings[i] = - kmalloc(sizeof(char) * size + 1, GFP_KERNEL))) { - EC_ERR("Failed to allocate string memory.\n"); - goto out_free; - } - memcpy(slave->sii.strings[i], data + offset + 1, size); - slave->sii.strings[i][size] = 0x00; // append binary zero - offset += 1 + size; + if (slave->sii.string_count) { + if (!(slave->sii.strings = + kmalloc(sizeof(char *) * slave->sii.string_count, + GFP_KERNEL))) { + EC_ERR("Failed to allocate string array memory.\n"); + err = -ENOMEM; + goto out_zero; + } + + offset = 1; + for (i = 0; i < slave->sii.string_count; i++) { + size = data[offset]; + // allocate memory for string structure and data at a single blow + if (!(slave->sii.strings[i] = + kmalloc(sizeof(char) * size + 1, GFP_KERNEL))) { + EC_ERR("Failed to allocate string memory.\n"); + err = -ENOMEM; + goto out_free; + } + memcpy(slave->sii.strings[i], data + offset + 1, size); + slave->sii.strings[i][size] = 0x00; // append binary zero + offset += 1 + size; + } } return 0; out_free: - for (i--; i >= 0; i--) kfree(slave->sii.strings[i]); + for (i--; i >= 0; i--) + kfree(slave->sii.strings[i]); kfree(slave->sii.strings); slave->sii.strings = NULL; out_zero: slave->sii.string_count = 0; - return -1; + return err; } /*****************************************************************************/ @@ -303,7 +305,7 @@ if (data_size != 32) { EC_ERR("Wrong size of general category (%u/32) in slave %u.\n", data_size, slave->ring_position); - return -1; + return -EINVAL; } slave->sii.group = ec_slave_sii_string(slave, data[0]); @@ -358,7 +360,7 @@ if (data_size % 8) { EC_ERR("Invalid SII sync manager category size %u in slave %u.\n", data_size, slave->ring_position); - return -1; + return -EINVAL; } count = data_size / 8; @@ -367,13 +369,13 @@ total_count = count + slave->sii.sync_count; if (total_count > EC_MAX_SYNC_MANAGERS) { EC_ERR("Exceeded maximum number of sync managers!\n"); - return -1; + return -EOVERFLOW; } memsize = sizeof(ec_sync_t) * total_count; if (!(syncs = kmalloc(memsize, GFP_KERNEL))) { EC_ERR("Failed to allocate %u bytes for sync managers.\n", memsize); - return -1; + return -ENOMEM; } for (i = 0; i < slave->sii.sync_count; i++) @@ -414,6 +416,7 @@ ec_direction_t dir /**< Pdo direction. */ ) { + int ret; ec_pdo_t *pdo; ec_pdo_entry_t *entry; unsigned int entry_count, i; @@ -421,18 +424,19 @@ while (data_size >= 8) { if (!(pdo = kmalloc(sizeof(ec_pdo_t), GFP_KERNEL))) { EC_ERR("Failed to allocate Pdo memory.\n"); - return -1; + return -ENOMEM; } ec_pdo_init(pdo); pdo->index = EC_READ_U16(data); entry_count = EC_READ_U8(data + 2); pdo->sync_index = EC_READ_U8(data + 3); - if (ec_pdo_set_name(pdo, - ec_slave_sii_string(slave, EC_READ_U8(data + 5)))) { + ret = ec_pdo_set_name(pdo, + ec_slave_sii_string(slave, EC_READ_U8(data + 5))); + if (ret) { ec_pdo_clear(pdo); kfree(pdo); - return -1; + return ret; } list_add_tail(&pdo->list, &slave->sii.pdos); @@ -442,17 +446,18 @@ for (i = 0; i < entry_count; i++) { if (!(entry = kmalloc(sizeof(ec_pdo_entry_t), GFP_KERNEL))) { EC_ERR("Failed to allocate Pdo entry memory.\n"); - return -1; + return -ENOMEM; } ec_pdo_entry_init(entry); entry->index = EC_READ_U16(data); entry->subindex = EC_READ_U8(data + 2); - if (ec_pdo_entry_set_name(entry, - ec_slave_sii_string(slave, EC_READ_U8(data + 3)))) { + ret = ec_pdo_entry_set_name(entry, + ec_slave_sii_string(slave, EC_READ_U8(data + 3))); + if (ret) { ec_pdo_entry_clear(entry); kfree(entry); - return -1; + return ret; } entry->bit_length = EC_READ_U8(data + 5); list_add_tail(&entry->list, &pdo->entries); @@ -468,11 +473,12 @@ if (!(sync = ec_slave_get_sync(slave, pdo->sync_index))) { EC_ERR("Invalid SM index %i for Pdo 0x%04X in slave %u.", pdo->sync_index, pdo->index, slave->ring_position); - return -1; + return -ENOENT; } - if (ec_pdo_list_add_pdo_copy(&sync->pdos, pdo)) - return -1; + ret = ec_pdo_list_add_pdo_copy(&sync->pdos, pdo); + if (ret) + return ret; } }