summaryrefslogtreecommitdiff
path: root/source3/lib
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2007-09-13 22:08:59 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:30:44 -0500
commiteacd3140573d1122a3785823e4003bfc6352c431 (patch)
treea1ee9d9e59da4c44e0484d895eb78a8c8e1f0de2 /source3/lib
parentd0de93ca762e8b59f09c2179448188c9952f68fc (diff)
downloadsamba-eacd3140573d1122a3785823e4003bfc6352c431.tar.gz
samba-eacd3140573d1122a3785823e4003bfc6352c431.tar.bz2
samba-eacd3140573d1122a3785823e4003bfc6352c431.zip
r25138: More pstring elimination. Add a TALLOC_CTX parameter
to unix_convert(). Jeremy. (This used to be commit 39c211a702e91c34c1a5a689e1b0c4530ea8a1ac)
Diffstat (limited to 'source3/lib')
-rw-r--r--source3/lib/charcnv.c41
-rw-r--r--source3/lib/util_str.c11
2 files changed, 41 insertions, 11 deletions
diff --git a/source3/lib/charcnv.c b/source3/lib/charcnv.c
index c481c9a7e2..26581ba305 100644
--- a/source3/lib/charcnv.c
+++ b/source3/lib/charcnv.c
@@ -935,27 +935,40 @@ static size_t ucs2_align(const void *base_ptr, const void *p, int flags)
* </dl>
*
* @param dest_len the maximum length in bytes allowed in the
- * destination. If @p dest_len is -1 then no maximum is used.
+ * destination.
**/
size_t push_ascii(void *dest, const char *src, size_t dest_len, int flags)
{
size_t src_len = strlen(src);
- pstring tmpbuf;
+ char *tmpbuf = NULL;
+ size_t ret;
- /* treat a pstring as "unlimited" length */
- if (dest_len == (size_t)-1)
- dest_len = sizeof(pstring);
+ /* No longer allow a length of -1. */
+ if (dest_len == (size_t)-1) {
+ smb_panic("push_ascii - dest_len == -1");
+ return (size_t)0;
+ }
if (flags & STR_UPPER) {
- pstrcpy(tmpbuf, src);
+ tmpbuf = SMB_STRDUP(src);
+ if (!tmpbuf) {
+ smb_panic("malloc fail");
+ return (size_t)0;
+ }
strupper_m(tmpbuf);
src = tmpbuf;
}
- if (flags & (STR_TERMINATE | STR_TERMINATE_ASCII))
+ if (flags & (STR_TERMINATE | STR_TERMINATE_ASCII)) {
src_len++;
+ }
- return convert_string(CH_UNIX, CH_DOS, src, src_len, dest, dest_len, True);
+ ret = convert_string(CH_UNIX, CH_DOS, src, src_len, dest, dest_len, True);
+ SAFE_FREE(tmpbuf);
+ if (ret == (size_t)-1) {
+ return 0;
+ }
+ return ret;
}
size_t push_ascii_fstring(void *dest, const char *src)
@@ -1007,6 +1020,18 @@ size_t push_ascii_nstring(void *dest, const char *src)
return dest_len;
}
+/********************************************************************
+ Push and malloc an ascii string. src and dest null terminated.
+********************************************************************/
+
+size_t push_ascii_allocate(char **dest, const char *src)
+{
+ size_t src_len = strlen(src)+1;
+
+ *dest = NULL;
+ return convert_string_allocate(NULL, CH_UNIX, CH_DOS, src, src_len, (void **)dest, True);
+}
+
/**
* Copy a string from a dos codepage source to a unix char* destination.
*
diff --git a/source3/lib/util_str.c b/source3/lib/util_str.c
index 36cd716462..c2eeb12544 100644
--- a/source3/lib/util_str.c
+++ b/source3/lib/util_str.c
@@ -549,9 +549,14 @@ size_t str_charnum(const char *s)
size_t str_ascii_charnum(const char *s)
{
- pstring tmpbuf2;
- push_ascii(tmpbuf2, s, sizeof(tmpbuf2), STR_TERMINATE);
- return strlen(tmpbuf2);
+ size_t ret;
+ char *tmpbuf2 = NULL;
+ if (push_ascii_allocate(&tmpbuf2, s) == (size_t)-1) {
+ return 0;
+ }
+ ret = strlen(tmpbuf2);
+ SAFE_FREE(tmpbuf2);
+ return ret;
}
BOOL trim_char(char *s,char cfront,char cback)