1. 程式人生 > >關於android版本spice協議tls端口鏈接方式的bug問題

關於android版本spice協議tls端口鏈接方式的bug問題

安全 版本 ssi andorid 成功 con private IO_error read

最近在搞了搞android版本的spice協議.在andorid-spice官方github代碼下載下來之後,編譯成功並且順利的運行在android系統上鏈接雲桌面的時候,在非安全端口的情況下可以成功的鏈接到虛擬雲桌面,但是非常非常讓人頭疼的是在tls端口下鏈接的時候總是鏈接不到雲桌面,並且後臺報了一堆ssl問題的錯誤.經過反復查找問題,原來這個問題是一個本來就存在的bug,是在ssl_read()函數執行的時候由於系統自身的某些原因導致有時候協議的數據是讀取不成功的,如果在這時候讓ssl_read()函數在讀取異常情況下等待後臺處理完之後再讀幾次就可以讀取正確的業務數據.具體修改方法如下:
1.找到spice-channel.c文件.
2.找到spice_channel_read_wire函數.
3.修改邏輯如下
static int spice_channel_read_wire(SpiceChannel channel, void data, size_t len)
{
SpiceChannelPrivate *c = channel->priv;
gssize ret;
GIOCondition cond;
int tmp_value_01;

cond = 0;

while (1) {

reread:
if (c->has_error) {
return 0; / has_error is set by disconnect(), return no error

/
}
if (c->tls) {
ret = SSL_read(c->ssl, data, len);
if (ret < 0) {
ret = SSL_get_error(c->ssl, ret);
if (ret == SSL_ERROR_WANT_READ)
cond |= G_IO_IN;
if (ret == SSL_ERROR_WANT_WRITE)
cond |= G_IO_OUT;
if(ret == SSL_ERROR_SYSCALL){
g_socket_condition_wait(c->sock, G_IO_OUT | G_IO_ERROR | G_IO_HUP, NULL, NULL);
continue;//goto reread;//
}
ret = -1;
}else{
//MC_DEBUG("66666666666666666666666666666 ret == %d ::%x",ret,c->ssl);
}
}

    if (ret == -1) {
        if (cond != 0) {
            g_socket_condition_wait(c->sock, G_IO_OUT | G_IO_ERROR | G_IO_HUP, NULL, NULL);
            continue;//goto reread;//
        } else {
            c->has_error = TRUE;
            return -errno;
        }
    }
    break;
}

if (ret == 0) {
    CHANNEL_DEBUG(channel, "Closing the connection: spice_channel_read() - ret=0");
    c->has_error = TRUE;
    return 0;
}

//MC_DEBUG("[123456] read_wire: ret = [%d] [%d]", ret, len);
return ret;

}

這是一個很全身疼的問題,在x86版本的spice-gtk代碼中就沒有這個ssl_read()的問題.

關於android版本spice協議tls端口鏈接方式的bug問題