Files
utun2/!/crc32.c
T
Evgeny d74f76a5a0 Fix: Resolved double free in timeout_heap_pop() and test_etcp_simple_traffic bind conflict
- Fixed incorrect init_connections() call in test_etcp_simple_traffic.c (was calling server_instance instead of client_instance)
- Fixed double free in timeout_heap_pop() when handling deleted elements
- Enhanced NULL pointer safety in uasync_print_resources() by removing complex heap manipulation
- Added debug logging to timeout_heap_pop() for better error tracking

Test results: test_etcp_simple_traffic now passes without double free errors
2026-01-25 10:47:02 +03:00

66 lines
1.6 KiB
C
Executable File

// crc32.c - CRC32 checksum implementation
#include "crc32.h"
#include <string.h>
static uint32_t crc32_table[256];
static int crc32_table_initialized = 0;
static void init_crc32_table(void) {
if (crc32_table_initialized) return;
for (uint32_t i = 0; i < 256; i++) {
uint32_t crc = i;
for (int j = 0; j < 8; j++) {
if (crc & 1) {
crc = (crc >> 1) ^ 0xEDB88320;
} else {
crc >>= 1;
}
}
crc32_table[i] = crc;
}
crc32_table_initialized = 1;
}
void crc32_init(void) {
init_crc32_table();
}
uint32_t crc32_calc(const uint8_t *data, size_t len) {
if (!crc32_table_initialized) {
init_crc32_table();
}
if (!data || len == 0) return 0xFFFFFFFF;
uint32_t crc = 0xFFFFFFFF;
for (size_t i = 0; i < len; i++) {
uint8_t byte = data[i];
uint32_t table_index = (crc ^ byte) & 0xFF;
crc = (crc >> 8) ^ crc32_table[table_index];
}
return ~crc;
}
uint32_t crc32_calc_ex(const uint8_t *data, size_t len, uint32_t initial_crc) {
if (!crc32_table_initialized) {
init_crc32_table();
}
if (!data || len == 0) return initial_crc;
uint32_t crc = initial_crc;
for (size_t i = 0; i < len; i++) {
uint8_t byte = data[i];
uint32_t table_index = (crc ^ byte) & 0xFF;
crc = (crc >> 8) ^ crc32_table[table_index];
}
return crc;
}
uint32_t crc32_update(uint32_t crc, const uint8_t *data, size_t len) {
return crc32_calc_ex(data, len, crc);
}