Skip to content

Commit 5e204a8

Browse files
committed
fix: sockaddr comparison issue
1 parent 41f679e commit 5e204a8

3 files changed

Lines changed: 25 additions & 3 deletions

File tree

base/hsocket.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,26 @@ const char* sockaddr_str(sockaddr_u* addr, char* buf, int len) {
170170
return buf;
171171
}
172172

173+
int sockaddr_compare(const sockaddr_u* addr1, const sockaddr_u* addr2) {
174+
if (addr1->sa.sa_family != addr2->sa.sa_family)
175+
return addr1->sa.sa_family - addr2->sa.sa_family;
176+
if (addr1->sa.sa_family == AF_INET) {
177+
if (addr1->sin.sin_family != addr2->sin.sin_family)
178+
return addr1->sin.sin_family - addr2->sin.sin_family;
179+
if (addr1->sin.sin_port != addr2->sin.sin_port)
180+
return addr1->sin.sin_port - addr2->sin.sin_port;
181+
return memcmp(&addr1->sin.sin_addr, &addr2->sin.sin_addr, sizeof(struct in_addr));
182+
}
183+
else if (addr1->sa.sa_family == AF_INET6) {
184+
if (addr1->sin6.sin6_family != addr2->sin6.sin6_family)
185+
return addr1->sin6.sin6_family - addr2->sin6.sin6_family;
186+
if (addr1->sin6.sin6_port != addr2->sin6.sin6_port)
187+
return addr1->sin6.sin6_port - addr2->sin6.sin6_port;
188+
return memcmp(&addr1->sin6.sin6_addr, &addr2->sin6.sin6_addr, sizeof(struct in_addr));
189+
}
190+
return memcmp(addr1, addr2, sizeof(sockaddr_u));
191+
}
192+
173193
static int sockaddr_bind(sockaddr_u* localaddr, int type) {
174194
// socket -> setsockopt -> bind
175195
#ifdef SOCK_CLOEXEC

base/hsocket.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ HV_EXPORT void sockaddr_set_port(sockaddr_u* addr, int port);
121121
HV_EXPORT int sockaddr_set_ipport(sockaddr_u* addr, const char* host, int port);
122122
HV_EXPORT socklen_t sockaddr_len(sockaddr_u* addr);
123123
HV_EXPORT const char* sockaddr_str(sockaddr_u* addr, char* buf, int len);
124+
HV_EXPORT int sockaddr_compare(const sockaddr_u* addr1, const sockaddr_u* addr2);
124125

125126
//#define INET_ADDRSTRLEN 16
126127
//#define INET6_ADDRSTRLEN 46

event/rudp.c

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#if WITH_RUDP
44

55
#include "hevent.h"
6+
#include "hsocket.h"
67

78
void rudp_entry_free(rudp_entry_t* entry) {
89
#if WITH_KCP
@@ -38,7 +39,7 @@ bool rudp_insert(rudp_t* rudp, rudp_entry_t* entry) {
3839
while (*n) {
3940
parent = *n;
4041
e = rb_entry(*n, rudp_entry_t, rb_node);
41-
cmp = memcmp(&entry->addr, &e->addr, sizeof(sockaddr_u));
42+
cmp = sockaddr_compare(&entry->addr, &e->addr);
4243
if (cmp < 0) {
4344
n = &(*n)->rb_left;
4445
} else if (cmp > 0) {
@@ -63,7 +64,7 @@ rudp_entry_t* rudp_search(rudp_t* rudp, struct sockaddr* addr) {
6364
bool exists = false;
6465
while (n) {
6566
e = rb_entry(n, rudp_entry_t, rb_node);
66-
cmp = memcmp(addr, &e->addr, sizeof(sockaddr_u));
67+
cmp = sockaddr_compare((sockaddr_u*)addr, &e->addr);
6768
if (cmp < 0) {
6869
n = n->rb_left;
6970
} else if (cmp > 0) {
@@ -99,7 +100,7 @@ rudp_entry_t* rudp_get(rudp_t* rudp, struct sockaddr* addr) {
99100
while (*n) {
100101
parent = *n;
101102
e = rb_entry(*n, rudp_entry_t, rb_node);
102-
cmp = memcmp(addr, &e->addr, sizeof(sockaddr_u));
103+
cmp = sockaddr_compare((sockaddr_u*)addr, &e->addr);
103104
if (cmp < 0) {
104105
n = &(*n)->rb_left;
105106
} else if (cmp > 0) {

0 commit comments

Comments
 (0)