[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