mirror of
https://github.com/ipmitool/ipmitool.git
synced 2025-05-10 18:47:22 +00:00
ID: 3602439 - 'lib/ipmi_sdr.c' - memory leaks
Commit fixes memory leaks in 'lib/ipmi_sdr.c'. This is based on ticket #3600930. Reported by: Ales Ledvinka
This commit is contained in:
parent
6e87e423eb
commit
bd4f34b035
@ -2685,6 +2685,9 @@ ipmi_sdr_print_sdr(struct ipmi_intf *intf, uint8_t type)
|
|||||||
sdrr = malloc(sizeof (struct sdr_record_list));
|
sdrr = malloc(sizeof (struct sdr_record_list));
|
||||||
if (sdrr == NULL) {
|
if (sdrr == NULL) {
|
||||||
lprintf(LOG_ERR, "ipmitool: malloc failure");
|
lprintf(LOG_ERR, "ipmitool: malloc failure");
|
||||||
|
if (rec != NULL) {
|
||||||
|
free(rec);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
memset(sdrr, 0, sizeof (struct sdr_record_list));
|
memset(sdrr, 0, sizeof (struct sdr_record_list));
|
||||||
@ -2719,6 +2722,9 @@ ipmi_sdr_print_sdr(struct ipmi_intf *intf, uint8_t type)
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
free(rec);
|
free(rec);
|
||||||
|
if (sdrr != NULL) {
|
||||||
|
free(sdrr);
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3198,8 +3204,12 @@ ipmi_sdr_find_sdr_bynumtype(struct ipmi_intf *intf, uint16_t gen_id, uint8_t num
|
|||||||
sdrr->type = header->type;
|
sdrr->type = header->type;
|
||||||
|
|
||||||
rec = ipmi_sdr_get_record(intf, header, sdr_list_itr);
|
rec = ipmi_sdr_get_record(intf, header, sdr_list_itr);
|
||||||
if (rec == NULL)
|
if (rec == NULL) {
|
||||||
|
if (sdrr != NULL) {
|
||||||
|
free(sdrr);
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
switch (header->type) {
|
switch (header->type) {
|
||||||
case SDR_RECORD_TYPE_FULL_SENSOR:
|
case SDR_RECORD_TYPE_FULL_SENSOR:
|
||||||
@ -3237,6 +3247,9 @@ ipmi_sdr_find_sdr_bynumtype(struct ipmi_intf *intf, uint16_t gen_id, uint8_t num
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
free(rec);
|
free(rec);
|
||||||
|
if (sdrr != NULL) {
|
||||||
|
free(sdrr);
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3270,13 +3283,6 @@ ipmi_sdr_find_sdr_bysensortype(struct ipmi_intf *intf, uint8_t type)
|
|||||||
struct sdr_get_rs *header;
|
struct sdr_get_rs *header;
|
||||||
struct sdr_record_list *e;
|
struct sdr_record_list *e;
|
||||||
|
|
||||||
head = malloc(sizeof (struct sdr_record_list));
|
|
||||||
if (head == NULL) {
|
|
||||||
lprintf(LOG_ERR, "ipmitool: malloc failure");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
memset(head, 0, sizeof (struct sdr_record_list));
|
|
||||||
|
|
||||||
if (sdr_list_itr == NULL) {
|
if (sdr_list_itr == NULL) {
|
||||||
sdr_list_itr = ipmi_sdr_start(intf, 0);
|
sdr_list_itr = ipmi_sdr_start(intf, 0);
|
||||||
if (sdr_list_itr == NULL) {
|
if (sdr_list_itr == NULL) {
|
||||||
@ -3286,6 +3292,13 @@ ipmi_sdr_find_sdr_bysensortype(struct ipmi_intf *intf, uint8_t type)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* check what we've already read */
|
/* check what we've already read */
|
||||||
|
head = malloc(sizeof (struct sdr_record_list));
|
||||||
|
if (head == NULL) {
|
||||||
|
lprintf(LOG_ERR, "ipmitool: malloc failure");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
memset(head, 0, sizeof (struct sdr_record_list));
|
||||||
|
|
||||||
for (e = sdr_list_head; e != NULL; e = e->next) {
|
for (e = sdr_list_head; e != NULL; e = e->next) {
|
||||||
switch (e->type) {
|
switch (e->type) {
|
||||||
case SDR_RECORD_TYPE_FULL_SENSOR:
|
case SDR_RECORD_TYPE_FULL_SENSOR:
|
||||||
@ -3315,8 +3328,12 @@ ipmi_sdr_find_sdr_bysensortype(struct ipmi_intf *intf, uint8_t type)
|
|||||||
sdrr->type = header->type;
|
sdrr->type = header->type;
|
||||||
|
|
||||||
rec = ipmi_sdr_get_record(intf, header, sdr_list_itr);
|
rec = ipmi_sdr_get_record(intf, header, sdr_list_itr);
|
||||||
if (rec == NULL)
|
if (rec == NULL) {
|
||||||
|
if (sdrr != NULL) {
|
||||||
|
free(sdrr);
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
switch (header->type) {
|
switch (header->type) {
|
||||||
case SDR_RECORD_TYPE_FULL_SENSOR:
|
case SDR_RECORD_TYPE_FULL_SENSOR:
|
||||||
@ -3350,6 +3367,9 @@ ipmi_sdr_find_sdr_bysensortype(struct ipmi_intf *intf, uint8_t type)
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
free(rec);
|
free(rec);
|
||||||
|
if (sdrr != NULL) {
|
||||||
|
free(sdrr);
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3380,13 +3400,6 @@ ipmi_sdr_find_sdr_byentity(struct ipmi_intf *intf, struct entity_id *entity)
|
|||||||
struct sdr_record_list *e;
|
struct sdr_record_list *e;
|
||||||
struct sdr_record_list *head;
|
struct sdr_record_list *head;
|
||||||
|
|
||||||
head = malloc(sizeof (struct sdr_record_list));
|
|
||||||
if (head == NULL) {
|
|
||||||
lprintf(LOG_ERR, "ipmitool: malloc failure");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
memset(head, 0, sizeof (struct sdr_record_list));
|
|
||||||
|
|
||||||
if (sdr_list_itr == NULL) {
|
if (sdr_list_itr == NULL) {
|
||||||
sdr_list_itr = ipmi_sdr_start(intf, 0);
|
sdr_list_itr = ipmi_sdr_start(intf, 0);
|
||||||
if (sdr_list_itr == NULL) {
|
if (sdr_list_itr == NULL) {
|
||||||
@ -3395,6 +3408,13 @@ ipmi_sdr_find_sdr_byentity(struct ipmi_intf *intf, struct entity_id *entity)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
head = malloc(sizeof (struct sdr_record_list));
|
||||||
|
if (head == NULL) {
|
||||||
|
lprintf(LOG_ERR, "ipmitool: malloc failure");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
memset(head, 0, sizeof (struct sdr_record_list));
|
||||||
|
|
||||||
/* check what we've already read */
|
/* check what we've already read */
|
||||||
for (e = sdr_list_head; e != NULL; e = e->next) {
|
for (e = sdr_list_head; e != NULL; e = e->next) {
|
||||||
switch (e->type) {
|
switch (e->type) {
|
||||||
@ -3459,8 +3479,12 @@ ipmi_sdr_find_sdr_byentity(struct ipmi_intf *intf, struct entity_id *entity)
|
|||||||
sdrr->type = header->type;
|
sdrr->type = header->type;
|
||||||
|
|
||||||
rec = ipmi_sdr_get_record(intf, header, sdr_list_itr);
|
rec = ipmi_sdr_get_record(intf, header, sdr_list_itr);
|
||||||
if (rec == NULL)
|
if (rec == NULL) {
|
||||||
|
if (sdrr != NULL) {
|
||||||
|
free(sdrr);
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
switch (header->type) {
|
switch (header->type) {
|
||||||
case SDR_RECORD_TYPE_FULL_SENSOR:
|
case SDR_RECORD_TYPE_FULL_SENSOR:
|
||||||
@ -3520,6 +3544,9 @@ ipmi_sdr_find_sdr_byentity(struct ipmi_intf *intf, struct entity_id *entity)
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
free(rec);
|
free(rec);
|
||||||
|
if (sdrr != NULL) {
|
||||||
|
free(sdrr);
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3550,13 +3577,6 @@ ipmi_sdr_find_sdr_bytype(struct ipmi_intf *intf, uint8_t type)
|
|||||||
struct sdr_record_list *e;
|
struct sdr_record_list *e;
|
||||||
struct sdr_record_list *head;
|
struct sdr_record_list *head;
|
||||||
|
|
||||||
head = malloc(sizeof (struct sdr_record_list));
|
|
||||||
if (head == NULL) {
|
|
||||||
lprintf(LOG_ERR, "ipmitool: malloc failure");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
memset(head, 0, sizeof (struct sdr_record_list));
|
|
||||||
|
|
||||||
if (sdr_list_itr == NULL) {
|
if (sdr_list_itr == NULL) {
|
||||||
sdr_list_itr = ipmi_sdr_start(intf, 0);
|
sdr_list_itr = ipmi_sdr_start(intf, 0);
|
||||||
if (sdr_list_itr == NULL) {
|
if (sdr_list_itr == NULL) {
|
||||||
@ -3565,6 +3585,13 @@ ipmi_sdr_find_sdr_bytype(struct ipmi_intf *intf, uint8_t type)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
head = malloc(sizeof (struct sdr_record_list));
|
||||||
|
if (head == NULL) {
|
||||||
|
lprintf(LOG_ERR, "ipmitool: malloc failure");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
memset(head, 0, sizeof (struct sdr_record_list));
|
||||||
|
|
||||||
/* check what we've already read */
|
/* check what we've already read */
|
||||||
for (e = sdr_list_head; e != NULL; e = e->next)
|
for (e = sdr_list_head; e != NULL; e = e->next)
|
||||||
if (e->type == type)
|
if (e->type == type)
|
||||||
@ -3585,8 +3612,12 @@ ipmi_sdr_find_sdr_bytype(struct ipmi_intf *intf, uint8_t type)
|
|||||||
sdrr->type = header->type;
|
sdrr->type = header->type;
|
||||||
|
|
||||||
rec = ipmi_sdr_get_record(intf, header, sdr_list_itr);
|
rec = ipmi_sdr_get_record(intf, header, sdr_list_itr);
|
||||||
if (rec == NULL)
|
if (rec == NULL) {
|
||||||
|
if (sdrr != NULL) {
|
||||||
|
free(sdrr);
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
switch (header->type) {
|
switch (header->type) {
|
||||||
case SDR_RECORD_TYPE_FULL_SENSOR:
|
case SDR_RECORD_TYPE_FULL_SENSOR:
|
||||||
@ -3616,6 +3647,9 @@ ipmi_sdr_find_sdr_bytype(struct ipmi_intf *intf, uint8_t type)
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
free(rec);
|
free(rec);
|
||||||
|
if (sdrr != NULL) {
|
||||||
|
free(sdrr);
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3720,8 +3754,12 @@ ipmi_sdr_find_sdr_byid(struct ipmi_intf *intf, char *id)
|
|||||||
sdrr->type = header->type;
|
sdrr->type = header->type;
|
||||||
|
|
||||||
rec = ipmi_sdr_get_record(intf, header, sdr_list_itr);
|
rec = ipmi_sdr_get_record(intf, header, sdr_list_itr);
|
||||||
if (rec == NULL)
|
if (rec == NULL) {
|
||||||
|
if (sdrr != NULL) {
|
||||||
|
free(sdrr);
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
switch (header->type) {
|
switch (header->type) {
|
||||||
case SDR_RECORD_TYPE_FULL_SENSOR:
|
case SDR_RECORD_TYPE_FULL_SENSOR:
|
||||||
@ -3786,6 +3824,9 @@ ipmi_sdr_find_sdr_byid(struct ipmi_intf *intf, char *id)
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
free(rec);
|
free(rec);
|
||||||
|
if (sdrr != NULL) {
|
||||||
|
free(sdrr);
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3878,6 +3919,9 @@ ipmi_sdr_list_cache_fromfile(struct ipmi_intf *intf, const char *ifile)
|
|||||||
if (rec == NULL) {
|
if (rec == NULL) {
|
||||||
lprintf(LOG_ERR, "ipmitool: malloc failure");
|
lprintf(LOG_ERR, "ipmitool: malloc failure");
|
||||||
ret = -1;
|
ret = -1;
|
||||||
|
if (sdrr != NULL) {
|
||||||
|
free(sdrr);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
memset(rec, 0, header.length + 1);
|
memset(rec, 0, header.length + 1);
|
||||||
@ -3888,6 +3932,12 @@ ipmi_sdr_list_cache_fromfile(struct ipmi_intf *intf, const char *ifile)
|
|||||||
"record %04x read %d bytes, expected %d",
|
"record %04x read %d bytes, expected %d",
|
||||||
header.id, bc, header.length);
|
header.id, bc, header.length);
|
||||||
ret = -1;
|
ret = -1;
|
||||||
|
if (sdrr != NULL) {
|
||||||
|
free(sdrr);
|
||||||
|
}
|
||||||
|
if (rec != NULL) {
|
||||||
|
free(rec);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3919,6 +3969,9 @@ ipmi_sdr_list_cache_fromfile(struct ipmi_intf *intf, const char *ifile)
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
free(rec);
|
free(rec);
|
||||||
|
if (sdrr != NULL) {
|
||||||
|
free(sdrr);
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3983,8 +4036,12 @@ ipmi_sdr_list_cache(struct ipmi_intf *intf)
|
|||||||
sdrr->type = header->type;
|
sdrr->type = header->type;
|
||||||
|
|
||||||
rec = ipmi_sdr_get_record(intf, header, sdr_list_itr);
|
rec = ipmi_sdr_get_record(intf, header, sdr_list_itr);
|
||||||
if (rec == NULL)
|
if (rec == NULL) {
|
||||||
|
if (sdrr != NULL) {
|
||||||
|
free(sdrr);
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
switch (header->type) {
|
switch (header->type) {
|
||||||
case SDR_RECORD_TYPE_FULL_SENSOR:
|
case SDR_RECORD_TYPE_FULL_SENSOR:
|
||||||
@ -4014,6 +4071,9 @@ ipmi_sdr_list_cache(struct ipmi_intf *intf)
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
free(rec);
|
free(rec);
|
||||||
|
if (sdrr != NULL) {
|
||||||
|
free(sdrr);
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4238,6 +4298,9 @@ ipmi_sdr_dump_bin(struct ipmi_intf *intf, const char *ofile)
|
|||||||
|
|
||||||
if (sdrr->raw == NULL) {
|
if (sdrr->raw == NULL) {
|
||||||
lprintf(LOG_ERR, "ipmitool: cannot obtain SDR record %04x", header->id);
|
lprintf(LOG_ERR, "ipmitool: cannot obtain SDR record %04x", header->id);
|
||||||
|
if (sdrr != NULL) {
|
||||||
|
free(sdrr);
|
||||||
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user