shithub: riscv

Download patch

ref: 27abf782b4a59122c6a35426c0ea4d3fb3f872fd
parent: b181c1f7f561dbbb136495fabfb7eec4e5390434
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Mar 16 02:42:53 EDT 2025

ndb/dns: check for truncated read offset

Unless ndb/cs, we check for negative read offset,
but truncation can still happen as offset is
64-bit and we only handle integer offsets.

--- a/sys/src/cmd/ndb/dns.c
+++ b/sys/src/cmd/ndb/dns.c
@@ -608,7 +608,9 @@
 	cnt = job->request.count;
 	*buf = '\0';
 	job->reply.data = (char*)buf;
-	if(mf->qid.type & QTDIR){
+	if(off < 0 || off != job->request.offset)
+		err = "bad read offset";
+	else if(mf->qid.type & QTDIR){
 		clock = time(nil);
 		if(off == 0){
 			memset(&dir, 0, sizeof dir);
@@ -622,9 +624,7 @@
 			dir.atime = dir.mtime = clock;		/* wrong */
 			n = convD2M(&dir, buf, sizeof buf);
 		}
-	} else if (off < 0)
-		err = "negative read offset";
-	else {
+	} else {
 		/* first offset will always be zero */
 		for(i = 1; i <= mf->nrr; i++)
 			if(mf->rr[i] > off)
--