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:
parent
24a5384e29
commit
14ff78dfe7
@ -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
|
||||
|
@ -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
10
main.c
@ -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':
|
||||
|
2
parser.c
2
parser.c
@ -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;
|
||||
|
@ -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)
|
||||
|
7
utils.c
7
utils.c
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user