diff options
-rw-r--r-- | source3/include/proto.h | 2 | ||||
-rw-r--r-- | source3/lib/charcnv.c | 97 | ||||
-rw-r--r-- | source3/lib/fstring.c | 14 |
3 files changed, 55 insertions, 58 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h index c19e3a45f7..94c924591f 100644 --- a/source3/include/proto.h +++ b/source3/include/proto.h @@ -77,7 +77,7 @@ void init_iconv(void); size_t convert_string(charset_t from, charset_t to, void const *src, size_t srclen, void *dest, size_t destlen); -size_t convert_string_error(charset_t from, charset_t to, +bool convert_string_error(charset_t from, charset_t to, void const *src, size_t srclen, void *dest, size_t destlen, size_t *converted_size); diff --git a/source3/lib/charcnv.c b/source3/lib/charcnv.c index 74685408d4..76fa968457 100644 --- a/source3/lib/charcnv.c +++ b/source3/lib/charcnv.c @@ -80,13 +80,15 @@ void init_iconv(void) * @param srclen length of the source string in bytes * @param dest pointer to destination string (multibyte or singlebyte) * @param destlen maximal length allowed for string - * @returns the number of bytes occupied in the destination + * @param converted size is the number of bytes occupied in the destination + * + * @returns false and sets errno on fail, true on success. * * Ensure the srclen contains the terminating zero. * **/ -static size_t convert_string_internal(charset_t from, charset_t to, +static bool convert_string_internal(charset_t from, charset_t to, void const *src, size_t srclen, void *dest, size_t destlen, size_t *converted_size) { @@ -112,16 +114,18 @@ static size_t convert_string_internal(charset_t from, charset_t to, if (descriptor == (smb_iconv_t)-1 || descriptor == (smb_iconv_t)0) { errno = EINVAL; - return (size_t)-1; + return false; } i_len=srclen; o_len=destlen; retval = smb_iconv(descriptor, &inbuf, &i_len, &outbuf, &o_len); - if (converted_size != NULL) - *converted_size = destlen-o_len; - return retval; + if (retval == (size_t)-1) { + return false; + } + *converted_size = destlen-o_len; + return true; } /** @@ -132,7 +136,9 @@ static size_t convert_string_internal(charset_t from, charset_t to, * @param srclen length of the source string in bytes, or -1 for nul terminated. * @param dest pointer to destination string (multibyte or singlebyte) * @param destlen maximal length allowed for string - *NEVER* -1. - * @returns the number of bytes occupied in the destination + * @param converted size is the number of bytes occupied in the destination + * + * @returns false and sets errno on fail, true on success. * * Ensure the srclen contains the terminating zero. * @@ -140,7 +146,7 @@ static size_t convert_string_internal(charset_t from, charset_t to, * Don't change unless you really know what you are doing. JRA. **/ -size_t convert_string_error(charset_t from, charset_t to, +bool convert_string_error(charset_t from, charset_t to, void const *src, size_t srclen, void *dest, size_t destlen, size_t *converted_size) @@ -155,13 +161,11 @@ size_t convert_string_error(charset_t from, charset_t to, SMB_ASSERT(destlen != (size_t)-1); #endif - if (converted_size) { + if (srclen == 0) { *converted_size = 0; + return true; } - if (srclen == 0) - return 0; - if (from != CH_UTF16LE && from != CH_UTF16BE && to != CH_UTF16LE && to != CH_UTF16BE) { const unsigned char *p = (const unsigned char *)src; unsigned char *q = (unsigned char *)dest; @@ -185,26 +189,24 @@ size_t convert_string_error(charset_t from, charset_t to, #ifdef BROKEN_UNICODE_COMPOSE_CHARACTERS goto general_case; #else - size_t ret = convert_string_internal(from, to, p, slen, q, dlen, converted_size); - if (converted_size) { - *converted_size += retval; - } + bool ret = convert_string_internal(from, to, p, slen, q, dlen, converted_size); + *converted_size += retval; return ret; #endif } } - if (converted_size) { - *converted_size = retval; - } + + *converted_size = retval; + if (!dlen) { /* Even if we fast path we should note if we ran out of room. */ if (((slen != (size_t)-1) && slen) || ((slen == (size_t)-1) && lastp)) { errno = E2BIG; - return (size_t)-1; + return false; } } - return retval; + return true; } else if (from == CH_UTF16LE && to != CH_UTF16LE) { const unsigned char *p = (const unsigned char *)src; unsigned char *q = (unsigned char *)dest; @@ -229,26 +231,24 @@ size_t convert_string_error(charset_t from, charset_t to, #ifdef BROKEN_UNICODE_COMPOSE_CHARACTERS goto general_case; #else - size_t ret = convert_string_internal(from, to, p, slen, q, dlen, converted_size); - if (converted_size) { - *converted_size += retval; - } + bool ret = convert_string_internal(from, to, p, slen, q, dlen, converted_size); + *converted_size += retval; return ret; #endif } } - if (converted_size) { - *converted_size = retval; - } + + *converted_size = retval; + if (!dlen) { /* Even if we fast path we should note if we ran out of room. */ if (((slen != (size_t)-1) && slen) || ((slen == (size_t)-1) && lastp)) { errno = E2BIG; - return (size_t)-1; + return false; } } - return retval; + return true; } else if (from != CH_UTF16LE && from != CH_UTF16BE && to == CH_UTF16LE) { const unsigned char *p = (const unsigned char *)src; unsigned char *q = (unsigned char *)dest; @@ -273,26 +273,24 @@ size_t convert_string_error(charset_t from, charset_t to, #ifdef BROKEN_UNICODE_COMPOSE_CHARACTERS goto general_case; #else - size_t ret = convert_string_internal(from, to, p, slen, q, dlen, converted_size); - if (converted_size) { - *converted_size += retval; - } + bool ret = convert_string_internal(from, to, p, slen, q, dlen, converted_size); + *converted_size += retval; return ret; #endif } } - if (converted_size) { - *converted_size = retval; - } + + *converted_size = retval; + if (!dlen) { /* Even if we fast path we should note if we ran out of room. */ if (((slen != (size_t)-1) && slen) || ((slen == (size_t)-1) && lastp)) { errno = E2BIG; - return (size_t)-1; + return false; } } - return retval; + return true; } #ifdef BROKEN_UNICODE_COMPOSE_CHARACTERS @@ -303,17 +301,19 @@ size_t convert_string_error(charset_t from, charset_t to, size_t convert_string(charset_t from, charset_t to, void const *src, size_t srclen, - void *dest, size_t destlen) { + void *dest, size_t destlen) +{ size_t converted_size; - size_t retval = convert_string_error(from, to, src, srclen, dest, destlen, &converted_size); - if(retval==(size_t)-1) { + bool ret = convert_string_error(from, to, src, srclen, dest, destlen, &converted_size); + + if(ret==false) { const char *reason="unknown error"; switch(errno) { case EINVAL: reason="Incomplete multibyte sequence"; DEBUG(3,("convert_string_internal: Conversion error: %s(%s)\n", reason, (const char *)src)); - return (size_t)-1; + break; case E2BIG: { struct smb_iconv_handle *ic; @@ -336,15 +336,15 @@ size_t convert_string(charset_t from, charset_t to, reason="Illegal multibyte sequence"; DEBUG(3,("convert_string_internal: Conversion error: %s(%s)\n", reason, (const char *)src)); - return (size_t)-1; + break; default: DEBUG(0,("convert_string_internal: Conversion error: %s(%s)\n", reason, (const char *)src)); - return (size_t)-1; + break; } /* smb_panic(reason); */ } - return converted_size; + return ret ? converted_size : (size_t)-1; } @@ -380,11 +380,6 @@ bool convert_string_talloc(TALLOC_CTX *ctx, charset_t from, charset_t to, *dest = NULL; - if (!converted_size) { - errno = EINVAL; - return false; - } - if (src == NULL || srclen == (size_t)-1) { errno = EINVAL; return false; diff --git a/source3/lib/fstring.c b/source3/lib/fstring.c index 74c2138975..50b0765f92 100644 --- a/source3/lib/fstring.c +++ b/source3/lib/fstring.c @@ -35,17 +35,19 @@ size_t push_ascii_fstring(void *dest, const char *src) this function uses convert_string_error() to avoid common debug warnings where is unable to convert strings to CH_DOS. The target string is truncated at the first character that cannot be converted - The target is always null terminated. The resulting string size, - without the null termination, it returned + The target is always null terminated. ********************************************************************/ size_t push_ascii_nstring(void *dest, const char *src) { size_t converted_size = 0; - size_t ret; - ret = convert_string_error(CH_UNIX, CH_DOS, src, -1, dest, sizeof(nstring), &converted_size); - SCVAL(dest, sizeof(nstring)-1, 0); - return ret; + bool ret = convert_string_error(CH_UNIX, CH_DOS, src, -1, dest, sizeof(nstring), &converted_size); + if (ret) { + SCVAL(dest, sizeof(nstring)-1, 0); + } else { + SCVAL(dest, 0, 0); + } + return ret ? converted_size : (size_t)-1; } size_t pull_ascii_fstring(char *dest, const void *src) |