[master] 4ed6181f8 Fix a wrap-around issue in buffered VSLs

Dridi Boukelmoune dridi at varni.sh
Wed Nov 16 17:12:53 UTC 2022


On Wed, Nov 16, 2022 at 4:55 PM Poul-Henning Kamp <phk at freebsd.org> wrote:
>
>
> commit 4ed6181f8d505283c879d34ac9bcbdc07074cdd9
> Author: Poul-Henning Kamp <phk at FreeBSD.org>
> Date:   Wed Nov 16 16:53:57 2022 +0000
>
>     Fix a wrap-around issue in buffered VSLs
>
> diff --git a/bin/varnishd/cache/cache_shmlog.c b/bin/varnishd/cache/cache_shmlog.c
> index afb74535e..7a217d6f8 100644
> --- a/bin/varnishd/cache/cache_shmlog.c
> +++ b/bin/varnishd/cache/cache_shmlog.c
> @@ -151,6 +151,26 @@ vsl_hdr(enum VSL_tag_e tag, uint32_t *p, unsigned len, vxid_t vxid)
>         return (VSL_END(p, len));
>  }
>
> +/*--------------------------------------------------------------------
> + * Space available in a VSL buffer when accounting for overhead
> + */
> +
> +static unsigned
> +vsl_space(const struct vsl_log *vsl)

Maybe rename to vslb_space for consistency?

> +{
> +       ptrdiff_t mlen;
> +
> +       mlen = vsl->wle - vsl->wlp;
> +       assert(mlen >= 0);
> +       if (mlen < VSL_OVERHEAD + 1)
> +               return (0);
> +       mlen -= VSL_OVERHEAD;
> +       mlen *= sizeof *vsl->wlp;
> +       if (mlen > cache_param->vsl_reclen)
> +               mlen = cache_param->vsl_reclen;
> +       return(mlen);
> +}
> +
>  /*--------------------------------------------------------------------
>   * Wrap the VSL buffer
>   */
> @@ -353,7 +373,7 @@ vslb_get(struct vsl_log *vsl, enum VSL_tag_e tag, unsigned *length)
>
>         /* If it still doesn't fit, truncate */
>         if (VSL_END(vsl->wlp, mlen) > vsl->wle)
> -               mlen = ((char *)vsl->wle) - VSL_DATA(vsl->wlp);
> +               mlen = vsl_space(vsl);
>
>         vsl->wlp = vsl_hdr(tag, vsl->wlp, mlen, vsl->wid);
>         vsl->wlr++;
> @@ -448,7 +468,7 @@ VSLbv(struct vsl_log *vsl, enum VSL_tag_e tag, const char *fmt, va_list ap)
>
>         vsl_sanity(vsl);
>
> -       mlen = (char *)vsl->wle - VSL_DATA(vsl->wlp);
> +       mlen = vsl_space(vsl);
>
>         // First attempt, only if any space at all
>         if (mlen > 0) {
> @@ -458,11 +478,10 @@ VSLbv(struct vsl_log *vsl, enum VSL_tag_e tag, const char *fmt, va_list ap)
>                 va_end(ap2);
>         }
>
> -       // Second attempt after a flush
> -       if (mlen == 0 || n + 1 > mlen) {
> -               // Second attempt after a flush
> +       // Second attempt, if a flush might help
> +       if (mlen == 0 || (n + 1 > mlen && n + 1 <= cache_param->vsl_reclen)) {
>                 VSL_Flush(vsl, 1);
> -               mlen = (char *)vsl->wle - VSL_DATA(vsl->wlp);
> +               mlen = vsl_space(vsl);
>                 p = VSL_DATA(vsl->wlp);
>                 n = vsnprintf(p, mlen, fmt, ap);
>         }
> _______________________________________________
> varnish-commit mailing list
> varnish-commit at varnish-cache.org
> https://www.varnish-cache.org/lists/mailman/listinfo/varnish-commit


More information about the varnish-commit mailing list