0
0
mirror of https://github.com/darkk/redsocks.git synced 2025-08-27 20:25:30 +00:00

Replace inconsistent rand()/random() with call to libevent2 rng

This commit is contained in:
Leonid Evdokimov 2016-03-08 20:53:19 +03:00
parent 24a5384e29
commit 14ff78dfe7
7 changed files with 13 additions and 15 deletions

View File

@ -210,8 +210,7 @@ static struct evbuffer *httpc_mkconnect(redsocks_client *client)
/* prepare an random string for cnounce */
char cnounce[17];
snprintf(cnounce, sizeof(cnounce), "%04x%04x%04x%04x",
rand() & 0xffff, rand() & 0xffff, rand() & 0xffff, rand() & 0xffff);
snprintf(cnounce, sizeof(cnounce), "%08x%08x", red_randui32(), red_randui32());
auth_string = digest_authentication_encode(auth->last_auth_query + 7, //line
client->instance->config.login, client->instance->config.password, //user, pass

View File

@ -320,8 +320,7 @@ static void httpr_relay_write_cb(struct bufferevent *buffev, void *_arg)
/* prepare an random string for cnounce */
char cnounce[17];
snprintf(cnounce, sizeof(cnounce), "%04x%04x%04x%04x",
rand() & 0xffff, rand() & 0xffff, rand() & 0xffff, rand() & 0xffff);
snprintf(cnounce, sizeof(cnounce), "%08x%08x", red_randui32(), red_randui32());
auth_string = digest_authentication_encode(auth->last_auth_query + 7, //line
client->instance->config.login, client->instance->config.password, //user, pass

10
main.c
View File

@ -48,14 +48,6 @@ static void terminate(int sig, short what, void *_arg)
log_error(LOG_WARNING, "event_loopbreak");
}
static void red_srand()
{
struct timeval tv;
gettimeofday(&tv, NULL);
// using tv_usec is a bit less predictable than tv_sec
srand(tv.tv_sec*1000000+tv.tv_usec);
}
int main(int argc, char **argv)
{
int error;
@ -66,7 +58,7 @@ int main(int argc, char **argv)
int opt;
int i;
red_srand();
evutil_secure_rng_init();
while ((opt = getopt(argc, argv, "h?vtc:p:")) != -1) {
switch (opt) {
case 't':

View File

@ -319,7 +319,7 @@ static int vp_in_addr(parser_context *context, void *addr, const char *token)
struct sockaddr_in *resolved_addr;
for (iter = ainfo, count = 0; iter; iter = iter->ai_next, ++count)
;
taken = rand() % count;
taken = red_randui32() % count;
for (iter = ainfo; taken > 0; iter = iter->ai_next, --taken)
;
resolved_addr = (struct sockaddr_in*)iter->ai_addr;

View File

@ -634,7 +634,7 @@ static void redsocks_accept_client(int fd, short what, void *_arg)
if (errno == ENFILE || errno == EMFILE || errno == ENOBUFS || errno == ENOMEM) {
self->accept_backoff_ms = (self->accept_backoff_ms << 1) + 1;
clamp_value(self->accept_backoff_ms, self->config.min_backoff_ms, self->config.max_backoff_ms);
int delay = (random() % self->accept_backoff_ms) + 1;
int delay = (red_randui32() % self->accept_backoff_ms) + 1;
log_errno(LOG_WARNING, "accept: out of file descriptors, backing off for %u ms", delay);
struct timeval tvdelay = { delay / 1000, (delay % 1000) * 1000 };
if (tracked_event_del(&self->listener) != 0)

View File

@ -90,6 +90,13 @@ int red_recv_udp_pkt(int fd, char *buf, size_t buflen, struct sockaddr_in *inadd
return pktlen;
}
uint32_t red_randui32()
{
uint32_t ret;
evutil_secure_rng_get_bytes(&ret, sizeof(ret));
return ret;
}
time_t redsocks_time(time_t *t)
{
time_t retval;

View File

@ -47,6 +47,7 @@ struct sockaddr_in;
} while (0)
uint32_t red_randui32();
time_t redsocks_time(time_t *t);
char *redsocks_evbuffer_readline(struct evbuffer *buf);
struct bufferevent* red_connect_relay(struct sockaddr_in *addr, evbuffercb writecb, everrorcb errorcb, void *cbarg);