/* * out_get_checksum -- return checksum string with result */ const char * out_get_checksum(void *addr, size_t len, uint64_t *csump) { static char str_buff[STR_MAX] = {0, }; int ret = 0; /* * The memory range can be mapped with PROT_READ, so allocate a new * buffer for the checksum and calculate there. */ void *buf = Malloc(len); if (buf == NULL) { ret = snprintf(str_buff, STR_MAX, "failed"); if (ret < 0 || ret >= STR_MAX) return ""; return str_buff; } memcpy(buf, addr, len); uint64_t *ncsump = (uint64_t *) ((char *)buf + ((char *)csump - (char *)addr)); uint64_t csum = *csump; /* validate checksum and get correct one */ int valid = util_validate_checksum(buf, len, ncsump); if (valid) ret = snprintf(str_buff, STR_MAX, "0x%" PRIx64" [OK]", le64toh(csum)); else ret = snprintf(str_buff, STR_MAX, "0x%" PRIx64 " [wrong! should be: 0x%" PRIx64 "]", le64toh(csum), le64toh(*ncsump)); Free(buf); if (ret < 0 || ret >= STR_MAX) return ""; return str_buff; }
/* * out_get_checksum -- return checksum string with result */ const char * out_get_checksum(void *addr, size_t len, uint64_t *csump) { static char str_buff[STR_MAX] = {0, }; uint64_t csum = *csump; /* validate checksum and get correct one */ int valid = util_validate_checksum(addr, len, csump); if (valid) snprintf(str_buff, STR_MAX, "0x%08x [OK]", (uint32_t)csum); else snprintf(str_buff, STR_MAX, "0x%08x [wrong! should be: 0x%08x]", (uint32_t)csum, (uint32_t)*csump); /* restore original checksum */ *csump = csum; return str_buff; }