CVE-2022-32742: s3: smbd: Harden the smbreq_bufrem() macro.
authorJeremy Allison <jra@samba.org>
Wed, 8 Jun 2022 20:50:51 +0000 (13:50 -0700)
committerJule Anger <janger@samba.org>
Sun, 24 Jul 2022 09:42:07 +0000 (11:42 +0200)
Fixes the raw.write.bad-write test.

NB. We need the two (==0) changes in source3/smbd/reply.c
as the gcc optimizer now knows that the return from
smbreq_bufrem() can never be less than zero.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=15085

Remove knownfail.

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: David Disseldorp <ddiss@samba.org>
selftest/knownfail.d/bad-write [deleted file]
source3/include/smb_macros.h
source3/smbd/reply.c

diff --git a/selftest/knownfail.d/bad-write b/selftest/knownfail.d/bad-write
deleted file mode 100644 (file)
index 5fc1660..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-^samba3.raw.write.bad-write\(nt4_dc_smb1\)
-^samba3.raw.write.bad-write\(ad_dc_smb1\)
index def122727f0db5f862aa704f4dda636afd8a09be..de1322a503b6cd5440a6ec2911f1964515112201 100644 (file)
 
 /* the remaining number of bytes in smb buffer 'buf' from pointer 'p'. */
 #define smb_bufrem(buf, p) (smb_buflen(buf)-PTR_DIFF(p, smb_buf(buf)))
-#define smbreq_bufrem(req, p) (req->buflen - PTR_DIFF(p, req->buf))
+#define smbreq_bufrem(req, p) ((req)->buflen < PTR_DIFF((p), (req)->buf) ? 0 : (req)->buflen - PTR_DIFF((p), (req)->buf))
 
 
 /* Note that chain_size must be available as an extern int to this macro. */
index f33326564f74b82739ffb961ab07db9cbc20ea5d..b5abe588910963552bcc58eb0e84edd338f3b76a 100644 (file)
@@ -342,7 +342,7 @@ size_t srvstr_get_path_req(TALLOC_CTX *mem_ctx, struct smb_request *req,
 {
        ssize_t bufrem = smbreq_bufrem(req, src);
 
-       if (bufrem < 0) {
+       if (bufrem == 0) {
                *err = NT_STATUS_INVALID_PARAMETER;
                return 0;
        }
@@ -380,7 +380,7 @@ size_t srvstr_pull_req_talloc(TALLOC_CTX *ctx, struct smb_request *req,
 {
        ssize_t bufrem = smbreq_bufrem(req, src);
 
-       if (bufrem < 0) {
+       if (bufrem == 0) {
                return 0;
        }