qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] qemu-char: Fix missed data on unix socket
@ 2015-07-13  8:13 pyssling
  2015-07-13 10:15 ` Paolo Bonzini
  0 siblings, 1 reply; 8+ messages in thread
From: pyssling @ 2015-07-13  8:13 UTC (permalink / raw)
  To: qemu-devel, Paolo Bonzini; +Cc: Nils Carlson

From: Nils Carlson <pyssling@ludd.ltu.se>

Commit 812c1057 introduced HUP detection on unix and tcp sockets prior
to a read in tcp_chr_read. This unfortunately broke CloudStack 4.2
which relied on the old behaviour where data on a socket was readable
even if a HUP was present.

On Linux a working solution seems to be to simply check the HUP after
reading available data, while keeping the original behaviour for windows.

There is then a divergence in behaviour for the two platforms, but this
seems better than breaking a whole software stack.

Signed-off-by: Nils Carlson <pyssling@ludd.ltu.se>
---
 qemu-char.c |    4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/qemu-char.c b/qemu-char.c
index 617e034..cfd9b70 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -2847,11 +2847,13 @@ static gboolean tcp_chr_read(GIOChannel *chan, GIOCondition cond, void *opaque)
     uint8_t buf[READ_BUF_LEN];
     int len, size;
 
+#ifdef _WIN32
     if (cond & G_IO_HUP) {
         /* connection closed */
         tcp_chr_disconnect(chr);
         return TRUE;
     }
+#endif
 
     if (!s->connected || s->max_size <= 0) {
         return TRUE;
@@ -2860,7 +2862,7 @@ static gboolean tcp_chr_read(GIOChannel *chan, GIOCondition cond, void *opaque)
     if (len > s->max_size)
         len = s->max_size;
     size = tcp_chr_recv(chr, (void *)buf, len);
-    if (size == 0) {
+    if (size == 0 || (size < 0 && cond & G_IO_HUP)) {
         /* connection closed */
         tcp_chr_disconnect(chr);
     } else if (size > 0) {
-- 
1.7.10.4

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH] qemu-char: Fix missed data on unix socket
  2015-07-13  8:13 [Qemu-devel] [PATCH] qemu-char: Fix missed data on unix socket pyssling
@ 2015-07-13 10:15 ` Paolo Bonzini
  2015-07-13 10:41   ` Amit Shah
  0 siblings, 1 reply; 8+ messages in thread
From: Paolo Bonzini @ 2015-07-13 10:15 UTC (permalink / raw)
  To: pyssling, qemu-devel



On 13/07/2015 10:13, pyssling@ludd.ltu.se wrote:
> Commit 812c1057 introduced HUP detection on unix and tcp sockets prior
> to a read in tcp_chr_read. This unfortunately broke CloudStack 4.2
> which relied on the old behaviour where data on a socket was readable
> even if a HUP was present.
> 
> On Linux a working solution seems to be to simply check the HUP after
> reading available data, while keeping the original behaviour for windows.
> 
> There is then a divergence in behaviour for the two platforms, but this
> seems better than breaking a whole software stack.

There is no need to do something special on Windows, I think.  You can
unconditionally check G_IO_HUP after reading.  One nit:

> -    if (size == 0) {
> +    if (size == 0 || (size < 0 && cond & G_IO_HUP)) {

Please put (cond & G_IO_HUP) within parentheses.

Please

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH] qemu-char: Fix missed data on unix socket
  2015-07-13 10:15 ` Paolo Bonzini
@ 2015-07-13 10:41   ` Amit Shah
  2015-07-13 13:15     ` Nils Carlson
  0 siblings, 1 reply; 8+ messages in thread
From: Amit Shah @ 2015-07-13 10:41 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: liangshunbin, qemu-devel, pyssling

On (Mon) 13 Jul 2015 [12:15:22], Paolo Bonzini wrote:
> 
> 
> On 13/07/2015 10:13, pyssling@ludd.ltu.se wrote:
> > Commit 812c1057 introduced HUP detection on unix and tcp sockets prior
> > to a read in tcp_chr_read. This unfortunately broke CloudStack 4.2
> > which relied on the old behaviour where data on a socket was readable
> > even if a HUP was present.
> > 
> > On Linux a working solution seems to be to simply check the HUP after
> > reading available data, while keeping the original behaviour for windows.
> > 
> > There is then a divergence in behaviour for the two platforms, but this
> > seems better than breaking a whole software stack.
> 
> There is no need to do something special on Windows, I think.  You can
> unconditionally check G_IO_HUP after reading.  One nit:
> 
> > -    if (size == 0) {
> > +    if (size == 0 || (size < 0 && cond & G_IO_HUP)) {
> 
> Please put (cond & G_IO_HUP) within parentheses.

Also, returning TRUE there isn't right - if the connection ends, we
should return FALSE.


		Amit

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH] qemu-char: Fix missed data on unix socket
  2015-07-13 10:41   ` Amit Shah
@ 2015-07-13 13:15     ` Nils Carlson
  2015-07-15 21:44       ` Nils Carlson
  0 siblings, 1 reply; 8+ messages in thread
From: Nils Carlson @ 2015-07-13 13:15 UTC (permalink / raw)
  To: Amit Shah; +Cc: Paolo Bonzini, liangshunbin, qemu-devel

On Mon, 13 Jul 2015, Amit Shah wrote:

> On (Mon) 13 Jul 2015 [12:15:22], Paolo Bonzini wrote:
>>
>>
>> On 13/07/2015 10:13, pyssling@ludd.ltu.se wrote:
>>> Commit 812c1057 introduced HUP detection on unix and tcp sockets prior
>>> to a read in tcp_chr_read. This unfortunately broke CloudStack 4.2
>>> which relied on the old behaviour where data on a socket was readable
>>> even if a HUP was present.
>>>
>>> On Linux a working solution seems to be to simply check the HUP after
>>> reading available data, while keeping the original behaviour for windows.
>>>
>>> There is then a divergence in behaviour for the two platforms, but this
>>> seems better than breaking a whole software stack.
>>
>> There is no need to do something special on Windows, I think.  You can
>> unconditionally check G_IO_HUP after reading.  One nit:
>>
>>> -    if (size == 0) {
>>> +    if (size == 0 || (size < 0 && cond & G_IO_HUP)) {
>>
>> Please put (cond & G_IO_HUP) within parentheses.
>
> Also, returning TRUE there isn't right - if the connection ends, we
> should return FALSE.

I agree that this seems reasonable. I will change it and re-test.

>
>
> 		Amit
>
>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH] qemu-char: Fix missed data on unix socket
  2015-07-13 13:15     ` Nils Carlson
@ 2015-07-15 21:44       ` Nils Carlson
  2015-07-16  6:24         ` Amit Shah
  0 siblings, 1 reply; 8+ messages in thread
From: Nils Carlson @ 2015-07-15 21:44 UTC (permalink / raw)
  To: Amit Shah; +Cc: Paolo Bonzini, liangshunbin, qemu-devel

On Mon, 13 Jul 2015, Nils Carlson wrote:

> On Mon, 13 Jul 2015, Amit Shah wrote:

<snip>

>> Also, returning TRUE there isn't right - if the connection ends, we
>> should return FALSE.
>
> I agree that this seems reasonable. I will change it and re-test.
>

I had a closer look, and it seems always returning true is intentional 
here, the called function, tcp_chr_disconnect(chr), handles the 
deregistration from handlers. If we were to return FALSE we would be 
duplicating work and possibly breaking things.

Nils

>> 
>>
>> 		Amit
>> 
>> 
>
>

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH] qemu-char: Fix missed data on unix socket
  2015-07-15 21:44       ` Nils Carlson
@ 2015-07-16  6:24         ` Amit Shah
  2015-07-16  8:11           ` Nils Carlson
  0 siblings, 1 reply; 8+ messages in thread
From: Amit Shah @ 2015-07-16  6:24 UTC (permalink / raw)
  To: Nils Carlson; +Cc: Paolo Bonzini, liangshunbin, qemu-devel

On (Wed) 15 Jul 2015 [23:44:52], Nils Carlson wrote:
> On Mon, 13 Jul 2015, Nils Carlson wrote:
> 
> >On Mon, 13 Jul 2015, Amit Shah wrote:
> 
> <snip>
> 
> >>Also, returning TRUE there isn't right - if the connection ends, we
> >>should return FALSE.
> >
> >I agree that this seems reasonable. I will change it and re-test.
> >
> 
> I had a closer look, and it seems always returning true is intentional here,
> the called function, tcp_chr_disconnect(chr), handles the deregistration
> from handlers. If we were to return FALSE we would be duplicating work and
> possibly breaking things.

Not sure how.

Anyway, can you please start a new thread, with the author and
reviewers of the patch CC'ed, so they can chime in as well?

		Amit

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH] qemu-char: Fix missed data on unix socket
  2015-07-16  6:24         ` Amit Shah
@ 2015-07-16  8:11           ` Nils Carlson
  2015-07-16 11:19             ` Amit Shah
  0 siblings, 1 reply; 8+ messages in thread
From: Nils Carlson @ 2015-07-16  8:11 UTC (permalink / raw)
  To: Amit Shah; +Cc: Paolo Bonzini, liangshunbin, qemu-devel

On Thu, 16 Jul 2015, Amit Shah wrote:

> On (Wed) 15 Jul 2015 [23:44:52], Nils Carlson wrote:
>> On Mon, 13 Jul 2015, Nils Carlson wrote:
>>
>>> On Mon, 13 Jul 2015, Amit Shah wrote:
>>
>> <snip>
>>
>>>> Also, returning TRUE there isn't right - if the connection ends, we
>>>> should return FALSE.
>>>
>>> I agree that this seems reasonable. I will change it and re-test.
>>>
>>
>> I had a closer look, and it seems always returning true is intentional here,
>> the called function, tcp_chr_disconnect(chr), handles the deregistration
>> from handlers. If we were to return FALSE we would be duplicating work and
>> possibly breaking things.
>
> Not sure how.
>
> Anyway, can you please start a new thread, with the author and
> reviewers of the patch CC'ed, so they can chime in as well?

The authors and reviewers of which patch exactly?

The fix for windows which broke cloudstack was done in 812c1057.
The returning TRUE everywhere was done in commit cdbf6e16 by Paolo 
Bonzini, CC:d above.

I don't think there was anything wrong with either patch, the former one 
simply broken a strange behaviour CloudStack was relying on which I would 
say is dubious (fire and forget messaging.)

/Nils

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [Qemu-devel] [PATCH] qemu-char: Fix missed data on unix socket
  2015-07-16  8:11           ` Nils Carlson
@ 2015-07-16 11:19             ` Amit Shah
  0 siblings, 0 replies; 8+ messages in thread
From: Amit Shah @ 2015-07-16 11:19 UTC (permalink / raw)
  To: Nils Carlson; +Cc: Paolo Bonzini, liangshunbin, qemu-devel

On (Thu) 16 Jul 2015 [10:11:04], Nils Carlson wrote:
> On Thu, 16 Jul 2015, Amit Shah wrote:
> 
> >On (Wed) 15 Jul 2015 [23:44:52], Nils Carlson wrote:
> >>On Mon, 13 Jul 2015, Nils Carlson wrote:
> >>
> >>>On Mon, 13 Jul 2015, Amit Shah wrote:
> >>
> >><snip>
> >>
> >>>>Also, returning TRUE there isn't right - if the connection ends, we
> >>>>should return FALSE.
> >>>
> >>>I agree that this seems reasonable. I will change it and re-test.
> >>>
> >>
> >>I had a closer look, and it seems always returning true is intentional here,
> >>the called function, tcp_chr_disconnect(chr), handles the deregistration
> >>from handlers. If we were to return FALSE we would be duplicating work and
> >>possibly breaking things.
> >
> >Not sure how.
> >
> >Anyway, can you please start a new thread, with the author and
> >reviewers of the patch CC'ed, so they can chime in as well?
> 
> The authors and reviewers of which patch exactly?
> 
> The fix for windows which broke cloudstack was done in 812c1057.

Yea, the author of this patch.  Also, I meant the return TRUE in this
patch, not the one Paolo added.

> The returning TRUE everywhere was done in commit cdbf6e16 by Paolo Bonzini,
> CC:d above.
> 
> I don't think there was anything wrong with either patch, the former one
> simply broken a strange behaviour CloudStack was relying on which I would
> say is dubious (fire and forget messaging.)

There need not be anything wrong with a previous patch; but just
because someone touched the area recently, they might have more
context, and even help in spotting the bug.


		Amit

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2015-07-16 11:20 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-07-13  8:13 [Qemu-devel] [PATCH] qemu-char: Fix missed data on unix socket pyssling
2015-07-13 10:15 ` Paolo Bonzini
2015-07-13 10:41   ` Amit Shah
2015-07-13 13:15     ` Nils Carlson
2015-07-15 21:44       ` Nils Carlson
2015-07-16  6:24         ` Amit Shah
2015-07-16  8:11           ` Nils Carlson
2015-07-16 11:19             ` Amit Shah

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).