diff options
| author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2022-09-10 15:44:41 +0200 | 
|---|---|---|
| committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2022-09-10 15:44:41 +0200 | 
| commit | a9ee361f27e0439530387765924574e5358c8a5c (patch) | |
| tree | 3104aecc4d574f7d7bbb269223814586277b1797 /lib/ipmi_fru.c | |
| parent | 82ac6c87ce0b0af2fb8de25d70442fec406bb742 (diff) | |
New upstream version 1.8.19upstream/1.8.19upstream
Diffstat (limited to 'lib/ipmi_fru.c')
| -rw-r--r-- | lib/ipmi_fru.c | 949 | 
1 files changed, 474 insertions, 475 deletions
| diff --git a/lib/ipmi_fru.c b/lib/ipmi_fru.c index cf00eff..3d1d8a1 100644 --- a/lib/ipmi_fru.c +++ b/lib/ipmi_fru.c @@ -33,12 +33,15 @@  #include <ipmitool/ipmi.h>  #include <ipmitool/log.h>  #include <ipmitool/helper.h> +#include <ipmitool/ipmi_cc.h>  #include <ipmitool/ipmi_intf.h>  #include <ipmitool/ipmi_fru.h>  #include <ipmitool/ipmi_mc.h>  #include <ipmitool/ipmi_sdr.h>  #include <ipmitool/ipmi_strings.h>  /* IANA id strings */ +#include <ipmitool/ipmi_time.h> +#include <stdbool.h>  #include <stdlib.h>  #include <string.h>  #include <time.h> @@ -49,6 +52,7 @@  #endif  #define FRU_MULTIREC_CHUNK_SIZE     (255 + sizeof(struct fru_multirec_header)) +#define FRU_FIELD_VALID(a) (a && a[0])  static const char *section_id[4] = {  	"Internal Use Section", @@ -57,16 +61,56 @@ static const char *section_id[4] = {  	"Product Section"  }; +static const char * combined_voltage_desc[] = { +	"12 V", +	"-12 V", +	"5 V", +	"3.3 V" +}; + +static const char * chassis_type_desc[] = { +	"Unspecified", +	"Other", +	"Unknown", +	"Desktop", +	"Low Profile Desktop", +	"Pizza Box", +	"Mini Tower", +	"Tower", +	"Portable", +	"LapTop", +	"Notebook", +	"Hand Held", +	"Docking Station", +	"All in One", +	"Sub Notebook", +	"Space-saving", +	"Lunch Box", +	"Main Server Chassis", +	"Expansion Chassis", +	"SubChassis", +	"Bus Expansion Chassis", +	"Peripheral Chassis", +	"RAID Chassis", +	"Rack Mount Chassis", +	"Sealed-case PC", +	"Multi-system Chassis", +	"CompactPCI", +	"AdvancedTCA", +	"Blade", +	"Blade Enclosure" +}; + +static inline bool fru_cc_rq2big(int code) { +	return (code == IPMI_CC_REQ_DATA_INV_LENGTH +		|| code == IPMI_CC_REQ_DATA_FIELD_EXCEED +		|| code == IPMI_CC_CANT_RET_NUM_REQ_BYTES); +} +  /* From lib/dimm_spd.c: */  int  ipmi_spd_print_fru(struct ipmi_intf * intf, uint8_t id); -/* From src/plugins/ipmi_intf.c: */ -void -ipmi_intf_set_max_request_data_size(struct ipmi_intf * intf, uint16_t size); -void -ipmi_intf_set_max_response_data_size(struct ipmi_intf * intf, uint16_t size); -  extern int verbose;  static void ipmi_fru_read_to_bin(struct ipmi_intf * intf, char * pFileName, uint8_t fruId); @@ -107,7 +151,7 @@ char * get_fru_area_str(uint8_t * data, uint32_t * offset)  {  	static const char bcd_plus[] = "0123456789 -.:,_";  	char * str; -	int len, off, size, i, j, k, typecode; +	int len, off, size, i, j, k, typecode, char_idx;  	union {  		uint32_t bits;  		char chars[4]; @@ -126,15 +170,15 @@ char * get_fru_area_str(uint8_t * data, uint32_t * offset)  	switch (typecode) {  	case 0:           /* 00b: binary/unspecified */ -		/* hex dump -> 2x length */ -		size = (len*2); +	case 1:           /* 01b: BCD plus */ +		/* hex dump or BCD -> 2x length */ +		size = (len * 2);  		break;  	case 2:           /* 10b: 6-bit ASCII */ -		/* 4 chars per group of 1-3 bytes */ -		size = ((((len+2)*4)/3) & ~3); +		/* 4 chars per group of 1-3 bytes, round up to 4 bytes boundary */ +		size = (len / 3 + 1) * 4;  		break;  	case 3:           /* 11b: 8-bit ASCII */ -	case 1:           /* 01b: BCD plus */  		/* no length adjustment */  		size = len;  		break; @@ -145,11 +189,11 @@ char * get_fru_area_str(uint8_t * data, uint32_t * offset)  		return NULL;  	}  	str = malloc(size+1); -	if (str == NULL) +	if (!str)  		return NULL;  	memset(str, 0, size+1); -	if (len == 0) { +	if (size == 0) {  		str[0] = '\0';  		*offset = off;  		return str; @@ -157,30 +201,30 @@ char * get_fru_area_str(uint8_t * data, uint32_t * offset)  	switch (typecode) {  	case 0:        /* Binary */ -		strncpy(str, buf2str(&data[off], len), len*2); +		strncpy(str, buf2str(&data[off], len), size);  		break;  	case 1:        /* BCD plus */ -		for (k=0; k<len; k++) -			str[k] = bcd_plus[(data[off+k] & 0x0f)]; +		for (k = 0; k < size; k++) +			str[k] = bcd_plus[((data[off + k / 2] >> ((k % 2) ? 0 : 4)) & 0x0f)];  		str[k] = '\0';  		break;  	case 2:        /* 6-bit ASCII */ -		for (i=j=0; i<len; i+=3) { +		for (i = j = 0; i < len; i += 3) {  			u.bits = 0; -			k = ((len-i) < 3 ? (len-i) : 3); +			k = ((len - i) < 3 ? (len - i) : 3);  #if WORDS_BIGENDIAN  			u.chars[3] = data[off+i];  			u.chars[2] = (k > 1 ? data[off+i+1] : 0);  			u.chars[1] = (k > 2 ? data[off+i+2] : 0); -#define CHAR_IDX 3 +			char_idx = 3;  #else  			memcpy((void *)&u.bits, &data[off+i], k); -#define CHAR_IDX 0 +			char_idx = 0;  #endif  			for (k=0; k<4; k++) { -				str[j++] = ((u.chars[CHAR_IDX] & 0x3f) + 0x20); +				str[j++] = ((u.chars[char_idx] & 0x3f) + 0x20);  				u.bits >>= 6;  			}  		} @@ -188,8 +232,8 @@ char * get_fru_area_str(uint8_t * data, uint32_t * offset)  		break;  	case 3: -		memcpy(str, &data[off], len); -		str[len] = '\0'; +		memcpy(str, &data[off], size); +		str[size] = '\0';  		break;  	} @@ -204,26 +248,26 @@ char * get_fru_area_str(uint8_t * data, uint32_t * offset)   * input_filename - user input string   *   * returns   0  if path is ok - * returns (-1) if path is NULL - * returns (-2) if path is too short - * returns (-3) if path is too long + * returns -1 if path is NULL + * returns -2 if path is too short + * returns -3 if path is too long   */  int  is_valid_filename(const char *input_filename)  { -	if (input_filename == NULL) { +	if (!input_filename) {  		lprintf(LOG_ERR, "ERROR: NULL pointer passed."); -		return (-1); +		return -1;  	}  	if (strlen(input_filename) < 1) {  		lprintf(LOG_ERR, "File/path is invalid."); -		return (-2); +		return -2;  	}  	if (strlen(input_filename) >= 512) {  		lprintf(LOG_ERR, "File/path must be shorter than 512 bytes."); -		return (-3); +		return -3;  	}  	return 0; @@ -271,12 +315,12 @@ build_fru_bloc(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id)  	rsp = intf->sendrecv(intf, &req); -	if (rsp == NULL) { +	if (!rsp) {  		lprintf(LOG_ERR, " Device not present (No Response)");  		return NULL;  	} -	if (rsp->ccode > 0) { +	if (rsp->ccode) {  		lprintf(LOG_ERR," Device not present (%s)",  				val2str(rsp->ccode, completion_code_vals));  		return NULL; @@ -428,11 +472,15 @@ free_fru_bloc(t_ipmi_fru_bloc *bloc)  	while (bloc) {  		del = bloc;  		bloc = bloc->next; -		free(del); -		del = NULL; +		free_n(&del);  	}  } +/* By how many bytes to reduce a write command on a size failure. */ +#define FRU_BLOCK_SZ	8 +/* Baseline for a large enough piece to reduce via steps instead of bytes. */ +#define FRU_AREA_MAXIMUM_BLOCK_SZ	32 +  /*   * write FRU[doffset:length] from the pFrubuf[soffset:length]   * rc=1 on success @@ -458,7 +506,7 @@ write_fru_area(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id,  	if (fru->access && ((doffset & 1) || (length & 1))) {  		lprintf(LOG_ERROR, "Odd offset or length specified"); -		return (-1); +		return -1;  	}  	t_ipmi_fru_bloc * fru_bloc = build_fru_bloc(intf, fru, id); @@ -554,20 +602,20 @@ write_fru_area(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id,  			break;  		} -		if (rsp->ccode == 0xc7 || rsp->ccode == 0xc8 || rsp->ccode == 0xca) { -			if (fru->max_write_size > 8) { -				fru->max_write_size -= 8; +		if (fru_cc_rq2big(rsp->ccode)) { +			if (fru->max_write_size > FRU_AREA_MAXIMUM_BLOCK_SZ) { +				fru->max_write_size -= FRU_BLOCK_SZ;  				lprintf(LOG_INFO, "Retrying FRU write with request size %d",  						fru->max_write_size);  				continue;  			} -		} else if(rsp->ccode == 0x80) { -			rsp->ccode = 0; +		} else if (rsp->ccode == IPMI_CC_FRU_WRITE_PROTECTED_OFFSET) { +			rsp->ccode = IPMI_CC_OK;  			// Write protected section  			protected_bloc = 1;  		} -		if (rsp->ccode > 0) +		if (rsp->ccode)  			break;  		if (protected_bloc == 0) { @@ -615,7 +663,10 @@ int  read_fru_area(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id,  			uint32_t offset, uint32_t length, uint8_t *frubuf)  { -	uint32_t off = offset, tmp, finish; +	uint32_t off = offset; +	uint32_t tmp; +	uint32_t finish; +	uint32_t size_left_in_buffer;  	struct ipmi_rs * rsp;  	struct ipmi_rq req;  	uint8_t msg_data[4]; @@ -628,10 +679,12 @@ read_fru_area(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id,  	finish = offset + length;  	if (finish > fru->size) { +		memset(frubuf + fru->size, 0, length - fru->size);  		finish = fru->size;  		lprintf(LOG_NOTICE, "Read FRU Area length %d too large, "  			"Adjusting to %d",  			offset + length, finish - offset); +		length = finish - offset;  	}  	memset(&req, 0, sizeof(req)); @@ -667,6 +720,7 @@ read_fru_area(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id,  		}  	} +	size_left_in_buffer = length;  	do {  		tmp = fru->access ? off >> 1 : off;  		msg_data[0] = id; @@ -679,18 +733,19 @@ read_fru_area(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id,  			msg_data[3] = (uint8_t)tmp;  		rsp = intf->sendrecv(intf, &req); -		if (rsp == NULL) { +		if (!rsp) {  			lprintf(LOG_NOTICE, "FRU Read failed");  			break;  		} -		if (rsp->ccode > 0) { +		if (rsp->ccode) {  			/* if we get C7h or C8h or CAh return code then we requested too  			* many bytes at once so try again with smaller size */ -			if ((rsp->ccode == 0xc7 || rsp->ccode == 0xc8 || rsp->ccode == 0xca) -					&& fru->max_read_size > 8) { -				if (fru->max_read_size > 32) { +			if (fru_cc_rq2big(rsp->ccode) +			    && fru->max_read_size > FRU_BLOCK_SZ) +			{ +				if (fru->max_read_size > FRU_AREA_MAXIMUM_BLOCK_SZ) {  					/* subtract read length more aggressively */ -					fru->max_read_size -= 8; +					fru->max_read_size -= FRU_BLOCK_SZ;  				} else {  					/* subtract length less aggressively */  					fru->max_read_size--; @@ -707,9 +762,18 @@ read_fru_area(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id,  		}  		tmp = fru->access ? rsp->data[0] << 1 : rsp->data[0]; +		if(rsp->data_len < 1 +		   || tmp > rsp->data_len - 1 +		   || tmp > size_left_in_buffer) +		{ +			printf(" Not enough buffer size"); +			return -1; +		} +  		memcpy(frubuf, rsp->data + 1, tmp);  		off += tmp;  		frubuf += tmp; +		size_left_in_buffer -= tmp;  		/* sometimes the size returned in the Info command  		* is too large.  return 0 so higher level function  		* still attempts to parse what was returned */ @@ -742,7 +806,9 @@ read_fru_area_section(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id,  			uint32_t offset, uint32_t length, uint8_t *frubuf)  {  	static uint32_t fru_data_rqst_size = 20; -	uint32_t off = offset, tmp, finish; +	uint32_t off = offset; +	uint32_t tmp, finish; +	uint32_t size_left_in_buffer;  	struct ipmi_rs * rsp;  	struct ipmi_rq req;  	uint8_t msg_data[4]; @@ -755,10 +821,12 @@ read_fru_area_section(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id,  	finish = offset + length;  	if (finish > fru->size) { +		memset(frubuf + fru->size, 0, length - fru->size);  		finish = fru->size;  		lprintf(LOG_NOTICE, "Read FRU Area length %d too large, "  			"Adjusting to %d",  			offset + length, finish - offset); +		length = finish - offset;  	}  	memset(&req, 0, sizeof(req)); @@ -773,6 +841,8 @@ read_fru_area_section(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id,  	if (fru->access && fru_data_rqst_size > 16)  #endif  		fru_data_rqst_size = 16; + +	size_left_in_buffer = length;  	do {  		tmp = fru->access ? off >> 1 : off;  		msg_data[0] = id; @@ -785,16 +855,16 @@ read_fru_area_section(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id,  			msg_data[3] = (uint8_t)tmp;  		rsp = intf->sendrecv(intf, &req); -		if (rsp == NULL) { +		if (!rsp) {  			lprintf(LOG_NOTICE, "FRU Read failed");  			break;  		} -		if (rsp->ccode > 0) { +		if (rsp->ccode) {  			/* if we get C7 or C8  or CA return code then we requested too  			* many bytes at once so try again with smaller size */ -			if ((rsp->ccode == 0xc7 || rsp->ccode == 0xc8 || rsp->ccode == 0xca) && -				(--fru_data_rqst_size > 8)) { -				lprintf(LOG_INFO, "Retrying FRU read with request size %d", +			if (fru_cc_rq2big(rsp->ccode) && (--fru_data_rqst_size > FRU_BLOCK_SZ)) { +				lprintf(LOG_INFO, +					"Retrying FRU read with request size %d",  					fru_data_rqst_size);  				continue;  			} @@ -804,8 +874,16 @@ read_fru_area_section(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id,  		}  		tmp = fru->access ? rsp->data[0] << 1 : rsp->data[0]; +		if(rsp->data_len < 1 +		   || tmp > rsp->data_len - 1 +		   || tmp > size_left_in_buffer) +		{ +			printf(" Not enough buffer size"); +			return -1; +		}  		memcpy((frubuf + off)-offset, rsp->data + 1, tmp);  		off += tmp; +		size_left_in_buffer -= tmp;  		/* sometimes the size returned in the Info command  		* is too large.  return 0 so higher level function @@ -834,7 +912,7 @@ fru_area_print_multirec_bloc(struct ipmi_intf * intf, struct fru_info * fru,  	i = last_off = offset;  	fru_data = malloc(fru->size + 1); -	if (fru_data == NULL) { +	if (!fru_data) {  		lprintf(LOG_ERR, " Out of memory!");  		return;  	} @@ -878,8 +956,7 @@ fru_area_print_multirec_bloc(struct ipmi_intf * intf, struct fru_info * fru,  	lprintf(LOG_DEBUG ,"Multi-Record area ends at: %i (%xh)",i,i); -	free(fru_data); -	fru_data = NULL; +	free_n(&fru_data);  } @@ -898,6 +975,7 @@ fru_area_print_chassis(struct ipmi_intf * intf, struct fru_info * fru,  	uint8_t * fru_data;  	uint32_t fru_len, i;  	uint8_t tmp[2]; +	size_t chassis_type;  	fru_len = 0; @@ -911,7 +989,7 @@ fru_area_print_chassis(struct ipmi_intf * intf, struct fru_info * fru,  	}  	fru_data = malloc(fru_len); -	if (fru_data == NULL) { +	if (!fru_data) {  		lprintf(LOG_ERR, "ipmitool: malloc failure");  		return;  	} @@ -920,8 +998,7 @@ fru_area_print_chassis(struct ipmi_intf * intf, struct fru_info * fru,  	/* read in the full fru */  	if (read_fru_area(intf, fru, id, offset, fru_len, fru_data) < 0) { -		free(fru_data); -		fru_data = NULL; +		free_n(&fru_data);  		return;  	} @@ -931,42 +1008,38 @@ fru_area_print_chassis(struct ipmi_intf * intf, struct fru_info * fru,  	 */  	i = 2; -	printf(" Chassis Type          : %s\n", - 		chassis_type_desc[fru_data[i] > - 		(sizeof(chassis_type_desc)/sizeof(chassis_type_desc[0])) - 1 ? - 		2 : fru_data[i]]); +	chassis_type = (fru_data[i] > ARRAY_SIZE(chassis_type_desc) - 1) +	               ? 2 +	               : fru_data[i]; +	printf(" Chassis Type          : %s\n", chassis_type_desc[chassis_type]);   	i++;  	fru_area = get_fru_area_str(fru_data, &i); -	if (fru_area != NULL) { +	if (fru_area) {  		if (strlen(fru_area) > 0) {  			printf(" Chassis Part Number   : %s\n", fru_area);  		} -		free(fru_area); -		fru_area = NULL; +		free_n(&fru_area);  	}  	fru_area = get_fru_area_str(fru_data, &i); -	if (fru_area != NULL) { +	if (fru_area) {  		if (strlen(fru_area) > 0) {  			printf(" Chassis Serial        : %s\n", fru_area);  		} -		free(fru_area); -		fru_area = NULL; +		free_n(&fru_area);  	}  	/* read any extra fields */ -	while ((fru_data[i] != 0xc1) && (i < fru_len)) -	{ +	while ((i < fru_len) && (fru_data[i] != FRU_END_OF_FIELDS)) {  		int j = i;  		fru_area = get_fru_area_str(fru_data, &i); -		if (fru_area != NULL) { +		if (fru_area) {  			if (strlen(fru_area) > 0) {  				printf(" Chassis Extra         : %s\n", fru_area);  			} -			free(fru_area); -			fru_area = NULL; +			free_n(&fru_area);  		}  		if (i == j) { @@ -974,10 +1047,7 @@ fru_area_print_chassis(struct ipmi_intf * intf, struct fru_info * fru,  		}  	} -	if (fru_data != NULL) { -		free(fru_data); -		fru_data = NULL; -	} +	free_n(&fru_data);  }  /* fru_area_print_board  -  Print FRU Board Area @@ -995,7 +1065,7 @@ fru_area_print_board(struct ipmi_intf * intf, struct fru_info * fru,  	uint8_t * fru_data;  	uint32_t fru_len;  	uint32_t i; -	time_t tval; +	time_t ts;  	uint8_t tmp[2];  	fru_len = 0; @@ -1010,7 +1080,7 @@ fru_area_print_board(struct ipmi_intf * intf, struct fru_info * fru,  	}  	fru_data = malloc(fru_len); -	if (fru_data == NULL) { +	if (!fru_data) {  		lprintf(LOG_ERR, "ipmitool: malloc failure");  		return;  	} @@ -1019,8 +1089,7 @@ fru_area_print_board(struct ipmi_intf * intf, struct fru_info * fru,  	/* read in the full fru */  	if (read_fru_area(intf, fru, id, offset, fru_len, fru_data) < 0) { -		free(fru_data); -		fru_data = NULL; +		free_n(&fru_data);  		return;  	} @@ -1031,77 +1100,65 @@ fru_area_print_board(struct ipmi_intf * intf, struct fru_info * fru,  	 */  	i = 3; -	tval=((fru_data[i+2] << 16) + (fru_data[i+1] << 8) + (fru_data[i])); -	tval=tval * 60; -	tval=tval + secs_from_1970_1996; -	printf(" Board Mfg Date        : %s", asctime(localtime(&tval))); +	ts = ipmi_fru2time_t(&fru_data[i]); +	printf(" Board Mfg Date        : %s\n", ipmi_timestamp_string(ts));  	i += 3;  /* skip mfg. date time */  	fru_area = get_fru_area_str(fru_data, &i); -	if (fru_area != NULL) { +	if (fru_area) {  		if (strlen(fru_area) > 0) {  			printf(" Board Mfg             : %s\n", fru_area);  		} -		free(fru_area); -		fru_area = NULL; +		free_n(&fru_area);  	}  	fru_area = get_fru_area_str(fru_data, &i); -	if (fru_area != NULL) { +	if (fru_area) {  		if (strlen(fru_area) > 0) {  			printf(" Board Product         : %s\n", fru_area);  		} -		free(fru_area); -		fru_area = NULL; +		free_n(&fru_area);  	}  	fru_area = get_fru_area_str(fru_data, &i); -	if (fru_area != NULL) { +	if (fru_area) {  		if (strlen(fru_area) > 0) {  			printf(" Board Serial          : %s\n", fru_area);  		} -		free(fru_area); -		fru_area = NULL; +		free_n(&fru_area);  	}  	fru_area = get_fru_area_str(fru_data, &i); -	if (fru_area != NULL) { +	if (fru_area) {  		if (strlen(fru_area) > 0) {  			printf(" Board Part Number     : %s\n", fru_area);  		} -		free(fru_area); -		fru_area = NULL; +		free_n(&fru_area);  	}  	fru_area = get_fru_area_str(fru_data, &i); -	if (fru_area != NULL) { +	if (fru_area) {  		if (strlen(fru_area) > 0 && verbose > 0) {  			printf(" Board FRU ID          : %s\n", fru_area);  		} -		free(fru_area); -		fru_area = NULL; +		free_n(&fru_area);  	}  	/* read any extra fields */ -	while ((fru_data[i] != 0xc1) && (i < fru_len)) -	{ +	while ((i < fru_len) && (fru_data[i] != FRU_END_OF_FIELDS)) {  		int j = i;  		fru_area = get_fru_area_str(fru_data, &i); -		if (fru_area != NULL) { +		if (fru_area) {  			if (strlen(fru_area) > 0) {  				printf(" Board Extra           : %s\n", fru_area);  			} -			free(fru_area); -			fru_area = NULL; +			free_n(&fru_area);  		}  		if (i == j)  			break;  	} -	if (fru_data != NULL) { -		free(fru_data); -		fru_data = NULL; -	} +	free_n(&fru_data);  }  /* fru_area_print_product  -  Print FRU Product Area @@ -1132,7 +1189,7 @@ fru_area_print_product(struct ipmi_intf * intf, struct fru_info * fru,  	}  	fru_data = malloc(fru_len); -	if (fru_data == NULL) { +	if (!fru_data) {  		lprintf(LOG_ERR, "ipmitool: malloc failure");  		return;  	} @@ -1142,8 +1199,7 @@ fru_area_print_product(struct ipmi_intf * intf, struct fru_info * fru,  	/* read in the full fru */  	if (read_fru_area(intf, fru, id, offset, fru_len, fru_data) < 0) { -		free(fru_data); -		fru_data = NULL; +		free_n(&fru_data);  		return;  	} @@ -1155,88 +1211,76 @@ fru_area_print_product(struct ipmi_intf * intf, struct fru_info * fru,  	i = 3;  	fru_area = get_fru_area_str(fru_data, &i); -	if (fru_area != NULL) { +	if (fru_area) {  		if (strlen(fru_area) > 0) {  			printf(" Product Manufacturer  : %s\n", fru_area);  		} -		free(fru_area); -		fru_area = NULL; +		free_n(&fru_area);  	}  	fru_area = get_fru_area_str(fru_data, &i); -	if (fru_area != NULL) { +	if (fru_area) {  		if (strlen(fru_area) > 0) {  			printf(" Product Name          : %s\n", fru_area);  		} -		free(fru_area); -		fru_area = NULL; +		free_n(&fru_area);  	}  	fru_area = get_fru_area_str(fru_data, &i); -	if (fru_area != NULL) { +	if (fru_area) {  		if (strlen(fru_area) > 0) {  			printf(" Product Part Number   : %s\n", fru_area);  		} -		free(fru_area); -		fru_area = NULL; +		free_n(&fru_area);  	}  	fru_area = get_fru_area_str(fru_data, &i); -	if (fru_area != NULL) { +	if (fru_area) {  		if (strlen(fru_area) > 0) {  			printf(" Product Version       : %s\n", fru_area);  		} -		free(fru_area); -		fru_area = NULL; +		free_n(&fru_area);  	}  	fru_area = get_fru_area_str(fru_data, &i); -	if (fru_area != NULL) { +	if (fru_area) {  		if (strlen(fru_area) > 0) {  			printf(" Product Serial        : %s\n", fru_area);  		} -		free(fru_area); -		fru_area = NULL; +		free_n(&fru_area);  	}  	fru_area = get_fru_area_str(fru_data, &i); -	if (fru_area != NULL) { +	if (fru_area) {  		if (strlen(fru_area) > 0) {  			printf(" Product Asset Tag     : %s\n", fru_area);  		} -		free(fru_area); -		fru_area = NULL; +		free_n(&fru_area);  	}  	fru_area = get_fru_area_str(fru_data, &i); -	if (fru_area != NULL) { +	if (fru_area) {  		if (strlen(fru_area) > 0 && verbose > 0) {  			printf(" Product FRU ID        : %s\n", fru_area);  		} -		free(fru_area); -		fru_area = NULL; +		free_n(&fru_area);  	}  	/* read any extra fields */ -	while ((fru_data[i] != 0xc1) && (i < fru_len)) -	{ +	while ((i < fru_len) && (fru_data[i] != FRU_END_OF_FIELDS)) {  		int j = i;  		fru_area = get_fru_area_str(fru_data, &i); -		if (fru_area != NULL) { +		if (fru_area) {  			if (strlen(fru_area) > 0) {  				printf(" Product Extra         : %s\n", fru_area);  			} -			free(fru_area); -			fru_area = NULL; +			free_n(&fru_area);  		}  		if (i == j)  			break;  	} -	if (fru_data != NULL) { -		free(fru_data); -		fru_data = NULL; -	} +	free_n(&fru_data);  }  /* fru_area_print_multirec  -  Print FRU Multi Record Area @@ -1262,7 +1306,7 @@ fru_area_print_multirec(struct ipmi_intf * intf, struct fru_info * fru,  	last_off = offset;  	fru_data = malloc(FRU_MULTIREC_CHUNK_SIZE); -	if (fru_data == NULL) { +	if (!fru_data) {  		lprintf(LOG_ERR, "ipmitool: malloc failure");  		return;  	} @@ -1428,7 +1472,7 @@ fru_area_print_multirec(struct ipmi_intf * intf, struct fru_info * fru,  	lprintf(LOG_DEBUG ,"Multi-Record area ends at: %i (%xh)", last_off, last_off); -	free(fru_data); +	free_n(&fru_data);  }  /* ipmi_fru_query_new_value  -  Query new values to replace original FRU content @@ -1440,16 +1484,18 @@ fru_area_print_multirec(struct ipmi_intf * intf, struct fru_info * fru,  * returns : TRUE if data changed  * returns : FALSE if data not changed  */ -int ipmi_fru_query_new_value(uint8_t *data,int offset, size_t len) +static +bool +ipmi_fru_query_new_value(uint8_t *data,int offset, size_t len)  { -	int status=FALSE; +	bool status = false;  	int ret;  	char answer;  	printf("Would you like to change this value <y/n> ? ");  	ret = scanf("%c", &answer);  	if (ret != 1) { -		return FALSE; +		return false;  	}  	if( answer == 'y' || answer == 'Y' ){ @@ -1465,17 +1511,16 @@ int ipmi_fru_query_new_value(uint8_t *data,int offset, size_t len)  		for( i=0;i<len;i++ ){  			ret = scanf("%x", holder+i);  			if (ret != 1) { -				free(holder); -				return FALSE; +				free_n(&holder); +				return false;  			}  		}  		for( i=0;i<len;i++ ){  			data[offset++] = (unsigned char) *(holder+i);  		}  		/* &data[offset++] */ -		free(holder); -		holder = NULL; -		status = TRUE; +		free_n(&holder); +		status = true;  	}  	else{  		printf("Entered %c\n",answer); @@ -1572,12 +1617,13 @@ typedef struct OemKontronInformationRecordV1{  */ -static void ipmi_fru_oemkontron_get( int argc, char ** argv,uint8_t * fru_data, -												int off,int len, -												struct fru_multirec_header *h, -												struct fru_multirec_oem_header *oh) +static void ipmi_fru_oemkontron_get(int argc, +				    char ** argv, +				    uint8_t * fru_data, +				    int off, +				    struct fru_multirec_oem_header *oh)  { -	static int badParams=FALSE; +	static bool badParams = false;  	int start = off;  	int offset = start;  	offset += sizeof(struct fru_multirec_oem_header); @@ -1585,117 +1631,114 @@ static void ipmi_fru_oemkontron_get( int argc, char ** argv,uint8_t * fru_data,  	if(!badParams){  		/* the 'OEM' field is already checked in caller */  		if( argc > OEM_KONTRON_SUBCOMMAND_ARG_POS ){ -			if(strncmp("oem", argv[OEM_KONTRON_SUBCOMMAND_ARG_POS],3)){ +			if(strcmp("oem", argv[OEM_KONTRON_SUBCOMMAND_ARG_POS])){  				printf("usage: fru get <id> <oem>\n"); -				badParams = TRUE; +				badParams = true;  				return;  			}  		}  		if( argc<GET_OEM_KONTRON_COMPLETE_ARG_COUNT ){  			printf("usage: oem <iana> <recordid>\n");  			printf("usage: oem 15000 3\n"); -			badParams = TRUE; +			badParams = true;  			return;  		}  	} -	if(!badParams){ - -		if(oh->record_id == OEM_KONTRON_INFORMATION_RECORD ) { - -			uint8_t version; - -			printf("Kontron OEM Information Record\n"); -			version = oh->record_version; - -			uint8_t blockCount; -			uint8_t blockIndex=0; +	if (badParams) { +		return; +	} -			unsigned int matchInstance = 0; -			uint8_t instance = 0; -			 -			if (str2uchar(argv[OEM_KONTRON_INSTANCE_ARG_POS], &instance) != 0) { -				lprintf(LOG_ERR, -						"Instance argument '%s' is either invalid or out of range.", -						argv[OEM_KONTRON_INSTANCE_ARG_POS]); -				badParams = TRUE; -				return; -			} +	if (oh->record_id != OEM_KONTRON_INFORMATION_RECORD) { +		return; +	} -			blockCount = fru_data[offset++]; +	uint8_t version; -			for(blockIndex=0;blockIndex<blockCount;blockIndex++){ -				void * pRecordData; -				uint8_t nameLen; +	printf("Kontron OEM Information Record\n"); +	version = oh->record_version; -				nameLen = ( fru_data[offset++] &= 0x3F ); -				printf("  Name: %*.*s\n",nameLen, nameLen, (const char *)(fru_data+offset)); +	uint8_t blockCount; +	uint8_t blockIndex = 0; -				offset+=nameLen; +	uint8_t instance = 0; -				pRecordData = &fru_data[offset]; +	if (str2uchar(argv[OEM_KONTRON_INSTANCE_ARG_POS], &instance) != 0) { +		lprintf(LOG_ERR, +			"Instance argument '%s' is either invalid or out of range.", +			argv[OEM_KONTRON_INSTANCE_ARG_POS]); +		badParams = true; +		return; +	} -				printf("  Record Version: %d\n", version); -				if( version == 0 ) -				{ -					printf("  Version: %*.*s\n", -						OEM_KONTRON_FIELD_SIZE, -						OEM_KONTRON_FIELD_SIZE, -						((tOemKontronInformationRecordV0 *) pRecordData)->field1); -					printf("  Build Date: %*.*s\n", -						OEM_KONTRON_FIELD_SIZE, -						OEM_KONTRON_FIELD_SIZE, -						((tOemKontronInformationRecordV0 *) pRecordData)->field2); -					printf("  Update Date: %*.*s\n", -						OEM_KONTRON_FIELD_SIZE, -						OEM_KONTRON_FIELD_SIZE, -						((tOemKontronInformationRecordV0 *) pRecordData)->field3); -					printf("  Checksum: %*.*s\n\n", -						OEM_KONTRON_FIELD_SIZE, -						OEM_KONTRON_FIELD_SIZE, -						((tOemKontronInformationRecordV0 *) pRecordData)->crc32); -					matchInstance++; -					offset+= sizeof(tOemKontronInformationRecordV0); -					offset++; -				} -				else if ( version == 1 ) -				{ -					printf("  Version: %*.*s\n", -						OEM_KONTRON_VERSION_FIELD_SIZE, -						OEM_KONTRON_VERSION_FIELD_SIZE, -						((tOemKontronInformationRecordV1 *) pRecordData)->field1); -					printf("  Build Date: %*.*s\n", -						OEM_KONTRON_FIELD_SIZE, -						OEM_KONTRON_FIELD_SIZE, -						((tOemKontronInformationRecordV1 *) pRecordData)->field2); -					printf("  Update Date: %*.*s\n", -						OEM_KONTRON_FIELD_SIZE, -						OEM_KONTRON_FIELD_SIZE, -						((tOemKontronInformationRecordV1 *) pRecordData)->field3); -					printf("  Checksum: %*.*s\n\n", -						OEM_KONTRON_FIELD_SIZE, -						OEM_KONTRON_FIELD_SIZE, -						((tOemKontronInformationRecordV1 *) pRecordData)->crc32); -					matchInstance++; -					offset+= sizeof(tOemKontronInformationRecordV1); -					offset++; -				} -				else -				{ -					printf ("  Unsupported version %d\n",version); -				} -			} +	blockCount = fru_data[offset++]; + +	for (blockIndex = 0; blockIndex < blockCount; blockIndex++) { +		void *pRecordData; +		uint8_t nameLen; + +		nameLen = (fru_data[offset++] &= 0x3F); +		printf("  Name: %*.*s\n", nameLen, nameLen, +		       (const char *)(fru_data + offset)); + +		offset += nameLen; + +		pRecordData = &fru_data[offset]; + +		printf("  Record Version: %d\n", version); +		if (version == 0) { +			printf("  Version: %*.*s\n", +			       OEM_KONTRON_FIELD_SIZE, +			       OEM_KONTRON_FIELD_SIZE, +			       ((tOemKontronInformationRecordV0 *)pRecordData)->field1); +			printf("  Build Date: %*.*s\n", +			       OEM_KONTRON_FIELD_SIZE, +			       OEM_KONTRON_FIELD_SIZE, +			       ((tOemKontronInformationRecordV0 *)pRecordData)->field2); +			printf("  Update Date: %*.*s\n", +			       OEM_KONTRON_FIELD_SIZE, +			       OEM_KONTRON_FIELD_SIZE, +			       ((tOemKontronInformationRecordV0 *)pRecordData)->field3); +			printf("  Checksum: %*.*s\n\n", +			       OEM_KONTRON_FIELD_SIZE, +			       OEM_KONTRON_FIELD_SIZE, +			       ((tOemKontronInformationRecordV0 *)pRecordData)->crc32); +			offset += sizeof(tOemKontronInformationRecordV0); +			offset++; +		} else if (version == 1) { +			printf("  Version: %*.*s\n", +			       OEM_KONTRON_VERSION_FIELD_SIZE, +			       OEM_KONTRON_VERSION_FIELD_SIZE, +			       ((tOemKontronInformationRecordV1 *)pRecordData)->field1); +			printf("  Build Date: %*.*s\n", +			       OEM_KONTRON_FIELD_SIZE, +			       OEM_KONTRON_FIELD_SIZE, +			       ((tOemKontronInformationRecordV1 *)pRecordData)->field2); +			printf("  Update Date: %*.*s\n", +			       OEM_KONTRON_FIELD_SIZE, +			       OEM_KONTRON_FIELD_SIZE, +			       ((tOemKontronInformationRecordV1 *)pRecordData)->field3); +			printf("  Checksum: %*.*s\n\n", +			       OEM_KONTRON_FIELD_SIZE, +			       OEM_KONTRON_FIELD_SIZE, +			       ((tOemKontronInformationRecordV1 *)pRecordData)->crc32); +			offset += sizeof(tOemKontronInformationRecordV1); +			offset++; +		} else { +			printf("  Unsupported version %d\n", version);  		}  	}  } -static int ipmi_fru_oemkontron_edit( int argc, char ** argv,uint8_t * fru_data, +static +bool +ipmi_fru_oemkontron_edit( int argc, char ** argv,uint8_t * fru_data,  												int off,int len,  												struct fru_multirec_header *h,  												struct fru_multirec_oem_header *oh)  { -	static int badParams=FALSE; -	int hasChanged = FALSE; +	static bool badParams=false; +	bool hasChanged = false;  	int start = off;  	int offset = start;  	int length = len; @@ -1706,9 +1749,9 @@ static int ipmi_fru_oemkontron_edit( int argc, char ** argv,uint8_t * fru_data,  	if(!badParams){  		/* the 'OEM' field is already checked in caller */  		if( argc > OEM_KONTRON_SUBCOMMAND_ARG_POS ){ -			if(strncmp("oem", argv[OEM_KONTRON_SUBCOMMAND_ARG_POS],3)){ +			if(strcmp("oem", argv[OEM_KONTRON_SUBCOMMAND_ARG_POS])){  				printf("usage: fru edit <id> <oem> <args...>\n"); -				badParams = TRUE; +				badParams = true;  				return hasChanged;  			}  		} @@ -1716,14 +1759,14 @@ static int ipmi_fru_oemkontron_edit( int argc, char ** argv,uint8_t * fru_data,  			printf("usage: oem <iana> <recordid> <format> <args...>\n");  			printf("usage: oem 15000 3 0 <name> <instance> <field1>"\  					" <field2> <field3> <crc32>\n"); -			badParams = TRUE; +			badParams = true;  			return hasChanged;  		}  		if (str2uchar(argv[OEM_KONTRON_RECORDID_ARG_POS], &record_id) != 0) {  			lprintf(LOG_ERR,  					"Record ID argument '%s' is either invalid or out of range.",  					argv[OEM_KONTRON_RECORDID_ARG_POS]); -			badParams = TRUE; +			badParams = true;  			return hasChanged;  		}  		if (record_id == OEM_KONTRON_INFORMATION_RECORD) { @@ -1732,7 +1775,7 @@ static int ipmi_fru_oemkontron_edit( int argc, char ** argv,uint8_t * fru_data,  					(strlen(argv[i]) != OEM_KONTRON_VERSION_FIELD_SIZE)) {  					printf("error: version fields must have %d characters\n",  										OEM_KONTRON_FIELD_SIZE); -					badParams = TRUE; +					badParams = true;  					return hasChanged;  				}  			} @@ -1749,7 +1792,7 @@ static int ipmi_fru_oemkontron_edit( int argc, char ** argv,uint8_t * fru_data,  				lprintf(LOG_ERR,  						"Format argument '%s' is either invalid or out of range.",  						argv[OEM_KONTRON_FORMAT_ARG_POS]); -				badParams = TRUE; +				badParams = true;  				return hasChanged;  			} @@ -1767,7 +1810,7 @@ static int ipmi_fru_oemkontron_edit( int argc, char ** argv,uint8_t * fru_data,  					lprintf(LOG_ERR,  							"Instance argument '%s' is either invalid or out of range.",  							argv[OEM_KONTRON_INSTANCE_ARG_POS]); -					badParams = TRUE; +					badParams = true;  					return hasChanged;  				} @@ -1830,7 +1873,7 @@ static int ipmi_fru_oemkontron_edit( int argc, char ** argv,uint8_t * fru_data,  							}  							matchInstance++; -							hasChanged = TRUE; +							hasChanged = true;  						}  						else if(!strncmp((char *)argv[OEM_KONTRON_NAME_ARG_POS],  							(const char *)(fru_data+offset), nameLen)){ @@ -1906,12 +1949,14 @@ static int ipmi_fru_oemkontron_edit( int argc, char ** argv,uint8_t * fru_data,  * returns: TRUE if data changed  * returns: FALSE if data not changed  */ -static int ipmi_fru_picmg_ext_edit(uint8_t * fru_data, +static +bool +ipmi_fru_picmg_ext_edit(uint8_t * fru_data,  												int off,int len,  												struct fru_multirec_header *h,  												struct fru_multirec_oem_header *oh)  { -	int hasChanged = FALSE; +	bool hasChanged = false;  	int start = off;  	int offset = start;  	int length = len; @@ -1936,7 +1981,7 @@ static int ipmi_fru_picmg_ext_edit(uint8_t * fru_data,  					max_current |= fru_data[++index]<<8;  					printf("      New Maximum Internal Current(@12V): %.2f A (0x%02x)\n",  								(float)max_current / 10.0f, max_current); -					hasChanged = TRUE; +					hasChanged = true;  				} @@ -1974,7 +2019,7 @@ static int ipmi_fru_picmg_ext_edit(uint8_t * fru_data,  					printf("      New Current draw(@12V): %.2f A (0x%02x)\n",  								(float)current / 10.0f, current); -					hasChanged = TRUE; +					hasChanged = true;  				}  			}  			break; @@ -2885,11 +2930,11 @@ __ipmi_fru_print(struct ipmi_intf * intf, uint8_t id)  	req.msg.data_len = 1;  	rsp = intf->sendrecv(intf, &req); -	if (rsp == NULL) { +	if (!rsp) {  		printf(" Device not present (No Response)\n");  		return -1;  	} -	if (rsp->ccode > 0) { +	if (rsp->ccode) {  		printf(" Device not present (%s)\n",  			val2str(rsp->ccode, completion_code_vals));  		return -1; @@ -2922,11 +2967,11 @@ __ipmi_fru_print(struct ipmi_intf * intf, uint8_t id)  	req.msg.data_len = 4;  	rsp = intf->sendrecv(intf, &req); -	if (rsp == NULL) { +	if (!rsp) {  		printf(" Device not present (No Response)\n");  		return 1;  	} -	if (rsp->ccode > 0) { +	if (rsp->ccode) {  		printf(" Device not present (%s)\n",  				val2str(rsp->ccode, completion_code_vals));  		return 1; @@ -3003,7 +3048,7 @@ ipmi_fru_print(struct ipmi_intf * intf, struct sdr_record_fru_locator * fru)  	uint32_t save_channel;  	int rc = 0; -	if (fru == NULL) +	if (!fru)  		return __ipmi_fru_print(intf, 0);  	/* Logical FRU Device @@ -3033,7 +3078,7 @@ ipmi_fru_print(struct ipmi_intf * intf, struct sdr_record_fru_locator * fru)  		return 0;  	memset(desc, 0, sizeof(desc)); -	memcpy(desc, fru->id_string, fru->id_code & 0x01f); +	memcpy(desc, fru->id_string, __min(fru->id_code & 0x01f, sizeof(desc)));  	desc[fru->id_code & 0x01f] = 0;  	printf("FRU Device Description : %s (ID %d)\n", desc, fru->device_id); @@ -3101,11 +3146,11 @@ ipmi_fru_print_all(struct ipmi_intf * intf)  	req.msg.data_len = 0;  	rsp = intf->sendrecv(intf, &req); -	if (rsp == NULL) { +	if (!rsp) {  		lprintf(LOG_ERR, "Get Device ID command failed");  		return -1;  	} -	if (rsp->ccode > 0) { +	if (rsp->ccode) {  		lprintf(LOG_ERR, "Get Device ID command failed: %s",  			val2str(rsp->ccode, completion_code_vals));  		return -1; @@ -3121,14 +3166,15 @@ ipmi_fru_print_all(struct ipmi_intf * intf)  		printf("\n");  	} -	if ((itr = ipmi_sdr_start(intf, 0)) == NULL) +	itr = ipmi_sdr_start(intf, 0); +	if (!itr)  		return -1;  	/* Walk the SDRs looking for FRU Devices and Management Controller Devices. */  	/* For FRU devices, print the FRU from the SDR locator record.		    */  	/* For MC devices, issue FRU commands to the satellite controller to print  */  	/* FRU data.								    */ -	while ((header = ipmi_sdr_get_next_header(intf, itr)) != NULL) +	while ((header = ipmi_sdr_get_next_header(intf, itr)))  	{  		if (header->type == SDR_RECORD_TYPE_MC_DEVICE_LOCATOR ) {  			/* Check the capabilities of the Management Controller Device */ @@ -3158,11 +3204,7 @@ ipmi_fru_print_all(struct ipmi_intf * intf)  				intf->target_addr = save_addr;  			} -			if (mc) { -				free(mc); -				mc = NULL; -			} - +			free_n(&mc);  			continue;  		} @@ -3172,19 +3214,15 @@ ipmi_fru_print_all(struct ipmi_intf * intf)  		/* Print the FRU from the SDR locator record. */  		fru = (struct sdr_record_fru_locator *)  			ipmi_sdr_get_record(intf, header, itr); -		if (fru == NULL || !fru->logical) { -			if (fru) { -				free(fru); -				fru = NULL; -			} +		if (!fru || !fru->logical) { +			free_n(&fru);  			continue;  		}  		rc = ipmi_fru_print(intf, fru); -		free(fru); -		fru = NULL; +		free_n(&fru);  	} -	ipmi_sdr_end(intf, itr); +	ipmi_sdr_end(itr);  	return rc;  } @@ -3224,8 +3262,8 @@ ipmi_fru_read_to_bin(struct ipmi_intf * intf,  	if (!rsp)  		return; -	if (rsp->ccode > 0) { -		if (rsp->ccode == 0xc3) +	if (rsp->ccode) { +		if (rsp->ccode == IPMI_CC_TIMEOUT)  			printf ("  Timeout accessing FRU info. (Device not present?)\n");  		return;  	} @@ -3240,7 +3278,7 @@ ipmi_fru_read_to_bin(struct ipmi_intf * intf,  	}  	pFruBuf = malloc(fru.size); -	if (pFruBuf != NULL) { +	if (pFruBuf) {  		printf("Fru Size         : %d bytes\n",fru.size);  		read_fru_area(intf, &fru, fruId, 0, fru.size, pFruBuf);  	} else { @@ -3248,7 +3286,7 @@ ipmi_fru_read_to_bin(struct ipmi_intf * intf,  		return;  	} -	if(pFruBuf != NULL) +	if(pFruBuf)  	{  		FILE * pFile;  		pFile = fopen(pFileName,"wb"); @@ -3257,14 +3295,12 @@ ipmi_fru_read_to_bin(struct ipmi_intf * intf,  			printf("Done\n");  		} else {  			lprintf(LOG_ERR, "Error opening file %s\n", pFileName); -			free(pFruBuf); -			pFruBuf = NULL; +			free_n(&pFruBuf);  			return;  		}  		fclose(pFile);  	} -	free(pFruBuf); -	pFruBuf = NULL; +	free_n(&pFruBuf);  }  static void @@ -3293,7 +3329,7 @@ ipmi_fru_write_from_bin(struct ipmi_intf * intf,  		return;  	if (rsp->ccode) { -		if (rsp->ccode == 0xc3) +		if (rsp->ccode == IPMI_CC_TIMEOUT)  			printf("  Timeout accessing FRU info. (Device not present?)\n");  		return;  	} @@ -3308,13 +3344,13 @@ ipmi_fru_write_from_bin(struct ipmi_intf * intf,  	}  	pFruBuf = malloc(fru.size); -	if (pFruBuf == NULL) { +	if (!pFruBuf) {  		lprintf(LOG_ERR, "Cannot allocate %d bytes\n", fru.size);  		return;  	}  		pFile = fopen(pFileName, "rb"); -		if (pFile != NULL) { +		if (pFile) {  			len = fread(pFruBuf, 1, fru.size, pFile);  			printf("Fru Size         : %d bytes\n", fru.size);  			printf("Size to Write    : %d bytes\n", len); @@ -3328,13 +3364,12 @@ ipmi_fru_write_from_bin(struct ipmi_intf * intf,  			lprintf(LOG_INFO,"Done");  		} -	free(pFruBuf); -	pFruBuf = NULL; +	free_n(&pFruBuf);  }  /* ipmi_fru_write_help() - print help text for 'write'   * - * retruns void + * returns void   */  void  ipmi_fru_write_help() @@ -3411,11 +3446,11 @@ ipmi_fru_edit_multirec(struct ipmi_intf * intf, uint8_t id ,  	req.msg.data_len = 1;  	rsp = intf->sendrecv(intf, &req); -	if (rsp == NULL) { +	if (!rsp) {  		printf(" Device not present (No Response)\n");  		return -1;  	} -	if (rsp->ccode > 0) { +	if (rsp->ccode) {  		printf(" Device not present (%s)\n",  			val2str(rsp->ccode, completion_code_vals));  		return -1; @@ -3446,7 +3481,7 @@ ipmi_fru_edit_multirec(struct ipmi_intf * intf, uint8_t id ,  		memset(&fru, 0, sizeof(fru));  		fru_data = malloc(fru.size + 1); -		if (fru_data == NULL) { +		if (!fru_data) {  			lprintf(LOG_ERR, " Out of memory!");  			return -1;  		} @@ -3480,7 +3515,7 @@ ipmi_fru_edit_multirec(struct ipmi_intf * intf, uint8_t id ,  				if( argc <=2 ) {  					suppliedIana =  IPMI_OEM_PICMG;  				}  else { -					if( !strncmp( argv[2] , "oem" , 3 )) { +					if( !strcmp( argv[2] , "oem")) {  						/* Expect IANA number next */  						if( argc <= 3 ) {  							lprintf(LOG_ERR, "oem iana <record> <format> [<args>]"); @@ -3532,8 +3567,7 @@ ipmi_fru_edit_multirec(struct ipmi_intf * intf, uint8_t id ,  			i += h->len + sizeof (struct fru_multirec_header);  		} while (!(h->format & 0x80) && (error != 1)); -		free(fru_data); -		fru_data = NULL; +		free_n(&fru_data);  	}  	return 0;  } @@ -3616,11 +3650,11 @@ ipmi_fru_get_multirec(struct ipmi_intf * intf, uint8_t id ,  	req.msg.data_len = 1;  	rsp = intf->sendrecv(intf, &req); -	if (rsp == NULL) { +	if (!rsp) {  		printf(" Device not present (No Response)\n");  		return -1;  	} -	if (rsp->ccode > 0) { +	if (rsp->ccode) {  		printf(" Device not present (%s)\n",  			val2str(rsp->ccode, completion_code_vals));  		return -1; @@ -3650,7 +3684,7 @@ ipmi_fru_get_multirec(struct ipmi_intf * intf, uint8_t id ,  		i = last_off = offset;  		fru_data = malloc(fru.size + 1); -		if (fru_data == NULL) { +		if (!fru_data) {  			lprintf(LOG_ERR, " Out of memory!");  			return -1;  		} @@ -3679,7 +3713,7 @@ ipmi_fru_get_multirec(struct ipmi_intf * intf, uint8_t id ,  				uint32_t suppliedIana = 0 ;  				/* Now makes sure this is really PICMG record */ -				if( !strncmp( argv[2] , "oem" , 3 )) { +				if( !strcmp( argv[2] , "oem")) {  					/* Expect IANA number next */  					if( argc <= 3 ) {  						lprintf(LOG_ERR, "oem iana <record> <format>"); @@ -3701,15 +3735,15 @@ ipmi_fru_get_multirec(struct ipmi_intf * intf, uint8_t id ,  				if( suppliedIana == iana ) {  					lprintf(LOG_DEBUG, "Matching record found" ); -				if( iana == IPMI_OEM_KONTRON ) { -						ipmi_fru_oemkontron_get( argc,argv,fru_data, -						i + sizeof(struct fru_multirec_header), -						h->len, h, oh ); +					if( iana == IPMI_OEM_KONTRON ) { +						ipmi_fru_oemkontron_get(argc, argv, fru_data, +									i + sizeof(struct fru_multirec_header), +									oh);  					}  					/* FIXME: Add OEM record support here */  					else{  						printf("  OEM IANA (%s) Record not supported in this mode\n", -															val2str( iana,  ipmi_oem_info)); +						       val2str( iana,  ipmi_oem_info));  						error = 1;  					}  				} @@ -3717,16 +3751,16 @@ ipmi_fru_get_multirec(struct ipmi_intf * intf, uint8_t id ,  			i += h->len + sizeof (struct fru_multirec_header);  		} while (!(h->format & 0x80) && (error != 1)); -		free(fru_data); -		fru_data = NULL; +		free_n(&fru_data);  	}  	return 0;  } -static int -ipmi_fru_upg_ekeying(struct ipmi_intf * intf, -			char * pFileName, -			uint8_t fruId) +#define ERR_EXIT do { rc = -1; goto exit; } while(0) + +static +int +ipmi_fru_upg_ekeying(struct ipmi_intf *intf, char *pFileName, uint8_t fruId)  {  	struct fru_info fruInfo = {0};  	uint8_t *buf = NULL; @@ -3734,59 +3768,50 @@ ipmi_fru_upg_ekeying(struct ipmi_intf * intf,  	uint32_t fruMultiRecSize = 0;  	uint32_t offFileMultiRec = 0;  	uint32_t fileMultiRecSize = 0; -	if (pFileName == NULL) { +	int rc = 0; + +	if (!pFileName) {  		lprintf(LOG_ERR, "File expected, but none given."); -		return (-1); +		ERR_EXIT;  	}  	if (ipmi_fru_get_multirec_location_from_fru(intf, fruId, &fruInfo,  							&offFruMultiRec, &fruMultiRecSize) != 0) {  		lprintf(LOG_ERR, "Failed to get multirec location from FRU."); -		return (-1); +		ERR_EXIT;  	}  	lprintf(LOG_DEBUG, "FRU Size        : %lu\n", fruMultiRecSize);  	lprintf(LOG_DEBUG, "Multi Rec offset: %lu\n", offFruMultiRec);  	if (ipmi_fru_get_multirec_size_from_file(pFileName, &fileMultiRecSize,  				&offFileMultiRec) != 0) {  		lprintf(LOG_ERR, "Failed to get multirec size from file '%s'.", pFileName); -		return (-1); +		ERR_EXIT;  	}  	buf = malloc(fileMultiRecSize); -	if (buf == NULL) { +	if (!buf) {  		lprintf(LOG_ERR, "ipmitool: malloc failure"); -		return (-1); +		ERR_EXIT;  	}  	if (ipmi_fru_get_multirec_from_file(pFileName, buf, fileMultiRecSize,  				offFileMultiRec) != 0) {  		lprintf(LOG_ERR, "Failed to get multirec from file '%s'.", pFileName); -		if (buf != NULL) { -			free(buf); -			buf = NULL; -		} -		return (-1); +		ERR_EXIT;  	}  	if (ipmi_fru_get_adjust_size_from_buffer(buf, &fileMultiRecSize) != 0) {  		lprintf(LOG_ERR, "Failed to adjust size from buffer."); -		if (buf != NULL) { -			free(buf); -			buf = NULL; -		} -		return (-1); +		ERR_EXIT;  	}  	if (write_fru_area(intf, &fruInfo, fruId, 0, offFruMultiRec,  				fileMultiRecSize, buf) != 0) {  		lprintf(LOG_ERR, "Failed to write FRU area."); -		if (buf != NULL) { -			free(buf); -			buf = NULL; -		} -		return (-1); -	} -	if (buf != NULL) { -		free(buf); -		buf = NULL; +		ERR_EXIT;  	} +  	lprintf(LOG_INFO, "Done upgrading Ekey."); -	return 0; + +exit: +	free_n(&buf); + +	return rc;  }  /* ipmi_fru_upgekey_help - print help text for 'upgEkey' @@ -3834,7 +3859,7 @@ ipmi_fru_get_multirec_size_from_file(char * pFileName,  		return -1;  	} -	/* Retreive length */ +	/* Retrieve length */  	if (((header.offset.internal * 8) > (header.offset.internal * 8)) &&  		((header.offset.internal * 8) < end))  		end = (header.offset.internal * 8); @@ -3882,7 +3907,7 @@ ipmi_fru_get_adjust_size_from_buffer(uint8_t * fru_data, uint32_t *pSize)  		}  		if (checksum != 0) {  			lprintf(LOG_ERR, "Bad checksum in Multi Records"); -			status = (-1); +			status = -1;  			if (verbose) {  				printf("--> FAIL");  			} @@ -3912,9 +3937,9 @@ ipmi_fru_get_multirec_from_file(char * pFileName, uint8_t * pBufArea,  {  	FILE * pFile;  	uint32_t len = 0; -	if (pFileName == NULL) { +	if (!pFileName) {  		lprintf(LOG_ERR, "Invalid file name given."); -		return (-1); +		return -1;  	}  	errno = 0; @@ -3922,21 +3947,21 @@ ipmi_fru_get_multirec_from_file(char * pFileName, uint8_t * pBufArea,  	if (!pFile) {  		lprintf(LOG_ERR, "Error opening file '%s': %i -> %s.", pFileName, errno,  				strerror(errno)); -		return (-1); +		return -1;  	}  	errno = 0;  	if (fseek(pFile, offset, SEEK_SET) != 0) {  		lprintf(LOG_ERR, "Failed to seek in file '%s': %i -> %s.", pFileName, errno,  				strerror(errno));  		fclose(pFile); -		return (-1); +		return -1;  	}  	len = fread(pBufArea, size, 1, pFile);  	fclose(pFile);  	if (len != 1) {  		lprintf(LOG_ERR, "Error in file '%s'.", pFileName); -		return (-1); +		return -1;  	}  	return 0;  } @@ -3971,8 +3996,8 @@ ipmi_fru_get_multirec_location_from_fru(struct ipmi_intf * intf,  		return -1;  	} -	if (rsp->ccode > 0) { -		if (rsp->ccode == 0xc3) +	if (rsp->ccode) { +		if (rsp->ccode == IPMI_CC_TIMEOUT)  			printf ("  Timeout accessing FRU info. (Device not present?)\n");  		else  			printf ("   CCODE = 0x%02x\n", rsp->ccode); @@ -4003,8 +4028,8 @@ ipmi_fru_get_multirec_location_from_fru(struct ipmi_intf * intf,  	if (!rsp)  		return -1; -	if (rsp->ccode > 0) { -		if (rsp->ccode == 0xc3) +	if (rsp->ccode) { +		if (rsp->ccode == IPMI_CC_TIMEOUT)  			printf ("  Timeout while reading FRU data. (Device not present?)\n");  		return -1;  	} @@ -4021,7 +4046,7 @@ ipmi_fru_get_multirec_location_from_fru(struct ipmi_intf * intf,  	end = pFruInfo->size; -	/* Retreive length */ +	/* Retrieve length */  	if (((header.offset.internal * 8) > (header.offset.internal * 8)) &&  		((header.offset.internal * 8) < end))  		end = (header.offset.internal * 8); @@ -4044,7 +4069,7 @@ ipmi_fru_get_multirec_location_from_fru(struct ipmi_intf * intf,  	return 0;  } -/* ipmi_fru_get_internal_use_offset -  Retreive internal use offset +/* ipmi_fru_get_internal_use_offset -  Retrieve internal use offset  *  * @intf:   ipmi interface  * @id:     fru id @@ -4085,17 +4110,16 @@ ipmi_fru_get_internal_use_info(  struct ipmi_intf * intf,  	req.msg.data_len = 1;  	rsp = intf->sendrecv(intf, &req); -	if (rsp == NULL) { +	if (!rsp) {  		printf(" Device not present (No Response)\n");  		return -1;  	} -	if (rsp->ccode > 0) { +	if (rsp->ccode) {  		printf(" Device not present (%s)\n",  			val2str(rsp->ccode, completion_code_vals));  		return -1;  	} -	memset(&fru, 0, sizeof(fru));  	fru->size = (rsp->data[1] << 8) | rsp->data[0];  	fru->access = rsp->data[2] & 0x1; @@ -4122,11 +4146,11 @@ ipmi_fru_get_internal_use_info(  struct ipmi_intf * intf,  	req.msg.data_len = 4;  	rsp = intf->sendrecv(intf, &req); -	if (rsp == NULL) { +	if (!rsp) {  		printf(" Device not present (No Response)\n");  		return 1;  	} -	if (rsp->ccode > 0) { +	if (rsp->ccode) {  		printf(" Device not present (%s)\n",  				val2str(rsp->ccode, completion_code_vals));  		return 1; @@ -4265,7 +4289,7 @@ ipmi_fru_read_internal_use(struct ipmi_intf * intf, uint8_t id, char * pFileName  			if(rc == 0)  			{ -				if(pFileName == NULL) +				if(!pFileName)  				{  					uint16_t counter;  					for(counter = 0; counter < size; counter ++) @@ -4287,8 +4311,7 @@ ipmi_fru_read_internal_use(struct ipmi_intf * intf, uint8_t id, char * pFileName  					else  					{  						lprintf(LOG_ERR, "Error opening file %s\n", pFileName); -						free(frubuf); -						frubuf = NULL; +						free_n(&frubuf);  						return -1;  					}  					fclose(pFile); @@ -4296,8 +4319,7 @@ ipmi_fru_read_internal_use(struct ipmi_intf * intf, uint8_t id, char * pFileName  			}  			printf("\n"); -			free(frubuf); -			frubuf = NULL; +			free_n(&frubuf);  		}  	} @@ -4340,7 +4362,7 @@ ipmi_fru_write_internal_use(struct ipmi_intf * intf, uint8_t id, char * pFileNam  		if(fp)  		{ -			/* Retreive file length, check if it's fits the Eeprom Size */ +			/* Retrieve file length, check if it's fits the Eeprom Size */  			fseek(fp, 0 ,SEEK_END);  			fileLength = ftell(fp); @@ -4380,8 +4402,7 @@ ipmi_fru_write_internal_use(struct ipmi_intf * intf, uint8_t id, char * pFileNam  					lprintf(LOG_ERR, "Unable to read file: %i\n", fru_read_size);  				} -				free(frubuf); -				frubuf = NULL; +				free_n(&frubuf);  			}  			fclose(fp);  			fp = NULL; @@ -4403,42 +4424,43 @@ ipmi_fru_main(struct ipmi_intf * intf, int argc, char ** argv)  	if (argc < 1) {  		rc = ipmi_fru_print_all(intf);  	} -	else if (strncmp(argv[0], "help", 4) == 0) { +	else if (!strcmp(argv[0], "help")) {  		ipmi_fru_help();  		return 0;  	} -	else if (strncmp(argv[0], "print", 5) == 0 || -		strncmp(argv[0], "list", 4) == 0) { +	else if (!strcmp(argv[0], "print") +	         || !strcmp(argv[0], "list")) +	{  		if (argc > 1) { -			if (strcmp(argv[1], "help") == 0) { +			if (!strcmp(argv[1], "help")) {  				lprintf(LOG_NOTICE, "fru print [fru id] - print information about FRU(s)");  				return 0;  			}  			if (is_fru_id(argv[1], &fru_id) != 0) -				return (-1); +				return -1;  			rc = __ipmi_fru_print(intf, fru_id);  		} else {  			rc = ipmi_fru_print_all(intf);  		}  	} -	else if (!strncmp(argv[0], "read", 5)) { -		if (argc > 1 && strcmp(argv[1], "help") == 0) { +	else if (!strcmp(argv[0], "read")) { +		if (argc > 1 && !strcmp(argv[1], "help")) {  			ipmi_fru_read_help();  			return 0;  		} else if (argc < 3) {  			lprintf(LOG_ERR, "Not enough parameters given.");  			ipmi_fru_read_help(); -			return (-1); +			return -1;  		}  		if (is_fru_id(argv[1], &fru_id) != 0) -			return (-1); +			return -1;  		/* There is a file name in the parameters */  		if (is_valid_filename(argv[2]) != 0) -				return (-1); +			return -1;  		if (verbose) {  			printf("FRU ID           : %d\n", fru_id); @@ -4447,22 +4469,22 @@ ipmi_fru_main(struct ipmi_intf * intf, int argc, char ** argv)  		/* TODO - rc is missing */  		ipmi_fru_read_to_bin(intf, argv[2], fru_id);  	} -	else if (!strncmp(argv[0], "write", 5)) { -		if (argc > 1 && strcmp(argv[1], "help") == 0) { +	else if (!strcmp(argv[0], "write")) { +		if (argc > 1 && !strcmp(argv[1], "help")) {  			ipmi_fru_write_help();  			return 0;  		} else if (argc < 3) {  			lprintf(LOG_ERR, "Not enough parameters given.");  			ipmi_fru_write_help(); -			return (-1); +			return -1;  		}  		if (is_fru_id(argv[1], &fru_id) != 0) -			return (-1); +			return -1;  		/* There is a file name in the parameters */  		if (is_valid_filename(argv[2]) != 0) -				return (-1); +			return -1;  		if (verbose) {  			printf("FRU ID           : %d\n", fru_id); @@ -4471,67 +4493,67 @@ ipmi_fru_main(struct ipmi_intf * intf, int argc, char ** argv)  		/* TODO - rc is missing */  		ipmi_fru_write_from_bin(intf, argv[2], fru_id);  	} -	else if (!strncmp(argv[0], "upgEkey", 7)) { -		if (argc > 1 && strcmp(argv[1], "help") == 0) { +	else if (!strcmp(argv[0], "upgEkey")) { +		if (argc > 1 && !strcmp(argv[1], "help")) {  			ipmi_fru_upgekey_help();  			return 0;  		} else if (argc < 3) {  			lprintf(LOG_ERR, "Not enough parameters given.");  			ipmi_fru_upgekey_help(); -			return (-1); +			return -1;  		}  		if (is_fru_id(argv[1], &fru_id) != 0) -			return (-1); +			return -1;  		/* There is a file name in the parameters */  		if (is_valid_filename(argv[2]) != 0) -				return (-1); +			return -1;  		rc = ipmi_fru_upg_ekeying(intf, argv[2], fru_id);  	} -	else if (!strncmp(argv[0], "internaluse", 11)) { -		if (argc > 1 && strcmp(argv[1], "help") == 0) { +	else if (!strcmp(argv[0], "internaluse")) { +		if (argc > 1 && !strcmp(argv[1], "help")) {  			ipmi_fru_internaluse_help();  			return 0;  		} -		if ( (argc >= 3) && (!strncmp(argv[2], "info", 4)) ) { +		if ( (argc >= 3) && (!strcmp(argv[2], "info")) ) {  			if (is_fru_id(argv[1], &fru_id) != 0) -				return (-1); +				return -1;  			rc = ipmi_fru_info_internal_use(intf, fru_id);  		} -		else if ( (argc >= 3) && (!strncmp(argv[2], "print", 5)) ) { +		else if ( (argc >= 3) && (!strcmp(argv[2], "print")) ) {  			if (is_fru_id(argv[1], &fru_id) != 0) -				return (-1); +				return -1;  			rc = ipmi_fru_read_internal_use(intf, fru_id, NULL);  		} -		else if ( (argc >= 4) && (!strncmp(argv[2], "read", 4)) ) { +		else if ( (argc >= 4) && (!strcmp(argv[2], "read")) ) {  			if (is_fru_id(argv[1], &fru_id) != 0) -				return (-1); +				return -1;  			/* There is a file name in the parameters */  			if (is_valid_filename(argv[3]) != 0) -					return (-1); +				return -1;  			lprintf(LOG_DEBUG, "FRU ID           : %d", fru_id);  			lprintf(LOG_DEBUG, "FRU File         : %s", argv[3]);  			rc = ipmi_fru_read_internal_use(intf, fru_id, argv[3]);  		} -		else if ( (argc >= 4) && (!strncmp(argv[2], "write", 5)) ) { +		else if ( (argc >= 4) && (!strcmp(argv[2], "write")) ) {  			if (is_fru_id(argv[1], &fru_id) != 0) -				return (-1); +				return -1;  			/* There is a file name in the parameters */  			if (is_valid_filename(argv[3]) != 0) -					return (-1); +				return -1;  			lprintf(LOG_DEBUG, "FRU ID           : %d", fru_id);  			lprintf(LOG_DEBUG, "FRU File         : %s", argv[3]); @@ -4541,22 +4563,22 @@ ipmi_fru_main(struct ipmi_intf * intf, int argc, char ** argv)  			lprintf(LOG_ERR,  					"Either unknown command or not enough parameters given.");  			ipmi_fru_internaluse_help(); -			return (-1); +			return -1;  		}  	} -	else if (!strncmp(argv[0], "edit", 4)) { -		if (argc > 1 && strcmp(argv[1], "help") == 0) { +	else if (!strcmp(argv[0], "edit")) { +		if (argc > 1 && !strcmp(argv[1], "help")) {  			ipmi_fru_edit_help();  			return 0;  		} else if (argc < 2) {  			lprintf(LOG_ERR, "Not enough parameters given.");  			ipmi_fru_edit_help(); -			return (-1); +			return -1;  		}  		if (argc >= 2) {  			if (is_fru_id(argv[1], &fru_id) != 0) -				return (-1); +				return -1;  			if (verbose) {  				printf("FRU ID           : %d\n", fru_id); @@ -4566,38 +4588,38 @@ ipmi_fru_main(struct ipmi_intf * intf, int argc, char ** argv)  		}  		if (argc >= 3) { -			if (!strncmp(argv[2], "field", 5)) { +			if (!strcmp(argv[2], "field")) {  				if (argc != 6) {  					lprintf(LOG_ERR, "Not enough parameters given.");  					ipmi_fru_edit_help(); -					return (-1); +					return -1;  				}  				rc = ipmi_fru_set_field_string(intf, fru_id, *argv[3], *argv[4],  						(char *) argv[5]); -			} else if (!strncmp(argv[2], "oem", 3)) { +			} else if (!strcmp(argv[2], "oem")) {  				rc = ipmi_fru_edit_multirec(intf, fru_id, argc, argv);  			} else {  				lprintf(LOG_ERR, "Invalid command: %s", argv[2]);  				ipmi_fru_edit_help(); -				return (-1); +				return -1;  			}  		} else {  			rc = ipmi_fru_edit_multirec(intf, fru_id, argc, argv);  		}  	} -	else if (!strncmp(argv[0], "get", 4)) { -		if (argc > 1 && (strncmp(argv[1], "help", 4) == 0)) { +	else if (!strcmp(argv[0], "get")) { +		if (argc > 1 && (!strcmp(argv[1], "help"))) {  			ipmi_fru_get_help();  			return 0;  		} else if (argc < 2) {  			lprintf(LOG_ERR, "Not enough parameters given.");  			ipmi_fru_get_help(); -			return (-1); +			return -1;  		}  		if (argc >= 2) {  			if (is_fru_id(argv[1], &fru_id) != 0) -				return (-1); +				return -1;  			if (verbose) {  				printf("FRU ID           : %d\n", fru_id); @@ -4607,12 +4629,12 @@ ipmi_fru_main(struct ipmi_intf * intf, int argc, char ** argv)  		}  		if (argc >= 3) { -			if (!strncmp(argv[2], "oem", 3)) { +			if (!strcmp(argv[2], "oem")) {  				rc = ipmi_fru_get_multirec(intf, fru_id, argc, argv);  			} else {  				lprintf(LOG_ERR, "Invalid command: %s", argv[2]);  				ipmi_fru_get_help(); -				return (-1); +				return -1;  			}  		} else {  			rc = ipmi_fru_get_multirec(intf, fru_id, argc, argv); @@ -4621,7 +4643,7 @@ ipmi_fru_main(struct ipmi_intf * intf, int argc, char ** argv)  	else {  		lprintf(LOG_ERR, "Invalid FRU command: %s", argv[0]);  		ipmi_fru_help(); -		return (-1); +		return -1;  	}  	return rc; @@ -4668,15 +4690,15 @@ f_type, uint8_t f_index, char *f_string)  	req.msg.data_len = 1;  	rsp = intf->sendrecv(intf, &req); -	if (rsp == NULL) { +	if (!rsp) {  		printf(" Device not present (No Response)\n"); -		rc = (-1); +		rc = -1;  		goto ipmi_fru_set_field_string_out;  	} -	if (rsp->ccode > 0) { +	if (rsp->ccode) {  		printf(" Device not present (%s)\n",  			val2str(rsp->ccode, completion_code_vals)); -		rc = (-1); +		rc = -1;  		goto ipmi_fru_set_field_string_out;  	} @@ -4686,7 +4708,7 @@ f_type, uint8_t f_index, char *f_string)  	if (fru.size < 1) {  		printf(" Invalid FRU size %d", fru.size); -		rc = (-1); +		rc = -1;  		goto ipmi_fru_set_field_string_out;  	}  	/* @@ -4704,17 +4726,17 @@ f_type, uint8_t f_index, char *f_string)  	req.msg.data_len = 4;  	rsp = intf->sendrecv(intf, &req); -	if (rsp == NULL) +	if (!rsp)  	{  		printf(" Device not present (No Response)\n"); -		rc = (-1); +		rc = -1;  		goto ipmi_fru_set_field_string_out;  	} -	if (rsp->ccode > 0) +	if (rsp->ccode)  	{  		printf(" Device not present (%s)\n",  				val2str(rsp->ccode, completion_code_vals)); -		rc = (-1); +		rc = -1;  		goto ipmi_fru_set_field_string_out;  	} @@ -4723,20 +4745,17 @@ f_type, uint8_t f_index, char *f_string)  	memcpy(&header, rsp->data + 1, 8); -	if (header.version != 1) -	{ +	if (header.version != 1) {  		printf(" Unknown FRU header version 0x%02x",  			header.version); -		rc = (-1); +		rc = -1;  		goto ipmi_fru_set_field_string_out;  	}  	fru_data = malloc( fru.size ); - -	if( fru_data == NULL ) -	{ +	if (!fru_data) {  		printf("Out of memory!\n"); -		rc = (-1); +		rc = -1;  		goto ipmi_fru_set_field_string_out;  	} @@ -4766,14 +4785,14 @@ f_type, uint8_t f_index, char *f_string)  	else  	{  		printf("Wrong field type."); -		rc = (-1); +		rc = -1;  		goto ipmi_fru_set_field_string_out;  	}  	memset(fru_data, 0, fru.size);  	if( read_fru_area(intf ,&fru, fruId, header_offset ,  					fru_section_len , fru_data) < 0 )  	{ -		rc = (-1); +		rc = -1;  		goto ipmi_fru_set_field_string_out;  	}  	/* Convert index from character to decimal */ @@ -4782,16 +4801,15 @@ f_type, uint8_t f_index, char *f_string)  	/*Seek to field index */  	for (i=0; i <= f_index; i++) {  		fru_field_offset_tmp = fru_field_offset; -		if (fru_area != NULL) { -			free(fru_area); -			fru_area = NULL; +		if (fru_area) { +			free_n(&fru_area);  		}  		fru_area = (uint8_t *) get_fru_area_str(fru_data, &fru_field_offset);  	} -	if( (fru_area == NULL )  || strlen((const char *)fru_area) == 0 ) { +	if (!FRU_FIELD_VALID(fru_area)) {  		printf("Field not found !\n"); -		rc = (-1); +		rc = -1;  		goto ipmi_fru_set_field_string_out;  	} @@ -4815,7 +4833,7 @@ f_type, uint8_t f_index, char *f_string)  				header_offset, fru_section_len, fru_data) < 0 )  		{  			printf("Write to FRU data failed.\n"); -			rc = (-1); +			rc = -1;  			goto ipmi_fru_set_field_string_out;  		}  	} @@ -4825,20 +4843,14 @@ f_type, uint8_t f_index, char *f_string)  				ipmi_fru_set_field_string_rebuild(intf,fruId,fru,header,f_type,f_index,f_string)  		)  		{ -			rc = (-1); +			rc = -1;  			goto ipmi_fru_set_field_string_out;  		}  	} -	ipmi_fru_set_field_string_out: -	if (fru_data != NULL) { -		free(fru_data); -		fru_data = NULL; -	} -	if (fru_area != NULL) { -		free(fru_area); -		fru_area = NULL; -	} +ipmi_fru_set_field_string_out: +	free_n(&fru_data); +	free_n(&fru_area);  	return rc;  } @@ -4894,10 +4906,9 @@ ipmi_fru_set_field_string_rebuild(struct ipmi_intf * intf, uint8_t fruId,  	fru_data_new = malloc( fru.size ); -	if( fru_data_old == NULL || fru_data_new == NULL ) -	{ +	if (!fru_data_old || !fru_data_new) {  		printf("Out of memory!\n"); -		rc = (-1); +		rc = -1;  		goto ipmi_fru_set_field_string_rebuild_out;  	} @@ -4952,7 +4963,7 @@ ipmi_fru_set_field_string_rebuild(struct ipmi_intf * intf, uint8_t fruId,  	else  	{  		printf("Wrong field type."); -		rc = (-1); +		rc = -1;  		goto ipmi_fru_set_field_string_rebuild_out;  	} @@ -4960,16 +4971,13 @@ ipmi_fru_set_field_string_rebuild(struct ipmi_intf * intf, uint8_t fruId,  	3) Seek to field index */  	for (i = 0;i <= f_index; i++) {  		fru_field_offset_tmp = fru_field_offset; -		if (fru_area != NULL) { -			free(fru_area); -			fru_area = NULL; -		} +		free_n(&fru_area);  		fru_area = (uint8_t *) get_fru_area_str(fru_data_old, &fru_field_offset);  	} -	if( (fru_area == NULL )  || strlen((const char *)fru_area) == 0 ) { +	if (!FRU_FIELD_VALID(fru_area)) {  		printf("Field not found (1)!\n"); -		rc = (-1); +		rc = -1;  		goto ipmi_fru_set_field_string_rebuild_out;  	} @@ -5142,7 +5150,7 @@ ipmi_fru_set_field_string_rebuild(struct ipmi_intf * intf, uint8_t fruId,  		*(fru_data_new + fru_field_offset_tmp) = (0xc0 + strlen(f_string));  		memcpy(fru_data_new + fru_field_offset_tmp + 1, f_string, strlen(f_string)); -		/* Copy remaing bytes in section */ +		/* Copy remaining bytes in section */  #ifdef DBG_RESIZE_FRU  		printf("Copying remaining of sections: %d \n",  		 (int)((fru_data_old + header_offset + fru_section_len - 1) - @@ -5178,7 +5186,7 @@ ipmi_fru_set_field_string_rebuild(struct ipmi_intf * intf, uint8_t fruId,  	else  	{  		printf( "Internal error, padding length %i (must be from 0 to 7) ", padding_len ); -		rc = (-1); +		rc = -1;  		goto ipmi_fru_set_field_string_rebuild_out;  	} @@ -5188,25 +5196,16 @@ ipmi_fru_set_field_string_rebuild(struct ipmi_intf * intf, uint8_t fruId,  	if( write_fru_area( intf, &fru, fruId, 0, 0, fru.size, fru_data_new ) < 0 )  	{  		printf("Write to FRU data failed.\n"); -		rc = (-1); +		rc = -1;  		goto ipmi_fru_set_field_string_rebuild_out;  	}  	printf("Done.\n"); -	ipmi_fru_set_field_string_rebuild_out: -	if (fru_area != NULL) { -		free(fru_area); -		fru_area = NULL; -	} -	if (fru_data_new != NULL) { -		free(fru_data_new); -		fru_data_new = NULL; -	} -	if (fru_data_old != NULL) { -		free(fru_data_old); -		fru_data_old = NULL; -	} +ipmi_fru_set_field_string_rebuild_out: +	free_n(&fru_area); +	free_n(&fru_data_new); +	free_n(&fru_data_old);  	return rc;  } | 
