[sslh] [PATCH 02/10] Let defer_write accumulate data

Yves Rutschle yves at naryves.com
Tue Sep 24 08:46:59 CEST 2013


Warning, morning coffee not yet digested, so I may be
missing things :-)

I have issues with this one. The intent of my code was:
- begin_defered_data contains malloced pointer to memory
  area, and doesn't move
- defered_data contains pointer to the beginning of data yet
  to be written
- defered_data_size contains number of bytes left to write

Hence, the flush_defered() function only works on
defered_data and defered_data_size, and we can simply free
begin_defered_data when we get to defered_data_szie == 0.
(In case you missed it, the whole defered_write system is
used in sslh-select when write() would block, not just at
connection start-up).

In your code, I don't think you can realloc on
q->defered_data, as this could have been changed by
flush_defer(), and I don't think you can use
defered_data_size, for the same reason (unless you want to
drop the head of the buffer if it happens to have been
written, but I think that will result in memcpy'ing the
left-over data every time).

On Mon, Sep 23, 2013 at 11:30:32PM +0100, ondra+sslh at mistotebe.net wrote:
> From: Ondrej Kuzník <ondra at mistotebe.net>
> 
> ---
>  common.c | 16 ++++++++++++----
>  1 file changed, 12 insertions(+), 4 deletions(-)
> 
> diff --git a/common.c b/common.c
> index f3bae27..708fc7c 100644
> --- a/common.c
> +++ b/common.c
> @@ -161,12 +161,20 @@ int connect_addr(struct addrinfo *addr, int fd_from, const char* cnx_name)
>  /* Store some data to write to the queue later */
>  int defer_write(struct queue *q, void* data, int data_size) 
>  {
> +    char *p;
>      if (verbose) 
>          fprintf(stderr, "**** writing defered on fd %d\n", q->fd);
> -    q->defered_data = malloc(data_size);
> -    q->begin_defered_data = q->defered_data;
> -    q->defered_data_size = data_size;
> -    memcpy(q->defered_data, data, data_size);
> +
> +    p = realloc(q->defered_data, q->defered_data_size + data_size);
> +    if (!p) {
> +        perror("realloc");
> +        exit(1);
> +    }
> +
> +    q->defered_data = q->begin_defered_data = p;
> +    p += q->defered_data_size;
> +    q->defered_data_size += data_size;
> +    memcpy(p, data, data_size);
>  
>      return 0;
>  }
> -- 
> 1.8.4.rc3
> 
> 
> _______________________________________________
> sslh mailing list
> sslh at rutschle.net
> http://rutschle.net/cgi-bin/mailman/listinfo/sslh



More information about the sslh mailing list