[Spice-commits] Branch '0.8' - 2 commits - client/application.cpp server/reds.c

Alon Levy alon at kemper.freedesktop.org
Tue Mar 8 11:50:21 PST 2011


 client/application.cpp |    5 ++++-
 server/reds.c          |    8 ++++----
 2 files changed, 8 insertions(+), 5 deletions(-)

New commits:
commit 5315888a706e9eea30046139cb1054ae63e1cc0e
Author: Alon Levy <alevy at redhat.com>
Date:   Fri Mar 4 13:15:26 2011 +0200

    server/reds: allow call to reds_agent_remove even if it is gone
    
    The current assert(reds->agent_state.connected) tiggers if when
    the agent disconnected there was still data waiting to be sent (for
    instance if there is a bug in the client handling clipboard and it
    is killed while a large clipboard transfer is in progress). So first
    call to reds_agent_remove happens from spice_server_char_device_remove_interface,
    and then it is called again (triggering the assert) from free_item_data
    from read_from_vdi_port because of the channel destruction.
    
    Other option would be to not call it from one of the paths - but that
    is suboptimal:
     * if there is no data in the pipe, the second call never happens.
     * the second call has to be there anyway, because it may fail during
      parsing data from the agent.
    
    This patch fixes a segfault on this assert when a client starts passing
    from guest agent to client a large clipboard and dies in the middle. There
    is still another assert happening occasionally at marshaller which I don't
    have a fix for (but it doesn't seem to be related).

diff --git a/server/reds.c b/server/reds.c
index 7845ebe..508c8ff 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -1095,16 +1095,17 @@ static void reds_agent_remove()
     SpiceCharDeviceInstance *sin = vdagent;
     SpiceCharDeviceInterface *sif;
 
+    if (!reds->agent_state.connected) {
+        return;
+    }
+    reds->agent_state.connected = 0;
     vdagent = NULL;
     reds_update_mouse_mode();
 
     if (!reds->peer || !sin) {
         return;
     }
-
-    ASSERT(reds->agent_state.connected)
     sif = SPICE_CONTAINEROF(sin->base.sif, SpiceCharDeviceInterface, base);
-    reds->agent_state.connected = 0;
     if (sif->state) {
         sif->state(sin, reds->agent_state.connected);
     }
@@ -1112,7 +1113,6 @@ static void reds_agent_remove()
     if (reds->mig_target) {
         return;
     }
-
     reds_reset_vdp();
     reds_send_agent_disconnected();
 }
commit e1ec222e8bdf4b02f511666656ce1d6bd60d0988
Author: Alon Levy <alevy at redhat.com>
Date:   Fri Mar 4 09:36:49 2011 +0200

    client/smartcard: handle the --smartcard-db option

diff --git a/client/application.cpp b/client/application.cpp
index ea88dc5..9257eb2 100644
--- a/client/application.cpp
+++ b/client/application.cpp
@@ -2271,7 +2271,7 @@ bool Application::process_cmd_line(int argc, char** argv, bool &full_screen)
     parser.add(SPICE_OPT_SMARTCARD_CERT, "smartcard-cert", "Use virtual reader+card with given cert(s)",
         "smartcard-cert", true);
     parser.set_multi(SPICE_OPT_SMARTCARD_CERT, ',');
-    parser.add(SPICE_OPT_SMARTCARD_DB, "smartcard-db", "Use given db for smartcard certs");
+    parser.add(SPICE_OPT_SMARTCARD_DB, "smartcard-db", "Use given db for smartcard certs", "smartcard-db", true);
 #endif
 
     for (int i = SPICE_CHANNEL_MAIN; i < SPICE_END_CHANNEL; i++) {
@@ -2395,6 +2395,9 @@ bool Application::process_cmd_line(int argc, char** argv, bool &full_screen)
                     _smartcard_options->certs.end(), std::string(val));
             } while ((val=parser.next_argument()));
             break;
+        case SPICE_OPT_SMARTCARD_DB:
+            _smartcard_options->dbname = val;
+            break;
 #endif
         case CmdLineParser::OPTION_HELP:
             parser.show_help();


More information about the Spice-commits mailing list