[master] 7ae60b722 Only do range processing when data present.

Poul-Henning Kamp phk at FreeBSD.org
Fri Apr 30 07:52:06 UTC 2021


commit 7ae60b722be2f810c1a701c1586605e6f9be1409
Author: Poul-Henning Kamp <phk at FreeBSD.org>
Date:   Fri Apr 30 07:51:15 2021 +0000

    Only do range processing when data present.
    
    Spotted by: ubsan

diff --git a/bin/varnishd/cache/cache_range.c b/bin/varnishd/cache/cache_range.c
index bbc40cb46..be2340a19 100644
--- a/bin/varnishd/cache/cache_range.c
+++ b/bin/varnishd/cache/cache_range.c
@@ -68,7 +68,7 @@ vrg_range_bytes(struct vdp_ctx *vdx, enum vdp_action act, void **priv,
     const void *ptr, ssize_t len)
 {
 	int retval = 0;
-	ssize_t l;
+	ssize_t l = 0;
 	const char *p = ptr;
 	struct vrg_priv *vrg_priv;
 
@@ -76,20 +76,23 @@ vrg_range_bytes(struct vdp_ctx *vdx, enum vdp_action act, void **priv,
 	AN(priv);
 	CAST_OBJ_NOTNULL(vrg_priv, *priv, VRG_PRIV_MAGIC);
 
-	l = vrg_priv->range_low - vrg_priv->range_off;
-	if (l > 0) {
+	if (ptr != NULL) {
+		l = vrg_priv->range_low - vrg_priv->range_off;
+		if (l > 0) {
+			if (l > len)
+				l = len;
+			vrg_priv->range_off += l;
+			p += l;
+			len -= l;
+		}
+		l = vrg_priv->range_high - vrg_priv->range_off;
 		if (l > len)
 			l = len;
-		vrg_priv->range_off += l;
-		p += l;
-		len -= l;
+		vrg_priv->range_off += len;
+		if (vrg_priv->range_off >= vrg_priv->range_high)
+			act = VDP_END;
 	}
-	l = vrg_priv->range_high - vrg_priv->range_off;
-	if (l > len)
-		l = len;
-	vrg_priv->range_off += len;
-	if (vrg_priv->range_off >= vrg_priv->range_high)
-		act = VDP_END;
+
 	if (l > 0)
 		retval = VDP_bytes(vdx, act, p, l);
 	else if (l == 0 && act > VDP_NULL)


More information about the varnish-commit mailing list