diff --git a/src/encrypt.c b/src/encrypt.c index cc9bd8a8..d204f104 100644 --- a/src/encrypt.c +++ b/src/encrypt.c @@ -726,7 +726,8 @@ cipher_context_init(cipher_ctx_t *ctx, int method, int enc) FATAL("Cannot initialize PolarSSL cipher context"); } #elif defined(USE_CRYPTO_MBEDTLS) - ctx->evp = (cipher_evp_t *)ss_malloc(sizeof(cipher_evp_t)); + ctx->evp = ss_malloc(sizeof(cipher_evp_t)); + memset(ctx->evp, 0, sizeof(cipher_evp_t)); cipher_evp_t *evp = ctx->evp; if (cipher == NULL) { diff --git a/src/local.c b/src/local.c index bed60f14..a02e881d 100644 --- a/src/local.c +++ b/src/local.c @@ -907,6 +907,9 @@ new_remote(int fd, int timeout) remote->buf = ss_malloc(sizeof(buffer_t)); remote->recv_ctx = ss_malloc(sizeof(remote_ctx_t)); remote->send_ctx = ss_malloc(sizeof(remote_ctx_t)); + balloc(remote->buf, BUF_SIZE); + memset(remote->recv_ctx, 0, sizeof(remote_ctx_t)); + memset(remote->send_ctx, 0, sizeof(remote_ctx_t)); remote->recv_ctx->connected = 0; remote->send_ctx->connected = 0; remote->fd = fd; @@ -920,8 +923,6 @@ new_remote(int fd, int timeout) ev_timer_init(&remote->recv_ctx->watcher, remote_timeout_cb, timeout, timeout); - balloc(remote->buf, BUF_SIZE); - return remote; } @@ -964,6 +965,9 @@ new_server(int fd, int method) server->recv_ctx = ss_malloc(sizeof(server_ctx_t)); server->send_ctx = ss_malloc(sizeof(server_ctx_t)); server->buf = ss_malloc(sizeof(buffer_t)); + balloc(server->buf, BUF_SIZE); + memset(server->recv_ctx, 0, sizeof(server_ctx_t)); + memset(server->send_ctx, 0, sizeof(server_ctx_t)); server->stage = STAGE_INIT; server->recv_ctx->connected = 0; server->send_ctx->connected = 0; @@ -984,8 +988,6 @@ new_server(int fd, int method) ev_io_init(&server->recv_ctx->io, server_recv_cb, fd, EV_READ); ev_io_init(&server->send_ctx->io, server_send_cb, fd, EV_WRITE); - balloc(server->buf, BUF_SIZE); - cork_dllist_add(&connections, &server->entries); return server; @@ -1388,6 +1390,7 @@ main(int argc, char **argv) listen_ctx_t listen_ctx; listen_ctx.remote_num = remote_num; listen_ctx.remote_addr = ss_malloc(sizeof(struct sockaddr *) * remote_num); + memset(listen_ctx.remote_addr, 0, sizeof(struct sockaddr *) * remote_num); for (i = 0; i < remote_num; i++) { char *host = remote_addr[i].host; char *port = remote_addr[i].port == NULL ? remote_port : diff --git a/src/manager.c b/src/manager.c index 7c05674e..f76c4dda 100644 --- a/src/manager.c +++ b/src/manager.c @@ -98,7 +98,7 @@ build_config(char *prefix, struct server *server) char *path = NULL; int path_size = strlen(prefix) + strlen(server->port) + 20; - path = malloc(path_size); + path = ss_malloc(path_size); snprintf(path, path_size, "%s/.shadowsocks_%s.conf", prefix, server->port); FILE *f = fopen(path, "w+"); if (f == NULL) { @@ -243,7 +243,7 @@ get_server(char *buf, int len) return NULL; } - struct server *server = (struct server *)malloc(sizeof(struct server)); + struct server *server = ss_malloc(sizeof(struct server)); memset(server, 0, sizeof(struct server)); if (obj->type == json_object) { int i = 0; @@ -322,7 +322,7 @@ kill_server(char *prefix, char *pid_file) { char *path = NULL; int pid, path_size = strlen(prefix) + strlen(pid_file) + 2; - path = malloc(path_size); + path = ss_malloc(path_size); snprintf(path, path_size, "%s/%s", prefix, pid_file); FILE *f = fopen(path, "r"); if (f == NULL) { @@ -345,7 +345,7 @@ stop_server(char *prefix, char *port) { char *path = NULL; int pid, path_size = strlen(prefix) + strlen(port) + 20; - path = malloc(path_size); + path = ss_malloc(path_size); snprintf(path, path_size, "%s/.shadowsocks_%s.pid", prefix, port); FILE *f = fopen(path, "r"); if (f == NULL) { @@ -861,7 +861,7 @@ main(int argc, char **argv) struct passwd *pw = getpwuid(getuid()); const char *homedir = pw->pw_dir; working_dir_size = strlen(homedir) + 15; - working_dir = malloc(working_dir_size); + working_dir = ss_malloc(working_dir_size); snprintf(working_dir, working_dir_size, "%s/.shadowsocks", homedir); int err = mkdir(working_dir, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH); @@ -894,7 +894,8 @@ main(int argc, char **argv) if (conf != NULL) { for (i = 0; i < conf->port_password_num; i++) { - struct server *server = (struct server *)malloc(sizeof(struct server)); + struct server *server = ss_malloc(sizeof(struct server)); + memset(server, 0, sizeof(struct server)); strncpy(server->port, conf->port_password[i].port, 8); strncpy(server->password, conf->port_password[i].password, 128); add_server(&manager, server); diff --git a/src/redir.c b/src/redir.c index fdd7ce3b..eb8cb989 100644 --- a/src/redir.c +++ b/src/redir.c @@ -531,14 +531,15 @@ remote_send_cb(EV_P_ ev_io *w, int revents) static remote_t * new_remote(int fd, int timeout) { - remote_t *remote; - remote = ss_malloc(sizeof(remote_t)); - + remote_t *remote = ss_malloc(sizeof(remote_t)); memset(remote, 0, sizeof(remote_t)); remote->recv_ctx = ss_malloc(sizeof(remote_ctx_t)); remote->send_ctx = ss_malloc(sizeof(remote_ctx_t)); remote->buf = ss_malloc(sizeof(buffer_t)); + balloc(remote->buf, BUF_SIZE); + memset(remote->recv_ctx, 0, sizeof(remote_ctx_t)); + memset(remote->send_ctx, 0, sizeof(remote_ctx_t)); remote->fd = fd; remote->recv_ctx->remote = remote; remote->recv_ctx->connected = 0; @@ -552,8 +553,6 @@ new_remote(int fd, int timeout) ev_timer_init(&remote->recv_ctx->watcher, remote_timeout_cb, timeout, 0); - balloc(remote->buf, BUF_SIZE); - return remote; } @@ -590,12 +589,15 @@ close_and_free_remote(EV_P_ remote_t *remote) static server_t * new_server(int fd, int method) { - server_t *server; - server = ss_malloc(sizeof(server_t)); + server_t *server = ss_malloc(sizeof(server_t)); + memset(server, 0, sizeof(server_t)); server->recv_ctx = ss_malloc(sizeof(server_ctx_t)); server->send_ctx = ss_malloc(sizeof(server_ctx_t)); server->buf = ss_malloc(sizeof(buffer_t)); + balloc(server->buf, BUF_SIZE); + memset(server->recv_ctx, 0, sizeof(server_ctx_t)); + memset(server->send_ctx, 0, sizeof(server_ctx_t)); server->fd = fd; server->recv_ctx->server = server; server->recv_ctx->connected = 0; @@ -618,8 +620,6 @@ new_server(int fd, int method) ev_io_init(&server->recv_ctx->io, server_recv_cb, fd, EV_READ); ev_io_init(&server->send_ctx->io, server_send_cb, fd, EV_WRITE); - balloc(server->buf, BUF_SIZE); - return server; } @@ -981,6 +981,7 @@ main(int argc, char **argv) listen_ctx_t listen_ctx; listen_ctx.remote_num = remote_num; listen_ctx.remote_addr = ss_malloc(sizeof(struct sockaddr *) * remote_num); + memset(listen_ctx.remote_addr, 0, sizeof(struct sockaddr *) * remote_num); for (int i = 0; i < remote_num; i++) { char *host = remote_addr[i].host; char *port = remote_addr[i].port == NULL ? remote_port : diff --git a/src/resolv.c b/src/resolv.c index f580d06d..7c694c05 100644 --- a/src/resolv.c +++ b/src/resolv.c @@ -266,8 +266,8 @@ dns_query_v4_cb(struct dns_ctx *ctx, struct dns_rr_a4 *result, void *data) cb_data->responses = new_responses; for (int i = 0; i < result->dnsa4_nrr; i++) { - struct sockaddr_in *sa = - (struct sockaddr_in *)ss_malloc(sizeof(struct sockaddr_in)); + struct sockaddr_in *sa = ss_malloc(sizeof(struct sockaddr_in)); + memset(sa, 0, sizeof(struct sockaddr_in)); sa->sin_family = AF_INET; sa->sin_port = cb_data->port; sa->sin_addr = result->dnsa4_addr[i]; @@ -313,8 +313,8 @@ dns_query_v6_cb(struct dns_ctx *ctx, struct dns_rr_a6 *result, void *data) cb_data->responses = new_responses; for (int i = 0; i < result->dnsa6_nrr; i++) { - struct sockaddr_in6 *sa = - (struct sockaddr_in6 *)ss_malloc(sizeof(struct sockaddr_in6)); + struct sockaddr_in6 *sa = ss_malloc(sizeof(struct sockaddr_in6)); + memset(sa, 0, sizeof(struct sockaddr_in6)); sa->sin6_family = AF_INET6; sa->sin6_port = cb_data->port; sa->sin6_addr = result->dnsa6_addr[i]; diff --git a/src/server.c b/src/server.c index 726dd2cd..a850c7b0 100644 --- a/src/server.c +++ b/src/server.c @@ -969,7 +969,8 @@ server_recv_cb(EV_P_ ev_io *w, int revents) ev_io_start(EV_A_ & remote->send_ctx->io); } } else { - query_t *query = (query_t *)ss_malloc(sizeof(query_t)); + query_t *query = ss_malloc(sizeof(query_t)); + memset(query, 0, sizeof(query_t)); query->server = server; snprintf(query->hostname, 256, "%s", host); @@ -1311,12 +1312,15 @@ new_remote(int fd) remote_conn++; } - remote_t *remote; + remote_t *remote = ss_malloc(sizeof(remote_t)); + memset(remote, 0, sizeof(remote_t)); - remote = ss_malloc(sizeof(remote_t)); remote->recv_ctx = ss_malloc(sizeof(remote_ctx_t)); remote->send_ctx = ss_malloc(sizeof(remote_ctx_t)); remote->buf = ss_malloc(sizeof(buffer_t)); + balloc(remote->buf, BUF_SIZE); + memset(remote->recv_ctx, 0, sizeof(remote_ctx_t)); + memset(remote->send_ctx, 0, sizeof(remote_ctx_t)); remote->fd = fd; remote->recv_ctx->remote = remote; remote->recv_ctx->connected = 0; @@ -1327,8 +1331,6 @@ new_remote(int fd) ev_io_init(&remote->recv_ctx->io, remote_recv_cb, fd, EV_READ); ev_io_init(&remote->send_ctx->io, remote_send_cb, fd, EV_WRITE); - balloc(remote->buf, BUF_SIZE); - return remote; } @@ -1378,6 +1380,10 @@ new_server(int fd, listen_ctx_t *listener) server->send_ctx = ss_malloc(sizeof(server_ctx_t)); server->buf = ss_malloc(sizeof(buffer_t)); server->header_buf = ss_malloc(sizeof(buffer_t)); + memset(server->recv_ctx, 0, sizeof(server_ctx_t)); + memset(server->send_ctx, 0, sizeof(server_ctx_t)); + balloc(server->buf, BUF_SIZE); + balloc(server->header_buf, BUF_SIZE); server->fd = fd; server->recv_ctx->server = server; server->recv_ctx->connected = 0; @@ -1406,10 +1412,7 @@ new_server(int fd, listen_ctx_t *listener) ev_timer_init(&server->recv_ctx->watcher, server_timeout_cb, request_timeout, listener->timeout); - balloc(server->buf, BUF_SIZE); - balloc(server->header_buf, BUF_SIZE); - - server->chunk = (chunk_t *)malloc(sizeof(chunk_t)); + server->chunk = ss_malloc(sizeof(chunk_t)); memset(server->chunk, 0, sizeof(chunk_t)); server->chunk->buf = ss_malloc(sizeof(buffer_t)); memset(server->chunk->buf, 0, sizeof(buffer_t)); diff --git a/src/tunnel.c b/src/tunnel.c index c39d4227..4fb07710 100644 --- a/src/tunnel.c +++ b/src/tunnel.c @@ -502,14 +502,16 @@ remote_send_cb(EV_P_ ev_io *w, int revents) static remote_t * new_remote(int fd, int timeout) { - remote_t *remote; - remote = ss_malloc(sizeof(remote_t)); + remote_t *remote = ss_malloc(sizeof(remote_t)); memset(remote, 0, sizeof(remote_t)); remote->buf = ss_malloc(sizeof(buffer_t)); remote->recv_ctx = ss_malloc(sizeof(remote_ctx_t)); remote->send_ctx = ss_malloc(sizeof(remote_ctx_t)); + balloc(remote->buf, BUF_SIZE); + memset(remote->recv_ctx, 0, sizeof(remote_ctx_t)); + memset(remote->send_ctx, 0, sizeof(remote_ctx_t)); remote->fd = fd; remote->recv_ctx->remote = remote; remote->recv_ctx->connected = 0; @@ -521,8 +523,6 @@ new_remote(int fd, int timeout) ev_timer_init(&remote->send_ctx->watcher, remote_timeout_cb, min(MAX_CONNECT_TIMEOUT, timeout), 0); - balloc(remote->buf, BUF_SIZE); - return remote; } @@ -558,12 +558,15 @@ close_and_free_remote(EV_P_ remote_t *remote) static server_t * new_server(int fd, int method) { - server_t *server; + server_t *server = ss_malloc(sizeof(server_t)); + memset(server, 0, sizeof(server_t)); - server = ss_malloc(sizeof(server_t)); server->buf = ss_malloc(sizeof(buffer_t)); server->recv_ctx = ss_malloc(sizeof(server_ctx_t)); server->send_ctx = ss_malloc(sizeof(server_ctx_t)); + balloc(server->buf, BUF_SIZE); + memset(server->recv_ctx, 0, sizeof(server_ctx_t)); + memset(server->send_ctx, 0, sizeof(server_ctx_t)); server->fd = fd; server->recv_ctx->server = server; server->recv_ctx->connected = 0; @@ -580,8 +583,6 @@ new_server(int fd, int method) server->d_ctx = NULL; } - balloc(server->buf, BUF_SIZE); - ev_io_init(&server->recv_ctx->io, server_recv_cb, fd, EV_READ); ev_io_init(&server->send_ctx->io, server_send_cb, fd, EV_WRITE); @@ -984,6 +985,7 @@ main(int argc, char **argv) listen_ctx.tunnel_addr = tunnel_addr; listen_ctx.remote_num = remote_num; listen_ctx.remote_addr = ss_malloc(sizeof(struct sockaddr *) * remote_num); + memset(listen_ctx.remote_addr, 0, sizeof(struct sockaddr *) * remote_num); for (i = 0; i < remote_num; i++) { char *host = remote_addr[i].host; char *port = remote_addr[i].port == NULL ? remote_port :