summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2008-10-16 15:06:13 -0700
committerKarolin Seeger <kseeger@samba.org>2008-10-21 12:29:10 +0200
commit01fd94981e322da59ac2c00055220c89de135ebe (patch)
tree8658f820f37607735063b063986260a4e2497a99
parentf3b0e219f1a7660ff275db701935eecbe053fa25 (diff)
downloadsamba-01fd94981e322da59ac2c00055220c89de135ebe.tar.gz
samba-01fd94981e322da59ac2c00055220c89de135ebe.tar.xz
samba-01fd94981e322da59ac2c00055220c89de135ebe.zip
Unify the logic in pull_ascii_base_talloc() and pull_ucs2_base_talloc().
Jeremy. (cherry picked from commit 5109bd33719a4bb1534cb0e012c92ec778fb26df)
-rw-r--r--source/lib/charcnv.c34
1 files changed, 27 insertions, 7 deletions
diff --git a/source/lib/charcnv.c b/source/lib/charcnv.c
index eec7ae30afd..f4efcb2ce23 100644
--- a/source/lib/charcnv.c
+++ b/source/lib/charcnv.c
@@ -1183,6 +1183,10 @@ static size_t pull_ascii_base_talloc(TALLOC_CTX *ctx,
*ppdest = NULL;
+ if (!src_len) {
+ return 0;
+ }
+
if (flags & STR_TERMINATE) {
if (src_len == (size_t)-1) {
src_len = strlen((const char *)src) + 1;
@@ -1200,11 +1204,22 @@ static size_t pull_ascii_base_talloc(TALLOC_CTX *ctx,
(unsigned int)src_len);
smb_panic(msg);
}
+ } else {
+ /* Can't have an unlimited length
+ * non STR_TERMINATE'd.
+ */
+ if (src_len == (size_t)-1) {
+ errno = EINVAL;
+ return 0;
+ }
}
+ /* src_len != -1 here. */
+
if (!convert_string_allocate(ctx, CH_DOS, CH_UNIX, src, src_len, &dest,
- &dest_len, True))
+ &dest_len, True)) {
dest_len = 0;
+ }
if (dest_len && dest) {
/* Did we already process the terminating zero ? */
@@ -1571,12 +1586,20 @@ size_t pull_ucs2_base_talloc(TALLOC_CTX *ctx,
if (src_len >= 1024*1024) {
smb_panic("Bad src length in pull_ucs2_base_talloc\n");
}
+ } else {
+ /* Can't have an unlimited length
+ * non STR_TERMINATE'd.
+ */
+ if (src_len == (size_t)-1) {
+ errno = EINVAL;
+ return 0;
+ }
}
+ /* src_len != -1 here. */
+
/* ucs2 is always a multiple of 2 bytes */
- if (src_len != (size_t)-1) {
- src_len &= ~1;
- }
+ src_len &= ~1;
dest_len = convert_string_talloc(ctx,
CH_UTF16LE,
@@ -1589,9 +1612,6 @@ size_t pull_ucs2_base_talloc(TALLOC_CTX *ctx,
dest_len = 0;
}
- if (src_len == (size_t)-1)
- src_len = dest_len*2;
-
if (dest_len) {
/* Did we already process the terminating zero ? */
if (dest[dest_len-1] != 0) {