[master] 5bc20e62f cache_http1_line: Flexelint: signedness polish and other minor improvements
Nils Goroll
nils.goroll at uplex.de
Mon Nov 25 14:43:03 UTC 2024
commit 5bc20e62f9dad5bf46b36eac83fbbad2243c396c
Author: Nils Goroll <nils.goroll at uplex.de>
Date: Fri Nov 1 09:06:15 2024 +0100
cache_http1_line: Flexelint: signedness polish and other minor improvements
Found with less Flexelint silencing
Change of data type of struct v1l members was guided by their main use:
{s,n,c}iov are all related to the iovcnt argument of writev(), which is
of type int.
{l,cl}iov are lengths (to be) written, which can not be negative.
cnt is ultimately going to be returned as a uint64_t, so it makes sense
to have that in the first place.
The other changes are consequences of these, fixing all sign and type
related Flexelint complaints.
diff --git a/bin/varnishd/http1/cache_http1_line.c b/bin/varnishd/http1/cache_http1_line.c
index 39ba2356f..d19fb4f08 100644
--- a/bin/varnishd/http1/cache_http1_line.c
+++ b/bin/varnishd/http1/cache_http1_line.c
@@ -58,14 +58,14 @@ struct v1l {
int *wfd;
stream_close_t werr; /* valid after V1L_Flush() */
struct iovec *iov;
- unsigned siov;
- unsigned niov;
- ssize_t liov;
- ssize_t cliov;
- unsigned ciov; /* Chunked header marker */
+ int siov;
+ int niov;
+ size_t liov;
+ size_t cliov;
+ int ciov; /* Chunked header marker */
vtim_real deadline;
struct vsl_log *vsl;
- ssize_t cnt; /* Flushed byte count */
+ uint64_t cnt; /* Flushed byte count */
struct ws *ws;
uintptr_t ws_snap;
void **vdp_priv;
@@ -113,8 +113,8 @@ V1L_Open(struct ws *ws, int *fd, struct vsl_log *vsl,
if (niov != 0 && u > niov)
u = niov;
v1l->iov = WS_Reservation(ws);
- v1l->siov = u;
- v1l->ciov = u;
+ v1l->siov = (int)u;
+ v1l->ciov = (int)u;
v1l->wfd = fd;
v1l->deadline = deadline;
v1l->vsl = vsl;
@@ -150,10 +150,14 @@ V1L_Close(struct v1l **v1lp, uint64_t *cnt)
}
static void
-v1l_prune(struct v1l *v1l, size_t bytes)
+v1l_prune(struct v1l *v1l, ssize_t abytes)
{
- ssize_t used = 0;
- ssize_t j, used_here;
+ size_t used = 0;
+ size_t sz, bytes, used_here;
+ int j;
+
+ assert(abytes > 0);
+ bytes = (size_t)abytes;
for (j = 0; j < v1l->niov; j++) {
if (used + v1l->iov[j].iov_len > bytes) {
@@ -162,9 +166,11 @@ v1l_prune(struct v1l *v1l, size_t bytes)
v1l->iov[j].iov_len -= used_here;
v1l->iov[j].iov_base =
(char*)v1l->iov[j].iov_base + used_here;
- memmove(v1l->iov, &v1l->iov[j],
- (v1l->niov - j) * sizeof(struct iovec));
+ sz = (unsigned)v1l->niov - (unsigned)j;
+ sz *= sizeof(struct iovec);
+ memmove(v1l->iov, &v1l->iov[j], sz);
v1l->niov -= j;
+ assert(v1l->liov >= bytes);
v1l->liov -= bytes;
return;
}
@@ -177,6 +183,7 @@ stream_close_t
V1L_Flush(struct v1l *v1l)
{
ssize_t i;
+ size_t sz;
int err;
char cbuf[32];
@@ -190,13 +197,13 @@ V1L_Flush(struct v1l *v1l)
if (v1l->ciov < v1l->siov && v1l->cliov > 0) {
/* Add chunk head & tail */
bprintf(cbuf, "00%zx\r\n", v1l->cliov);
- i = strlen(cbuf);
+ sz = strlen(cbuf);
v1l->iov[v1l->ciov].iov_base = cbuf;
- v1l->iov[v1l->ciov].iov_len = i;
- v1l->liov += i;
+ v1l->iov[v1l->ciov].iov_len = sz;
+ v1l->liov += sz;
/* This is OK, because siov was --'ed */
- v1l->iov[v1l->niov].iov_base = cbuf + i - 2;
+ v1l->iov[v1l->niov].iov_base = cbuf + sz - 2;
v1l->iov[v1l->niov++].iov_len = 2;
v1l->liov += 2;
} else if (v1l->ciov < v1l->siov) {
@@ -217,11 +224,11 @@ V1L_Flush(struct v1l *v1l)
}
i = writev(*v1l->wfd, v1l->iov, v1l->niov);
- if (i > 0)
- v1l->cnt += i;
-
- if (i == v1l->liov)
- break;
+ if (i > 0) {
+ v1l->cnt += (size_t)i;
+ if ((size_t)i == v1l->liov)
+ break;
+ }
/* we hit a timeout, and some data may have been sent:
* Remove sent data from start of I/O vector, then retry
@@ -265,15 +272,21 @@ V1L_Flush(struct v1l *v1l)
}
size_t
-V1L_Write(struct v1l *v1l, const void *ptr, ssize_t len)
+V1L_Write(struct v1l *v1l, const void *ptr, ssize_t alen)
{
+ size_t len = 0;
CHECK_OBJ_NOTNULL(v1l, V1L_MAGIC);
AN(v1l->wfd);
- if (len == 0 || *v1l->wfd < 0)
+ if (alen == 0 || *v1l->wfd < 0)
return (0);
- if (len == -1)
+ if (alen > 0)
+ len = (size_t)alen;
+ else if (alen == -1)
len = strlen(ptr);
+ else
+ WRONG("alen");
+
assert(v1l->niov < v1l->siov);
v1l->iov[v1l->niov].iov_base = TRUST_ME(ptr);
v1l->iov[v1l->niov].iov_len = len;
@@ -355,7 +368,7 @@ static int v_matchproto_(vdp_bytes_f)
v1l_bytes(struct vdp_ctx *vdc, enum vdp_action act, void **priv,
const void *ptr, ssize_t len)
{
- ssize_t wl = 0;
+ size_t wl = 0;
CHECK_OBJ_NOTNULL(vdc, VDP_CTX_MAGIC);
AN(priv);
@@ -366,7 +379,7 @@ v1l_bytes(struct vdp_ctx *vdc, enum vdp_action act, void **priv,
wl = V1L_Write(*priv, ptr, len);
if (act > VDP_NULL && V1L_Flush(*priv) != SC_NULL)
return (-1);
- if (len != wl)
+ if ((size_t)len != wl)
return (-1);
return (0);
}
More information about the varnish-commit
mailing list