Re: patch - fixing sample program in unix.7

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Alex, I tried to follow your instructions and applied your concept.
I hope it is ok now.
Cheers
PuLi


>From fca55af92ec1993823e70a4460a08197fa8da01a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=BCsp=C3=B6k=20Lili?= <poordirtylili@xxxxxxxxx>
Date: Wed, 6 Mar 2024 20:51:38 +0100
Subject: [PATCH] [patch] sample program in man7/unix.7

Signed-off-by: PuLi <poordirtylili@xxxxxxxxx>
Fixes: 15545eb6d7ae ("unix.7: Add example")
Cc: Heinrich Schuchardt <xypron.glpk@xxxxxx>

Client wants to send END while server already closed the connection
on DOWN, so connection is broken instead of the Result = 0 in the
sample on sending a single DOWN.
Now, the server disconnects only on first END. After DOWN, all further
processing of number stops.
Patch does not handle cases of double END sending, multiple clients
etc.
---
 man7/unix.7 | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/man7/unix.7 b/man7/unix.7
index cb1dcae45..2dc4f489e 100644
--- a/man7/unix.7
+++ b/man7/unix.7
@@ -1057,12 +1057,16 @@ main(int argc, char *argv[])
 \&
             if (!strncmp(buffer, "DOWN", sizeof(buffer))) {
                 down_flag = 1;
-                break;
+                continue;
             }
 \&
             if (!strncmp(buffer, "END", sizeof(buffer))) {
                 break;
             }
+\&
+            if (down_flag) {
+                continue;
+            }
 \&
             /* Add received summand. */
 \&
-- 
2.39.2

Alejandro Colomar <alx@xxxxxxxxxx> ezt írta (időpont: 2024. márc. 6.,
Sze, 13:19):
>
> [CC += Heinrich]
>
> Hi Lili,
>
> On Mon, Mar 04, 2024 at 05:41:17PM +0100, Lili Püspök wrote:
> > Hi Alejandro,
> > Thanks for replying.
> >
> > The client, after connecting, processes the argv items and sends all
> > of them, then issues the sending of a final END which, on the server
> > side, is not expected after DOWN which would halt the reading (In that
> > case, too, the processing of argv + the END should happen).
> > After the change,  DOWN does not break the reading, the closing END is
> > processed and there is no broken connection when client tries to send
> > END while the server closes after sending the result, which is not
> > received by the client.
>
> Hmmm, now I understand.
>
> >
> > --- without DOWN ----
> > client         server
> > argv1..N + END --->
> > <----- result
> > <---- connection closed
> >
> > -----------problem-----------
> > argv1...N + DOWN ->
> > <---- result
> > END -> ?????
> > <---- connection closed
> >
> > ------- solution:---------
> > argv1...N + DOWN + END ->
> > <---- result
> > <---- connection closed
>
> Yep, I can reproduce this problem all the way back to the original
> implementation of the example programs.  I extracted the original
> programs with:
>
>         $ git show 15545eb6d7:man7/unix.7 | man /dev/stdin | cat
>
> And then cut and paste to the C files.
>
>         $ cc -Wall -o server server.c
>         $ cc -Wall -o client client.c
>         $ ./server &
>         [1] 94644
>         $ ./client 3 4
>         Result = 7
>         $ ./client 11 -5
>         Result = 6
>         $ ./client DOWN
>         recv: Connection reset by peer
>         [1]+  Done                    ./server
>         $
>
> This behavior conflicts with the behavior shown in the manual page,
> which shows (for the last command):
>
>         $ ./client DOWN
>         Result = 0
>         [1]+  Done                    ./server
>
> So it seems like a bug.  Maybe the server program was slow enough when
> it was implemented in 2016, that the server hadn't closed the socket
> when the client sent "END", so the client didn't fail to read the
> result??
>
> Anyway, we need to fix it.  Agree.
>
> Please add
>
>         Fixes: 15545eb6d7ae ("unix.7: Add example")
>         Cc: Heinrich Schuchardt <xypron.glpk@xxxxxx>
>
> to the commit message, as well as a small description of the problem.
>
> > I hope I did not overlook something.
>
> However, I'm not convinced by your patch.  It seems to allow
>
>         $ ./client DOWN 4 3
>
> which I don't think we want to support.  I think we have two options:
>
> -  The client avoids sending "END" after "DOWN" (so DOWN implies END).
> -  The server only accepts "END" after "DOWN".
>
> Does it make sense to you?
>
> Have a lovely day!
> Alex
>
> > OK, maybe with a unique message containing only the DOWN from client,
> > the issue is not visible, because there is no result to return to
> > client and we don't care it the connection is just broken....
> >
> > Cheers
> > PuLi
> >
> > Alejandro Colomar <alx@xxxxxxxxxx> ezt írta (időpont: 2024. márc. 4., H, 17:22):
> > >
> > > Hi Lili,
> > >
> > > > Subject: Re: patch - fixing sample program in unix.7
> > >
> > > On Sun, Mar 03, 2024 at 08:27:17PM +0100, Lili Püspök wrote:
> > > > diff --git a/man7/unix.7 b/man7/unix.7
> > >
> > > Please add some commit message.  I don't understand what this patch
> > > does.  How is it broken, and how does it fix it?
> > >
> > > > index cb1dcae45..7fb41af99 100644
> > > > --- a/man7/unix.7
> > > > +++ b/man7/unix.7
> > > > @@ -1057,7 +1057,7 @@ main(int argc, char *argv[])
> > > > \&
> > > >             if (!strncmp(buffer, "DOWN", sizeof(buffer))) {
> > > >                 down_flag = 1;
> > > > -                break;
> > > > +                continue;
> > >
> > > DOWN is used to stop the server.  How would 'continue' help?
> > >
> > >
> > >         $ MANWIDTH=66 man unix | grep -C2 DOWN
> > >              tegers.  The client prints the sum and exits.   The  server
> > >              waits  for the next client to connect.  To stop the server,
> > >              the client is called with the command‐line argument "DOWN".
> > >
> > >              The following output was recorded while running the  server
> > >              in the background and repeatedly executing the client.  Ex‐
> > >              ecution  of  the  server  program ends when it receives the
> > >              "DOWN" command.
> > >
> > >            Example output
> > >         --
> > >                  $ ./client 11 -5
> > >                  Result = 6
> > >                  $ ./client DOWN
> > >                  Result = 0
> > >                  [1]+  Done                    ./server
> > >         --
> > >                          /* Handle commands. */
> > >
> > >                          if (!strncmp(buffer, "DOWN", sizeof(buffer))) {
> > >                              down_flag = 1;
> > >                              break;
> > >         --
> > >                      close(data_socket);
> > >
> > >                      /* Quit on DOWN command. */
> > >
> > >                      if (down_flag) {
> > >
> > > Have a lovely day,
> > > Alex
> > >
> > >
> > > >             }
> > > > \&
> > > >             if (!strncmp(buffer, "END", sizeof(buffer))) {
> > > >
> > >
> > > --
> > > <https://www.alejandro-colomar.es/>
> > > Looking for a remote C programming job at the moment.
>
> --
> <https://www.alejandro-colomar.es/>
> Looking for a remote C programming job at the moment.





[Index of Archives]     [Kernel Documentation]     [Netdev]     [Linux Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux