check udp address, see #852

This commit is contained in:
Cloud Wu
2018-06-25 12:10:30 +08:00
parent 3a1556e1fd
commit a8e5c31381

View File

@@ -602,12 +602,26 @@ udp_socket_address(struct socket *s, const uint8_t udp_address[UDP_ADDRESS_SIZE]
return 0;
}
static void
drop_udp(struct socket_server *ss, struct socket *s, struct wb_list *list, struct write_buffer *tmp) {
s->wb_size -= tmp->sz;
list->head = tmp->next;
if (list->head == NULL)
list->tail = NULL;
write_buffer_free(ss,tmp);
}
static int
send_list_udp(struct socket_server *ss, struct socket *s, struct wb_list *list, struct socket_message *result) {
while (list->head) {
struct write_buffer * tmp = list->head;
union sockaddr_all sa;
socklen_t sasz = udp_socket_address(s, tmp->udp_address, &sa);
if (sasz == 0) {
fprintf(stderr, "socket-server : udp (%d) type mismatch.\n", s->id);
drop_udp(ss, s, list, tmp);
return -1;
}
int err = sendto(s->fd, tmp->ptr, tmp->sz, 0, &sa.s, sasz);
if (err < 0) {
switch(errno) {
@@ -616,16 +630,8 @@ send_list_udp(struct socket_server *ss, struct socket *s, struct wb_list *list,
return -1;
}
fprintf(stderr, "socket-server : udp (%d) sendto error %s.\n",s->id, strerror(errno));
drop_udp(ss, s, list, tmp);
return -1;
/* // ignore udp sendto error
result->opaque = s->opaque;
result->id = s->id;
result->ud = 0;
result->data = NULL;
return SOCKET_ERR;
*/
}
s->wb_size -= tmp->sz;
@@ -830,6 +836,12 @@ send_socket(struct socket_server *ss, struct request_send * request, struct sock
}
union sockaddr_all sa;
socklen_t sasz = udp_socket_address(s, udp_address, &sa);
if (sasz == 0) {
// udp type mismatch, just drop it.
fprintf(stderr, "socket-server: udp socket (%d) type mistach.\n", id);
so.free_func(request->buffer);
return -1;
}
int n = sendto(s->fd, so.buffer, so.sz, 0, &sa.s, sasz);
if (n != so.sz) {
append_sendbuffer_udp(ss,s,priority,request,udp_address);
@@ -1529,6 +1541,12 @@ socket_server_send(struct socket_server *ss, int id, const void * buffer, int sz
} else {
union sockaddr_all sa;
socklen_t sasz = udp_socket_address(s, s->p.udp_address, &sa);
if (sasz == 0) {
fprintf(stderr, "socket-server : udp (%d) type mismatch.\n", id);
socket_unlock(&l);
so.free_func((void *)buffer);
return -1;
}
n = sendto(s->fd, so.buffer, so.sz, 0, &sa.s, sasz);
}
if (n<0) {
@@ -1796,6 +1814,11 @@ socket_server_udp_send(struct socket_server *ss, int id, const struct socket_udp
send_object_init(ss, &so, (void *)buffer, sz);
union sockaddr_all sa;
socklen_t sasz = udp_socket_address(s, udp_address, &sa);
if (sasz == 0) {
socket_unlock(&l);
so.free_func((void *)buffer);
return -1;
}
int n = sendto(s->fd, so.buffer, so.sz, 0, &sa.s, sasz);
if (n >= 0) {
// sendto succ