]> arthur.barton.de Git - netatalk.git/blobdiff - libatalk/unicode/charcnv.c
in unicode function convert_charset needs trailing zero, spotted by HAT
[netatalk.git] / libatalk / unicode / charcnv.c
index 67ca07a83e779d9dee95ed2750d9c80182be38fa..0071c68863c1ce03085c2749b36010325429ddb1 100644 (file)
@@ -1027,19 +1027,23 @@ static size_t push_charset_flags (charset_t to_set, charset_t cap_set, char* src
   return (i_len + j == 0 || (option & CONV_FORCE)) ? destlen - o_len : (size_t)-1;
 }
 
+/*
+ * FIXME the size is a mess we really need a malloc/free logic
+ *`dest size must be dest_len +2
+*/
 size_t convert_charset ( charset_t from_set, charset_t to_set, charset_t cap_charset, char* src, size_t src_len, char* dest, size_t dest_len, u_int16_t *flags)
 {
        size_t i_len, o_len;
        ucs2_t *u;
-       ucs2_t buffer[MAXPATHLEN];
-       ucs2_t buffer2[MAXPATHLEN];
+       ucs2_t buffer[MAXPATHLEN +2];
+       ucs2_t buffer2[MAXPATHLEN +2];
        int composition = 0;
        
        lazy_initialize_conv();
 
        /* convert from_set to UCS2 */
        if ((size_t)(-1) == ( o_len = pull_charset_flags( from_set, cap_charset, src, src_len, 
-                                                          (char *) buffer, sizeof(buffer), flags)) ) {
+                                                          (char *) buffer, sizeof(buffer) -2, flags)) ) {
                LOG(log_error, logtype_default, "Conversion failed ( %s to CH_UCS2 )", charset_name(from_set));
                return (size_t) -1;
        }
@@ -1055,7 +1059,7 @@ size_t convert_charset ( charset_t from_set, charset_t to_set, charset_t cap_cha
        if (CHECK_FLAGS(flags, CONV_DECOMPOSE) || (charsets[to_set] && charsets[to_set]->flags & CHARSET_DECOMPOSED) )
            composition = 2;
  
-       i_len = sizeof(buffer2);
+       i_len = sizeof(buffer2) -2;
        u = buffer2;
 
        switch (composition) {
@@ -1072,6 +1076,9 @@ size_t convert_charset ( charset_t from_set, charset_t to_set, charset_t cap_cha
                return (size_t)(-1);
            break;
        }
+       /* null terminate */
+       u[i_len] = 0;
+       u[i_len +1] = 0;
                
        /* Do case conversions */       
        if (CHECK_FLAGS(flags, CONV_TOUPPER)) {
@@ -1087,6 +1094,9 @@ size_t convert_charset ( charset_t from_set, charset_t to_set, charset_t cap_cha
                       "Conversion failed (CH_UCS2 to %s):%s", charset_name(to_set), strerror(errno));
                return (size_t) -1;
        }
+       /* null terminate */
+       dest[o_len] = 0;
+       dest[o_len +1] = 0;
 
        return o_len;
 }