lwsl_err("No memory for websocket context\n");
return NULL;
}
+ memset(context, 0, sizeof(*context));
#ifndef LWS_NO_DAEMONIZE
context->started_with_parent = pid_daemon;
lwsl_notice(" Started with daemon pid %d\n", pid_daemon);
#else
context->fd_random = open(SYSTEM_RANDOM_FILEPATH, O_RDONLY);
if (context->fd_random < 0) {
- free(context);
lwsl_err("Unable to open random device %s %d\n",
SYSTEM_RANDOM_FILEPATH, context->fd_random);
- return NULL;
+ goto bail;
}
#endif
p = strchr(context->http_proxy_address, ':');
if (p == NULL) {
lwsl_err("http_proxy needs to be ads:port\n");
- return NULL;
+ goto bail;
}
*p = '\0';
context->http_proxy_port = atoi(p + 1);
if (ssl_cert_filepath != NULL &&
ssl_private_key_filepath != NULL) {
lwsl_notice(" Not compiled for OpenSSl support!\n");
- return NULL;
+ goto bail;
}
lwsl_notice(" Compiled without SSL support, "
"serving unencrypted\n");
if (!method) {
lwsl_err("problem creating ssl method: %s\n",
ERR_error_string(ERR_get_error(), ssl_err_buf));
- return NULL;
+ goto bail;
}
context->ssl_ctx = SSL_CTX_new(method); /* create context */
if (!context->ssl_ctx) {
lwsl_err("problem creating ssl context: %s\n",
ERR_error_string(ERR_get_error(), ssl_err_buf));
- return NULL;
+ goto bail;
}
#ifdef SSL_OP_NO_COMPRESSION
if (!method) {
lwsl_err("problem creating ssl method: %s\n",
ERR_error_string(ERR_get_error(), ssl_err_buf));
- return NULL;
+ goto bail;
}
/* create context */
context->ssl_client_ctx = SSL_CTX_new(method);
if (!context->ssl_client_ctx) {
lwsl_err("problem creating ssl context: %s\n",
ERR_error_string(ERR_get_error(), ssl_err_buf));
- return NULL;
+ goto bail;
}
#ifdef SSL_OP_NO_COMPRESSION
lwsl_err("problem getting cert '%s': %s\n",
ssl_cert_filepath,
ERR_error_string(ERR_get_error(), ssl_err_buf));
- return NULL;
+ goto bail;
}
/* set the private key from KeyFile */
if (SSL_CTX_use_PrivateKey_file(context->ssl_ctx,
lwsl_err("ssl problem getting key '%s': %s\n",
ssl_private_key_filepath,
ERR_error_string(ERR_get_error(), ssl_err_buf));
- return NULL;
+ goto bail;
}
/* verify private key */
if (!SSL_CTX_check_private_key(context->ssl_ctx)) {
lwsl_err("Private SSL key doesn't match cert\n");
- return NULL;
+ goto bail;
}
/* SSL is happy and has a cert it's content with */
/* selftest */
if (lws_b64_selftest())
- return NULL;
+ goto bail;
#ifndef LWS_NO_SERVER
/* set up our external listening socket we serve on */
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0) {
lwsl_err("ERROR opening socket\n");
- return NULL;
+ goto bail;
}
#ifndef WIN32
lwsl_err("ERROR on binding to port %d (%d %d)\n",
port, n, errno);
close(sockfd);
- return NULL;
+ goto bail;
}
wsi = (struct libwebsocket *)malloc(sizeof(struct libwebsocket));
if (wsi == NULL) {
lwsl_err("Out of mem\n");
close(sockfd);
- return NULL;
+ goto bail;
}
memset(wsi, 0, sizeof (struct libwebsocket));
wsi->sock = sockfd;
}
#endif
return context;
+
+bail:
+ libwebsocket_context_destroy(context);
+ return NULL;
}
/**