Jakub Hrozek e8212b6
From 85a1c62c942033f6e1b864aeb4fd72c4a8b3d38a Mon Sep 17 00:00:00 2001
Jakub Hrozek e8212b6
From: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Jakub Hrozek e8212b6
Date: Tue, 24 Nov 2015 13:09:36 +1300
Jakub Hrozek e8212b6
Subject: [PATCH 4/9] CVE-2015-5330: ldb_dn_escape_value: use known string
Jakub Hrozek e8212b6
 length, not strlen()
Jakub Hrozek e8212b6
Jakub Hrozek e8212b6
ldb_dn_escape_internal() reports the number of bytes it copied, so
Jakub Hrozek e8212b6
lets use that number, rather than using strlen() and hoping a zero got
Jakub Hrozek e8212b6
in the right place.
Jakub Hrozek e8212b6
Jakub Hrozek e8212b6
Bug: https://bugzilla.samba.org/show_bug.cgi?id=11599
Jakub Hrozek e8212b6
Jakub Hrozek e8212b6
Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Jakub Hrozek e8212b6
Pair-programmed-with: Andrew Bartlett <abartlet@samba.org>
Jakub Hrozek e8212b6
Reviewed-by: Ralph Boehme <slow@samba.org>
Jakub Hrozek e8212b6
---
Jakub Hrozek e8212b6
 lib/ldb/common/ldb_dn.c | 12 ++++++++----
Jakub Hrozek e8212b6
 1 file changed, 8 insertions(+), 4 deletions(-)
Jakub Hrozek e8212b6
Jakub Hrozek e8212b6
diff --git a/lib/ldb/common/ldb_dn.c b/lib/ldb/common/ldb_dn.c
Jakub Hrozek e8212b6
index 1b8e51e..a3b8f92 100644
Jakub Hrozek e8212b6
--- a/lib/ldb/common/ldb_dn.c
Jakub Hrozek e8212b6
+++ b/lib/ldb/common/ldb_dn.c
Jakub Hrozek e8212b6
@@ -250,7 +250,7 @@ static int ldb_dn_escape_internal(char *dst, const char *src, int len)
Jakub Hrozek e8212b6
 char *ldb_dn_escape_value(TALLOC_CTX *mem_ctx, struct ldb_val value)
Jakub Hrozek e8212b6
 {
Jakub Hrozek e8212b6
 	char *dst;
Jakub Hrozek e8212b6
-
Jakub Hrozek e8212b6
+	size_t len;
Jakub Hrozek e8212b6
 	if (!value.length)
Jakub Hrozek e8212b6
 		return NULL;
Jakub Hrozek e8212b6
 
Jakub Hrozek e8212b6
@@ -261,10 +261,14 @@ char *ldb_dn_escape_value(TALLOC_CTX *mem_ctx, struct ldb_val value)
Jakub Hrozek e8212b6
 		return NULL;
Jakub Hrozek e8212b6
 	}
Jakub Hrozek e8212b6
 
Jakub Hrozek e8212b6
-	ldb_dn_escape_internal(dst, (const char *)value.data, value.length);
Jakub Hrozek e8212b6
-
Jakub Hrozek e8212b6
-	dst = talloc_realloc(mem_ctx, dst, char, strlen(dst) + 1);
Jakub Hrozek e8212b6
+	len = ldb_dn_escape_internal(dst, (const char *)value.data, value.length);
Jakub Hrozek e8212b6
 
Jakub Hrozek e8212b6
+	dst = talloc_realloc(mem_ctx, dst, char, len + 1);
Jakub Hrozek e8212b6
+	if ( ! dst) {
Jakub Hrozek e8212b6
+		talloc_free(dst);
Jakub Hrozek e8212b6
+		return NULL;
Jakub Hrozek e8212b6
+	}
Jakub Hrozek e8212b6
+	dst[len] = '\0';
Jakub Hrozek e8212b6
 	return dst;
Jakub Hrozek e8212b6
 }
Jakub Hrozek e8212b6
 
Jakub Hrozek e8212b6
-- 
Jakub Hrozek e8212b6
2.5.0