Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ambrop72/badvpn.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authorambrop7 <ambrop7@1a93d707-3861-5ebc-ad3b-9740d49b5140>2011-01-29 20:53:51 +0300
committerambrop7 <ambrop7@1a93d707-3861-5ebc-ad3b-9740d49b5140>2011-01-29 20:53:51 +0300
commitddedcd863a8780cc3138a8aea7680cb7d7476111 (patch)
tree9b2e51f00bae9ddf9ca1231fae2a58fda61654fe /server
parent66d091fc2568a616815530e44da97765f2ffac54 (diff)
server: simplify managing the common name, avoid possible read of unititialized client ID in client_log() from client_init_io() before it is assigned
Diffstat (limited to 'server')
-rw-r--r--server/server.c58
-rw-r--r--server/server.h2
2 files changed, 24 insertions, 36 deletions
diff --git a/server/server.c b/server/server.c
index 4b27168..15a2599 100644
--- a/server/server.c
+++ b/server/server.c
@@ -838,8 +838,13 @@ void client_add (struct client_data *client)
{
ASSERT(clients_num < MAX_CLIENTS)
- // set state init (for client_log)
- client->initstatus = INITSTATUS_INIT;
+ // assign ID
+ client->id = new_client_id();
+
+ // set no common name
+ client->common_name = NULL;
+
+ // now client_log() works
if (options.ssl) {
// initialize SSL
@@ -849,23 +854,24 @@ void client_add (struct client_data *client)
// create SSL file descriptor from the socket's BSocketPRFileDesc
if (!(client->ssl_prfd = SSL_ImportFD(model_prfd, &client->bottom_prfd))) {
+ client_log(client, BLOG_ERROR, "SSL_ImportFD failed");
ASSERT_FORCE(PR_Close(&client->bottom_prfd) == PR_SUCCESS)
goto fail0;
}
// set server mode
if (SSL_ResetHandshake(client->ssl_prfd, PR_TRUE) != SECSuccess) {
- BLog(BLOG_ERROR, "SSL_ResetHandshake failed");
+ client_log(client, BLOG_ERROR, "SSL_ResetHandshake failed");
goto fail1;
}
// set require client certificate
if (SSL_OptionSet(client->ssl_prfd, SSL_REQUEST_CERTIFICATE, PR_TRUE) != SECSuccess) {
- BLog(BLOG_ERROR, "SSL_OptionSet(SSL_REQUEST_CERTIFICATE) failed");
+ client_log(client, BLOG_ERROR, "SSL_OptionSet(SSL_REQUEST_CERTIFICATE) failed");
goto fail1;
}
if (SSL_OptionSet(client->ssl_prfd, SSL_REQUIRE_CERTIFICATE, PR_TRUE) != SECSuccess) {
- BLog(BLOG_ERROR, "SSL_OptionSet(SSL_REQUIRE_CERTIFICATE) failed");
+ client_log(client, BLOG_ERROR, "SSL_OptionSet(SSL_REQUIRE_CERTIFICATE) failed");
goto fail1;
}
@@ -882,10 +888,6 @@ void client_add (struct client_data *client)
BTimer_Init(&client->disconnect_timer, CLIENT_NO_DATA_TIME_LIMIT, (BTimer_handler)client_disconnect_timer_handler, client);
BReactor_SetTimer(&ss, &client->disconnect_timer);
- // assign ID
- // must be done before linking
- client->id = new_client_id();
-
// link in
clients_num++;
LinkedList2_Append(&clients, &client->list_node);
@@ -1012,7 +1014,7 @@ void client_dealloc (struct client_data *client)
}
// free common name
- if (client->initstatus >= INITSTATUS_WAITHELLO && options.ssl) {
+ if (client->common_name) {
PORT_Free(client->common_name);
}
@@ -1054,7 +1056,7 @@ void client_log (struct client_data *client, int level, const char *fmt, ...)
char addr[BADDR_MAX_PRINT_LEN];
BAddr_Print(&client->addr, addr);
BLog_Append("client %d (%s)", (int)client->id, addr);
- if (client->initstatus >= INITSTATUS_WAITHELLO && options.ssl) {
+ if (client->common_name) {
BLog_Append(" (%s)", client->common_name);
}
BLog_Append(": ");
@@ -1099,6 +1101,12 @@ void client_try_handshake (struct client_data *client)
goto fail0;
}
+ // remember common name
+ if (!(client->common_name = CERT_GetCommonName(&cert->subject))) {
+ client_log(client, BLOG_NOTICE, "CERT_GetCommonName failed");
+ goto fail1;
+ }
+
// store certificate
SECItem der = cert->derCert;
if (der.len > sizeof(client->cert)) {
@@ -1129,15 +1137,9 @@ void client_try_handshake (struct client_data *client)
memcpy(client->cert_old, der.data, der.len);
client->cert_old_len = der.len;
- // remember common name
- if (!(client->common_name = CERT_GetCommonName(&cert->subject))) {
- client_log(client, BLOG_NOTICE, "CERT_GetCommonName failed");
- goto fail2;
- }
-
// init I/O chains
if (!client_init_io(client)) {
- goto fail3;
+ goto fail2;
}
PORT_FreeArena(arena, PR_FALSE);
@@ -1151,8 +1153,6 @@ void client_try_handshake (struct client_data *client)
return;
// handle errors
-fail3:
- PORT_Free(client->common_name);
fail2:
PORT_FreeArena(arena, PR_FALSE);
fail1:
@@ -1805,13 +1805,8 @@ int clients_allowed (struct client_data *client1, struct client_data *client2)
}
// set values to compare against
- if (!options.ssl) {
- comm_predicate_p1name = "";
- comm_predicate_p2name = "";
- } else {
- comm_predicate_p1name = client1->common_name;
- comm_predicate_p2name = client2->common_name;
- }
+ comm_predicate_p1name = (client1->common_name ? client1->common_name : "");
+ comm_predicate_p2name = (client2->common_name ? client2->common_name : "");
BAddr_GetIPAddr(&client1->addr, &comm_predicate_p1addr);
BAddr_GetIPAddr(&client2->addr, &comm_predicate_p2addr);
@@ -1871,13 +1866,8 @@ int relay_allowed (struct client_data *client, struct client_data *relay)
}
// set values to compare against
- if (!options.ssl) {
- relay_predicate_pname = "";
- relay_predicate_rname = "";
- } else {
- relay_predicate_pname = client->common_name;
- relay_predicate_rname = relay->common_name;
- }
+ relay_predicate_pname = (client->common_name ? client->common_name : "");
+ relay_predicate_rname = (relay->common_name ? relay->common_name : "");
BAddr_GetIPAddr(&client->addr, &relay_predicate_paddr);
BAddr_GetIPAddr(&relay->addr, &relay_predicate_raddr);
diff --git a/server/server.h b/server/server.h
index e8bf7ff..79581e7 100644
--- a/server/server.h
+++ b/server/server.h
@@ -55,8 +55,6 @@
#define MAX_LISTEN_ADDRS 16
-// initializing
-#define INITSTATUS_INIT 0
// performing SSL handshake
#define INITSTATUS_HANDSHAKE 1
// waiting for clienthello