Hi!

Your version works for me.

Rivo

On 24/08/2017, 17:10, "Alexander Bluhm" <alexander.bl...@gmx.net> wrote:

    On Thu, Aug 24, 2017 at 12:44:27PM +0000, Rivo Nurges wrote:
    > This will fix my problem and regress still passes.
    
    Yes this also works for me.
    
    I think the variable name "dst" is not good.  Normally it refers
    to someting on the cre->dst side.  As the buffer is on our side, I
    think EVBUFFER_LENGTH(EVBUFFER_OUTPUT(bev)) is better.
    
    I was also wondering whether it is correct to skip the
    bufferevent_enable(cre->dst->bev, EV_READ) further down.  Would
    your current diff create pumped dataflow behavior as the output
    buffer must be completely empty before new data is read?
    
    The relay_splice() checks for the buffer length itself and disables
    reading if the buffers are not empty.  This does not work due to
    the bufferevent_enable(cre->dst->bev, EV_READ) which was added
    later.
    
    So I think the logic should look like this.  Does this work
    for you?
    
    bluhm
    
    Index: usr.sbin/relayd/relay.c
    ===================================================================
    RCS file: /data/mirror/openbsd/cvs/src/usr.sbin/relayd/relay.c,v
    retrieving revision 1.225
    diff -u -p -r1.225 relay.c
    --- usr.sbin/relayd/relay.c 9 Aug 2017 21:29:17 -0000       1.225
    +++ usr.sbin/relayd/relay.c 24 Aug 2017 14:02:38 -0000
    @@ -791,12 +791,12 @@ relay_write(struct bufferevent *bev, voi
     
        getmonotime(&con->se_tv_last);
     
    -   if (con->se_done)
    +   if (con->se_done && EVBUFFER_LENGTH(EVBUFFER_OUTPUT(bev)) == 0)
                goto done;
    -   if (relay_splice(cre->dst) == -1)
    -           goto fail;
        if (cre->dst->bev)
                bufferevent_enable(cre->dst->bev, EV_READ);
    +   if (relay_splice(cre->dst) == -1)
    +           goto fail;
     
        return;
      done:
    

Reply via email to