|
Jakub Hrozek |
e8212b6 |
From e84802e2c61ff06501764496a11ea9e417d70d39 Mon Sep 17 00:00:00 2001
|
|
Jakub Hrozek |
e8212b6 |
From: Jeremy Allison <jra@samba.org>
|
|
Jakub Hrozek |
e8212b6 |
Date: Tue, 9 Jun 2015 14:00:01 -0700
|
|
Jakub Hrozek |
e8212b6 |
Subject: [PATCH 2/9] CVE-2015-3223: lib: ldb: Use memmem binary search, not
|
|
Jakub Hrozek |
e8212b6 |
strstr text search.
|
|
Jakub Hrozek |
e8212b6 |
|
|
Jakub Hrozek |
e8212b6 |
Values might have embedded zeros.
|
|
Jakub Hrozek |
e8212b6 |
|
|
Jakub Hrozek |
e8212b6 |
BUG: https://bugzilla.samba.org/show_bug.cgi?id=11325
|
|
Jakub Hrozek |
e8212b6 |
|
|
Jakub Hrozek |
e8212b6 |
Signed-off-by: Jeremy Allison <jra@samba.org>
|
|
Jakub Hrozek |
e8212b6 |
Reviewed-by: Ralph Boehme <slow@samba.org>
|
|
Jakub Hrozek |
e8212b6 |
---
|
|
Jakub Hrozek |
e8212b6 |
lib/ldb/common/ldb_match.c | 17 +++++++++++++----
|
|
Jakub Hrozek |
e8212b6 |
1 file changed, 13 insertions(+), 4 deletions(-)
|
|
Jakub Hrozek |
e8212b6 |
|
|
Jakub Hrozek |
e8212b6 |
diff --git a/lib/ldb/common/ldb_match.c b/lib/ldb/common/ldb_match.c
|
|
Jakub Hrozek |
e8212b6 |
index 7414289..182c6ce 100644
|
|
Jakub Hrozek |
e8212b6 |
--- a/lib/ldb/common/ldb_match.c
|
|
Jakub Hrozek |
e8212b6 |
+++ b/lib/ldb/common/ldb_match.c
|
|
Jakub Hrozek |
e8212b6 |
@@ -241,7 +241,6 @@ static int ldb_wildcard_compare(struct ldb_context *ldb,
|
|
Jakub Hrozek |
e8212b6 |
struct ldb_val val;
|
|
Jakub Hrozek |
e8212b6 |
struct ldb_val cnk;
|
|
Jakub Hrozek |
e8212b6 |
struct ldb_val *chunk;
|
|
Jakub Hrozek |
e8212b6 |
- char *p, *g;
|
|
Jakub Hrozek |
e8212b6 |
uint8_t *save_p = NULL;
|
|
Jakub Hrozek |
e8212b6 |
unsigned int c = 0;
|
|
Jakub Hrozek |
e8212b6 |
|
|
Jakub Hrozek |
e8212b6 |
@@ -288,6 +287,7 @@ static int ldb_wildcard_compare(struct ldb_context *ldb,
|
|
Jakub Hrozek |
e8212b6 |
}
|
|
Jakub Hrozek |
e8212b6 |
|
|
Jakub Hrozek |
e8212b6 |
while (tree->u.substring.chunks[c]) {
|
|
Jakub Hrozek |
e8212b6 |
+ uint8_t *p;
|
|
Jakub Hrozek |
e8212b6 |
|
|
Jakub Hrozek |
e8212b6 |
chunk = tree->u.substring.chunks[c];
|
|
Jakub Hrozek |
e8212b6 |
if(a->syntax->canonicalise_fn(ldb, ldb, chunk, &cnk) != 0) goto mismatch;
|
|
Jakub Hrozek |
e8212b6 |
@@ -299,15 +299,24 @@ static int ldb_wildcard_compare(struct ldb_context *ldb,
|
|
Jakub Hrozek |
e8212b6 |
if (cnk.length == 0) {
|
|
Jakub Hrozek |
e8212b6 |
goto mismatch;
|
|
Jakub Hrozek |
e8212b6 |
}
|
|
Jakub Hrozek |
e8212b6 |
- p = strstr((char *)val.data, (char *)cnk.data);
|
|
Jakub Hrozek |
e8212b6 |
+ /*
|
|
Jakub Hrozek |
e8212b6 |
+ * Values might be binary blobs. Don't use string
|
|
Jakub Hrozek |
e8212b6 |
+ * search, but memory search instead.
|
|
Jakub Hrozek |
e8212b6 |
+ */
|
|
Jakub Hrozek |
e8212b6 |
+ p = memmem((const void *)val.data,val.length,
|
|
Jakub Hrozek |
e8212b6 |
+ (const void *)cnk.data, cnk.length);
|
|
Jakub Hrozek |
e8212b6 |
if (p == NULL) goto mismatch;
|
|
Jakub Hrozek |
e8212b6 |
if ( (! tree->u.substring.chunks[c + 1]) && (! tree->u.substring.end_with_wildcard) ) {
|
|
Jakub Hrozek |
e8212b6 |
+ uint8_t *g;
|
|
Jakub Hrozek |
e8212b6 |
do { /* greedy */
|
|
Jakub Hrozek |
e8212b6 |
- g = strstr((char *)p + cnk.length, (char *)cnk.data);
|
|
Jakub Hrozek |
e8212b6 |
+ g = memmem(p + cnk.length,
|
|
Jakub Hrozek |
e8212b6 |
+ val.length - (p - val.data),
|
|
Jakub Hrozek |
e8212b6 |
+ (const uint8_t *)cnk.data,
|
|
Jakub Hrozek |
e8212b6 |
+ cnk.length);
|
|
Jakub Hrozek |
e8212b6 |
if (g) p = g;
|
|
Jakub Hrozek |
e8212b6 |
} while(g);
|
|
Jakub Hrozek |
e8212b6 |
}
|
|
Jakub Hrozek |
e8212b6 |
- val.length = val.length - (p - (char *)(val.data)) - cnk.length;
|
|
Jakub Hrozek |
e8212b6 |
+ val.length = val.length - (p - (uint8_t *)(val.data)) - cnk.length;
|
|
Jakub Hrozek |
e8212b6 |
val.data = (uint8_t *)(p + cnk.length);
|
|
Jakub Hrozek |
e8212b6 |
c++;
|
|
Jakub Hrozek |
e8212b6 |
talloc_free(cnk.data);
|
|
Jakub Hrozek |
e8212b6 |
--
|
|
Jakub Hrozek |
e8212b6 |
2.5.0
|