From 3d769ecd13942e78c6e4a7d81eb4fcc0a90a7bf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Sat, 25 Mar 2023 16:04:49 +0800 Subject: [PATCH] fix: md5 comparing --- crypto.h | 32 +++++++++++++++++++++----------- server.c | 11 ++++++++--- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/crypto.h b/crypto.h index 71ba0d0..3658639 100644 --- a/crypto.h +++ b/crypto.h @@ -37,17 +37,27 @@ static const uint32_t sumtable[0x10] = CRYPTO_SUMTABLE; static uint8_t seqs[THREADCNT]; // 消息序号 -static inline int is_md5_equal(uint8_t* digest, uint8_t* digest2) { - #ifdef CPUBIT64 - return (digest[0] == digest2[0]) && - (digest[1] == digest2[1]); - #else - return (digest[0] == digest2[0]) && - (digest[1] == digest2[1]) && - (digest[2] == digest2[2]) && - (digest[3] == digest2[3]); - #endif +#ifdef CPUBIT64 +static inline int is_md5_equal(uint64_t* digest, uint64_t* digest2) { + return (digest[0] == digest2[0]) && (digest[1] == digest2[1]); } +static inline int is_empty_md5(uint64_t* digest) { + return (digest[0] == (uint64_t)0) && (digest[1] == (uint64_t)0); +} +#else +static inline int is_md5_equal(uint32_t* digest, uint32_t* digest2) { + return (digest[0] == digest2[0]) && + (digest[1] == digest2[1]) && + (digest[2] == digest2[2]) && + (digest[3] == digest2[3]); +} +static inline int is_empty_md5(uint32_t* digest) { + return (digest[0] == (uint32_t)0) && + (digest[1] == (uint32_t)0) && + (digest[2] == (uint32_t)0) && + (digest[3] == (uint32_t)0); +} +#endif static void init_crypto() { srand(time(NULL)); @@ -173,7 +183,7 @@ static int cmdpacket_decrypt(cmdpacket_t p, int index, const char pwd[64]) { putchar('\n'); #endif - if(is_md5_equal((uint8_t*)datamd5, p->md5)) { + if(is_md5_equal((uint64_t*)datamd5, (uint64_t*)p->md5)) { seqs[index]++; memcpy(p->data, out, p->datalen); return 0; diff --git a/server.c b/server.c index 9493004..ddbb9f2 100644 --- a/server.c +++ b/server.c @@ -402,7 +402,10 @@ ERR_INSERT_ITEM: } static int s3_set_data(thread_timer_t *timer) { - if(!setdicts[timer->index].data[0]) return send_data(timer->accept_fd, timer->index, ACKERRO, "erro", 4); + if(is_empty_md5((uint64_t*)setdicts[timer->index].data)) { + puts("Set data error: key md5 is empty"); + return send_data(timer->accept_fd, timer->index, ACKERRO, "erro", 4); + } FILE *fp = open_dict(timer->index, 0); if(fp == NULL) return send_data(timer->accept_fd, timer->index, ACKERRO, "erro", 4); @@ -410,8 +413,10 @@ static int s3_set_data(thread_timer_t *timer) { #ifdef DEBUG printf("Set data size: %u\n", datasize); #endif - if(datasize <= 0 || datasize > sizeof(setdicts[timer->index].data)) + if(datasize <= 0 || datasize > sizeof(setdicts[timer->index].data)) { + puts("Set data error: invalid datasize"); return send_data(timer->accept_fd, timer->index, ACKERRO, "erro", 4); + } int r; pthread_cleanup_push((void*)&close_dict, (void*)(uintptr_t)timer->index); @@ -452,7 +457,7 @@ static int s3_set_data(thread_timer_t *timer) { memcpy(setdict->data, timer->dat, timer->numbytes); if(insert_item(fp, setdict, strlen(setdict->key)+1, datasize)) { - fprintf(stderr, "Error set data: dict[%s]=%s\n", setdict->key, timer->dat); + fprintf(stderr, "Error setting data: dict[%s]=%s\n", setdict->key, timer->dat); r = send_data(timer->accept_fd, timer->index, ACKERRO, "erro", 4); } else { printf("Set dict[%s]=%s\n", setdict->key, timer->dat);