Memory leak and id stealing fixes.

pull/211/merge
Roger A. Light 11 years ago
parent e3bf10cd9a
commit 43b1ea8050

@ -220,7 +220,7 @@ int mqtt3_handle_connect(struct mosquitto_db *db, struct mosquitto *context)
if(db->config->clientid_prefixes){
if(strncmp(db->config->clientid_prefixes, client_id, strlen(db->config->clientid_prefixes))){
_mosquitto_send_connack(context, 0, CONNACK_REFUSED_NOT_AUTHORIZED);
rc = MOSQ_ERR_SUCCESS;
rc = 1;
goto handle_connect_error;
}
}
@ -314,7 +314,7 @@ int mqtt3_handle_connect(struct mosquitto_db *db, struct mosquitto *context)
if(context->listener && context->listener->ssl_ctx && context->listener->use_identity_as_username){
if(!context->ssl){
_mosquitto_send_connack(context, 0, CONNACK_REFUSED_BAD_USERNAME_PASSWORD);
rc = MOSQ_ERR_SUCCESS;
rc = 1;
goto handle_connect_error;
}
#ifdef REAL_WITH_TLS_PSK
@ -322,7 +322,7 @@ int mqtt3_handle_connect(struct mosquitto_db *db, struct mosquitto *context)
/* Client should have provided an identity to get this far. */
if(!context->username){
_mosquitto_send_connack(context, 0, CONNACK_REFUSED_BAD_USERNAME_PASSWORD);
rc = MOSQ_ERR_SUCCESS;
rc = 1;
goto handle_connect_error;
}
}else{
@ -330,26 +330,26 @@ int mqtt3_handle_connect(struct mosquitto_db *db, struct mosquitto *context)
client_cert = SSL_get_peer_certificate(context->ssl);
if(!client_cert){
_mosquitto_send_connack(context, 0, CONNACK_REFUSED_BAD_USERNAME_PASSWORD);
rc = MOSQ_ERR_SUCCESS;
rc = 1;
goto handle_connect_error;
}
name = X509_get_subject_name(client_cert);
if(!name){
_mosquitto_send_connack(context, 0, CONNACK_REFUSED_BAD_USERNAME_PASSWORD);
rc = MOSQ_ERR_SUCCESS;
rc = 1;
goto handle_connect_error;
}
i = X509_NAME_get_index_by_NID(name, NID_commonName, -1);
if(i == -1){
_mosquitto_send_connack(context, 0, CONNACK_REFUSED_BAD_USERNAME_PASSWORD);
rc = MOSQ_ERR_SUCCESS;
rc = 1;
goto handle_connect_error;
}
name_entry = X509_NAME_get_entry(name, i);
context->username = _mosquitto_strdup((char *)ASN1_STRING_data(name_entry->value));
if(!context->username){
rc = MOSQ_ERR_SUCCESS;
rc = 1;
goto handle_connect_error;
}
X509_free(client_cert);
@ -365,14 +365,14 @@ int mqtt3_handle_connect(struct mosquitto_db *db, struct mosquitto *context)
case MOSQ_ERR_SUCCESS:
break;
case MOSQ_ERR_AUTH:
_mosquitto_send_connack(context, CONNACK_REFUSED_BAD_USERNAME_PASSWORD);
_mosquitto_send_connack(context, 0, CONNACK_REFUSED_BAD_USERNAME_PASSWORD);
mqtt3_context_disconnect(db, context);
rc = MOSQ_ERR_SUCCESS;
rc = 1;
goto handle_connect_error;
break;
default:
mqtt3_context_disconnect(db, context);
rc = MOSQ_ERR_SUCCESS;
rc = 1;
goto handle_connect_error;
break;
}
@ -384,7 +384,7 @@ int mqtt3_handle_connect(struct mosquitto_db *db, struct mosquitto *context)
if(!username_flag && db->config->allow_anonymous == false){
_mosquitto_send_connack(context, 0, CONNACK_REFUSED_NOT_AUTHORIZED);
rc = MOSQ_ERR_SUCCESS;
rc = 1;
goto handle_connect_error;
}
#ifdef WITH_TLS
@ -401,7 +401,7 @@ int mqtt3_handle_connect(struct mosquitto_db *db, struct mosquitto *context)
}
}else{
_mosquitto_send_connack(context, 0, CONNACK_REFUSED_NOT_AUTHORIZED);
rc = MOSQ_ERR_SUCCESS;
rc = 1;
goto handle_connect_error;
}
}
@ -432,6 +432,8 @@ int mqtt3_handle_connect(struct mosquitto_db *db, struct mosquitto *context)
found_context->state = mosq_cs_disconnecting;
HASH_DELETE(hh_id, db->contexts_by_id, found_context);
_mosquitto_free(found_context->id);
found_context->id = NULL;
#ifdef WITH_WEBSOCKETS
if(found_context->wsi){
@ -439,9 +441,11 @@ int mqtt3_handle_connect(struct mosquitto_db *db, struct mosquitto *context)
found_context->sock = INVALID_SOCKET;
}else
#endif
if(found_context->sock != INVALID_SOCKET){
HASH_DELETE(hh_sock, db->contexts_by_sock, context);
found_context->sock = INVALID_SOCKET;
{
if(found_context->sock != INVALID_SOCKET){
HASH_DELETE(hh_sock, db->contexts_by_sock, found_context);
}
mosquitto__add_context_to_disused(db, found_context);
}
if(found_context->msgs){

Loading…
Cancel
Save