diff --git a/src/syncterm/ssh.c b/src/syncterm/ssh.c index e2be607e3863c19ab846fe1dbc4f998059c11b3f..0fa6f3d804cac6f725516b2ac00cbf0df4a58273 100644 --- a/src/syncterm/ssh.c +++ b/src/syncterm/ssh.c @@ -67,27 +67,27 @@ void ssh_input_thread(void *args) } if(rd == 0) continue; - while(rd) { - pthread_mutex_lock(&ssh_mutex); - status=cl.PopData(ssh_session, conn_api.rd_buf, conn_api.rd_buf_size, &rd); - pthread_mutex_unlock(&ssh_mutex); - if(cryptStatusError(status)) { - if(status==CRYPT_ERROR_COMPLETE || status == CRYPT_ERROR_READ) { /* connection closed */ - ssh_active=FALSE; - break; - } - cryptlib_error_message(status, "recieving data"); + + pthread_mutex_lock(&ssh_mutex); + status=cl.PopData(ssh_session, conn_api.rd_buf, conn_api.rd_buf_size, &rd); + pthread_mutex_unlock(&ssh_mutex); + + if(cryptStatusError(status)) { + if(status==CRYPT_ERROR_COMPLETE || status == CRYPT_ERROR_READ) { /* connection closed */ ssh_active=FALSE; break; } - else { - buffered=0; - while(buffered < rd) { - pthread_mutex_lock(&(conn_inbuf.mutex)); - buffer=conn_buf_wait_free(&conn_inbuf, rd-buffered, 100); - buffered+=conn_buf_put(&conn_inbuf, conn_api.rd_buf+buffered, buffer); - pthread_mutex_unlock(&(conn_inbuf.mutex)); - } + cryptlib_error_message(status, "recieving data"); + ssh_active=FALSE; + break; + } + else { + buffered=0; + while(buffered < rd) { + pthread_mutex_lock(&(conn_inbuf.mutex)); + buffer=conn_buf_wait_free(&conn_inbuf, rd-buffered, 100); + buffered+=conn_buf_put(&conn_inbuf, conn_api.rd_buf+buffered, buffer); + pthread_mutex_unlock(&(conn_inbuf.mutex)); } } } @@ -278,6 +278,18 @@ int ssh_connect(struct bbslist *bbs) ssh_active=TRUE; uifc.pop(NULL); + /* Clear ownership */ + uifc.pop(NULL); + uifc.pop("Clearing Ownership"); + status=cl.SetAttribute(ssh_session, CRYPT_PROPERTY_OWNER, CRYPT_UNUSED); + if(cryptStatusError(status)) { + cryptlib_error_message(status, "clearing session ownership"); + conn_api.terminate=1; + uifc.pop(NULL); + return(-1); + } + uifc.pop(NULL); + create_conn_buf(&conn_inbuf, BUFFER_SIZE); create_conn_buf(&conn_outbuf, BUFFER_SIZE); conn_api.rd_buf=(unsigned char *)malloc(BUFFER_SIZE);