Re: [Spice-devel] [PATCH] [vd_agent] close the file handler if file_size = 0

2014-08-11 Thread Christophe Fergeau
On Sat, Aug 09, 2014 at 06:40:22PM +0800, Cody Chan wrote:
 After dragging a zero-size file, then I open it in guest,
 I get a warning message box which says:
  the process cannot access the file because it is being used by another
 process.
 And I get to know the file is occupied by vdagent. Now we look back the
 process:
 
 a) When dragging a zero-size file, spice-gtk gets the name and size, then
 sends
 the message to vd_agent with VD_AGENT_FILE_XFER_START
 b) vd_agent receives and parsers the message, then gets file name and size,
 creates(open)
 the file and gets the handler, at last, sends
 VD_AGENT_FILE_XFER_STATUS_CAN_SEND_DATA
 c) spice-gtk receives the VD_AGENT_FILE_XFER_STATUS_CAN_SEND_DATA message,
 the sends data with VD_AGENT_FILE_XFER_DATA
 d) vd_agent receives and writes data to the file opened
 e) After finishing the writing, vd_agent closes the handler
 
 But in step c, we take a look the code:
 //spice-channel.c
 static void file_xfer_read_cb(...)
 {
 //...
 count = g_input_stream_read_finish(G_INPUT_STREAM(task-file_stream),
 res, error);
 if (count  0) {
 task-read_bytes += count;
 file_xfer_queue(task, count);
 file_xfer_flush_async(channel, task-cancellable,
   file_xfer_data_flushed_cb, task);
 task-pending = TRUE;
 } else if (error) {
 VDAgentFileXferStatusMessage msg = {
 .id = task-id,
 .result = VD_AGENT_FILE_XFER_STATUS_ERROR,
 };
 agent_msg_queue_many(task-channel, VD_AGENT_FILE_XFER_STATUS,
  msg, sizeof(msg), NULL);
 spice_channel_wakeup(SPICE_CHANNEL(task-channel), FALSE);
 file_xfer_completed(task, error);
 }
 }
 
 If count == 0, then it does nothing!
 Then vd_agent will receive nothing after opening a file, and always occupy
 the file.
 Here we close the file if file_size = 0, even though it doesn't make sense
 to send
 a zero-size file.

Ah, good catch, from a quick look it seems the linux agent does not
handle this case properly either. This can be fixed in both agents, or
alternatively, this can also be fixed in spice-gtk in file_xfer_read_cb
by sending a dummy empty data message when the file size is 0.
Fixing it in the agents is probably less convoluted.

 
 ​
 ---
  vdagent/file_xfer.cpp | 4 
  1 file changed, 4 insertions(+)
 
 diff --git a/vdagent/file_xfer.cpp b/vdagent/file_xfer.cpp
 index 34a9ee6..17d842e 100644
 --- a/vdagent/file_xfer.cpp
 +++ b/vdagent/file_xfer.cpp
 @@ -89,6 +89,10 @@ void FileXfer::handle_start(VDAgentFileXferStartMessage*
 start,
  vd_printf(failed creating %s %lu, file_path, GetLastError());
  return;
  }
 +if (file_size == 0){
 +CloseHandle(handle);
 +return;
 +}

The agent should probably return VD_AGENT_FILE_XFER_STATUS_SUCCESS in
this case to let the client know this is over.

Christophe


pgpJFyzAGCE8Y.pgp
Description: PGP signature
___
Spice-devel mailing list
Spice-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/spice-devel


Re: [Spice-devel] [PATCH] [vd_agent] close the file handler if file_size = 0

2014-08-11 Thread Cody Chan
On Mon, Aug 11, 2014 at 7:04 PM, Christophe Fergeau cferg...@redhat.com
wrote:

 On Sat, Aug 09, 2014 at 06:40:22PM +0800, Cody Chan wrote:
  After dragging a zero-size file, then I open it in guest,
  I get a warning message box which says:
   the process cannot access the file because it is being used by another
  process.
  And I get to know the file is occupied by vdagent. Now we look back the
  process:
 
  a) When dragging a zero-size file, spice-gtk gets the name and size, then
  sends
  the message to vd_agent with VD_AGENT_FILE_XFER_START
  b) vd_agent receives and parsers the message, then gets file name and
 size,
  creates(open)
  the file and gets the handler, at last, sends
  VD_AGENT_FILE_XFER_STATUS_CAN_SEND_DATA
  c) spice-gtk receives the VD_AGENT_FILE_XFER_STATUS_CAN_SEND_DATA
 message,
  the sends data with VD_AGENT_FILE_XFER_DATA
  d) vd_agent receives and writes data to the file opened
  e) After finishing the writing, vd_agent closes the handler
 
  But in step c, we take a look the code:
  //spice-channel.c
  static void file_xfer_read_cb(...)
  {
  //...
  count =
 g_input_stream_read_finish(G_INPUT_STREAM(task-file_stream),
  res, error);
  if (count  0) {
  task-read_bytes += count;
  file_xfer_queue(task, count);
  file_xfer_flush_async(channel, task-cancellable,
file_xfer_data_flushed_cb, task);
  task-pending = TRUE;
  } else if (error) {
  VDAgentFileXferStatusMessage msg = {
  .id = task-id,
  .result = VD_AGENT_FILE_XFER_STATUS_ERROR,
  };
  agent_msg_queue_many(task-channel, VD_AGENT_FILE_XFER_STATUS,
   msg, sizeof(msg), NULL);
  spice_channel_wakeup(SPICE_CHANNEL(task-channel), FALSE);
  file_xfer_completed(task, error);
  }
  }
 
  If count == 0, then it does nothing!
  Then vd_agent will receive nothing after opening a file, and always
 occupy
  the file.
  Here we close the file if file_size = 0, even though it doesn't make
 sense
  to send
  a zero-size file.

 Ah, good catch, from a quick look it seems the linux agent does not
 handle this case properly either. This can be fixed in both agents, or
 alternatively, this can also be fixed in spice-gtk in file_xfer_read_cb
 by sending a dummy empty data message when the file size is 0.
 Fixing it in the agents is probably less convoluted.


​As you've proposed​, I fix the bug in spice-gtk, and I'll send a new patch
after testing.


 
  ​
  ---
   vdagent/file_xfer.cpp | 4 
   1 file changed, 4 insertions(+)
 
  diff --git a/vdagent/file_xfer.cpp b/vdagent/file_xfer.cpp
  index 34a9ee6..17d842e 100644
  --- a/vdagent/file_xfer.cpp
  +++ b/vdagent/file_xfer.cpp
  @@ -89,6 +89,10 @@ void
 FileXfer::handle_start(VDAgentFileXferStartMessage*
  start,
   vd_printf(failed creating %s %lu, file_path, GetLastError());
   return;
   }
  +if (file_size == 0){
  +CloseHandle(handle);
  +return;
  +}

 The agent should probably return VD_AGENT_FILE_XFER_STATUS_SUCCESS in
 this case to let the client know this is over.

 Christophe




-- 
QSBDT0RFUiBGUk9NIFJJRVNUIE9GIENUU0VV
___
Spice-devel mailing list
Spice-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/spice-devel


[Spice-devel] [PATCH] [vd_agent] close the file handler if file_size = 0

2014-08-09 Thread Cody Chan
After dragging a zero-size file, then I open it in guest,
I get a warning message box which says:
 the process cannot access the file because it is being used by another
process.
And I get to know the file is occupied by vdagent. Now we look back the
process:

a) When dragging a zero-size file, spice-gtk gets the name and size, then
sends
the message to vd_agent with VD_AGENT_FILE_XFER_START
b) vd_agent receives and parsers the message, then gets file name and size,
creates(open)
the file and gets the handler, at last, sends
VD_AGENT_FILE_XFER_STATUS_CAN_SEND_DATA
c) spice-gtk receives the VD_AGENT_FILE_XFER_STATUS_CAN_SEND_DATA message,
the sends data with VD_AGENT_FILE_XFER_DATA
d) vd_agent receives and writes data to the file opened
e) After finishing the writing, vd_agent closes the handler

But in step c, we take a look the code:
//spice-channel.c
static void file_xfer_read_cb(...)
{
//...
count = g_input_stream_read_finish(G_INPUT_STREAM(task-file_stream),
res, error);
if (count  0) {
task-read_bytes += count;
file_xfer_queue(task, count);
file_xfer_flush_async(channel, task-cancellable,
  file_xfer_data_flushed_cb, task);
task-pending = TRUE;
} else if (error) {
VDAgentFileXferStatusMessage msg = {
.id = task-id,
.result = VD_AGENT_FILE_XFER_STATUS_ERROR,
};
agent_msg_queue_many(task-channel, VD_AGENT_FILE_XFER_STATUS,
 msg, sizeof(msg), NULL);
spice_channel_wakeup(SPICE_CHANNEL(task-channel), FALSE);
file_xfer_completed(task, error);
}
}

If count == 0, then it does nothing!
Then vd_agent will receive nothing after opening a file, and always occupy
the file.
Here we close the file if file_size = 0, even though it doesn't make sense
to send
a zero-size file.

​
---
 vdagent/file_xfer.cpp | 4 
 1 file changed, 4 insertions(+)

diff --git a/vdagent/file_xfer.cpp b/vdagent/file_xfer.cpp
index 34a9ee6..17d842e 100644
--- a/vdagent/file_xfer.cpp
+++ b/vdagent/file_xfer.cpp
@@ -89,6 +89,10 @@ void FileXfer::handle_start(VDAgentFileXferStartMessage*
start,
 vd_printf(failed creating %s %lu, file_path, GetLastError());
 return;
 }
+if (file_size == 0){
+CloseHandle(handle);
+return;
+}
 task = new FileXferTask(handle, file_size, file_path);
 _tasks[start-id] = task;
 status-result = VD_AGENT_FILE_XFER_STATUS_CAN_SEND_DATA;
--
1.9.3

-- 
QSBDT0RFUiBGUk9NIFJJRVNUIE9GIENUU0VV
___
Spice-devel mailing list
Spice-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/spice-devel