aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonrad Sewiłło-Jopek <kjopek@gmail.com>2022-08-08 16:25:48 +0000
committerMark Johnston <markj@FreeBSD.org>2022-08-09 20:01:13 +0000
commit7dfe949791e764115dda17ec6b21fba2e0a86a2e (patch)
tree7b0ee0bf55e71b5cad67186e97ad6eee7c39e49f
parent0c88ecaa12555cfea0395abdb0ffac9b3e0f3204 (diff)
downloadsrc-7dfe949791e7.tar.gz
src-7dfe949791e7.zip
lib9p: Remove potential buffer overwrite in l9p_puqids()
Structure l9p_f_wralk reserves at most L9P_MAX_WELEM entries and that number actually set the maximum we can safely use. Approved by: so Security: FreeBSD-SA-22:12.lib9p PR: 265385 Reviewed by: markj (cherry picked from commit 2dd83b3f0507fc7bc64b908fb88f285a3b9663c8) (cherry picked from commit c536045c51da78a85138e963d3b7e13a547713c9)
-rw-r--r--contrib/lib9p/pack.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/contrib/lib9p/pack.c b/contrib/lib9p/pack.c
index 88f0ccb4ad73..cf0ae9111b76 100644
--- a/contrib/lib9p/pack.c
+++ b/contrib/lib9p/pack.c
@@ -343,13 +343,17 @@ l9p_puqids(struct l9p_message *msg, uint16_t *num, struct l9p_qid *qids)
ssize_t ret, r;
r = l9p_pu16(msg, num);
- if (r > 0) {
- for (i = 0, lim = *num; i < lim; i++) {
- ret = l9p_puqid(msg, &qids[i]);
- if (ret < 0)
- return (-1);
- r += ret;
- }
+ if (r <= 0)
+ return (r);
+
+ if (*num > L9P_MAX_WELEM)
+ return (-1);
+
+ for (i = 0, lim = *num; i < lim; i++) {
+ ret = l9p_puqid(msg, &qids[i]);
+ if (ret < 0)
+ return (-1);
+ r += ret;
}
return (r);
}