]> arthur.barton.de Git - netatalk.git/commitdiff
in unicode function convert_charset needs trailing zero, spotted by HAT
authordidg <didg>
Tue, 19 Sep 2006 01:35:45 +0000 (01:35 +0000)
committerdidg <didg>
Tue, 19 Sep 2006 01:35:45 +0000 (01:35 +0000)
bin/megatron/nad.c
bin/uniconv/uniconv.c
etc/afpd/catsearch.c
etc/afpd/desktop.c
etc/afpd/mangle.c
libatalk/unicode/charcnv.c

index 8f4fbf9fe562eb23392447bb5712323e7fb79721..2b1c14c8deed06c5f6f8d33c801d93b33c978bd2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: nad.c,v 1.13 2006-09-18 01:06:44 didg Exp $
+ * $Id: nad.c,v 1.14 2006-09-19 01:35:45 didg Exp $
  */
 
 #ifdef HAVE_CONFIG_H
@@ -317,7 +317,7 @@ static char *utompathiconv(char *upath)
     char        *m, *u;
     u_int16_t    flags = CONV_IGNORE | CONV_UNESCAPEHEX;
     size_t       outlen;
-    static char         mpath[MAXPATHLEN];
+    static char         mpath[MAXPATHLEN +2]; /* for convert_charset dest_len parameter +2 */
 
     m = mpath;
     outlen = strlen(upath);
@@ -352,7 +352,7 @@ char *mtoupathiconv(char *mpath)
     size_t       inplen;
     size_t       outlen;
     u_int16_t    flags = 0;
-    static char         upath[MAXPATHLEN];
+    static char         upath[MAXPATHLEN +2]; /* for convert_charset dest_len parameter +2 */
 
     if ( *mpath == '\0' ) {
         return( "." );
index 60b12e7182133674646b4e794d7bf9fff76f5ac7..f62f33c0920258b54d5b35234d5833cb1718bb17 100644 (file)
@@ -142,7 +142,7 @@ static int do_rename( char* src, char *dst, struct stat *st)
 
 static char *convert_name(char *name, struct stat *st, cnid_t cur_did)
 {
-       static char   buffer[MAXPATHLEN];
+       static char   buffer[MAXPATHLEN +2];  /* for convert_charset dest_len parameter +2 */
        size_t outlen = 0;
        unsigned char *p,*q;
        int require_conversion = 0;
@@ -171,14 +171,14 @@ static char *convert_name(char *name, struct stat *st, cnid_t cur_did)
        q=buffer;
        p=name;
 
-       outlen = convert_charset(ch_from, ch_to, ch_mac, p, strlen(p), q, sizeof(buffer), &flags);
+       outlen = convert_charset(ch_from, ch_to, ch_mac, p, strlen(p), q, sizeof(buffer) -2, &flags);
        if ((size_t)-1 == outlen) {
           if ( ch_to == CH_UTF8) {
                /* maybe name is already in UTF8? */
                flags = conv_flags;
                q = (char*) buffer;
                p = name;
-               outlen = convert_charset(ch_to, ch_to, ch_mac, p, strlen(p), q, sizeof(buffer), &flags);
+               outlen = convert_charset(ch_to, ch_to, ch_mac, p, strlen(p), q, sizeof(buffer) -2, &flags);
                if ((size_t)-1 == outlen) {
                        /* it's not UTF8... */
                        fprintf(stderr, "ERROR: conversion from '%s' to '%s' for '%s' in DID %u failed!!!\n", 
index 82576652f01c2df3c04775138c16f757fa7bf737..b20dcba9811d5c7dbc95a0149e413c23e4dc20a8 100644 (file)
@@ -97,7 +97,7 @@ struct scrit {
     u_int16_t offcnt;           /* Offspring count */
        struct finderinfo finfo;    /* Finder info */
        char lname[64];             /* Long name */ 
-       char utf8name[512];         /* UTF8 name */
+       char utf8name[514];         /* UTF8 or UCS2 name */ /* for convert_charset dest_len parameter +2 */
 };
 
 /*
@@ -258,7 +258,7 @@ static int crit_check(struct vol *vol, struct path *path) {
        struct adouble *adp = NULL;
        time_t c_date, b_date;
        u_int32_t ac_date, ab_date;
-       static char convbuf[512];
+       static char convbuf[514]; /* for convert_charset dest_len parameter +2 */
        size_t len;
 
        if (S_ISDIR(path->st.st_mode)) {
index 91db9151c4b5dfd96565181be455e763b3e94279..dcefcc849b06dade8dddbfa5b763115df2a246be 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: desktop.c,v 1.35 2006-09-18 09:22:25 didg Exp $
+ * $Id: desktop.c,v 1.36 2006-09-19 01:35:45 didg Exp $
  *
  * See COPYRIGHT.
  *
@@ -621,7 +621,7 @@ char *dtfile(const struct vol *vol, u_char creator[], char *ext )
 
 char *mtoupath(const struct vol *vol, char *mpath, cnid_t did, int utf8)
 {
-    static char  upath[ MAXPATHLEN + 1];
+    static char  upath[ MAXPATHLEN + 2]; /* for convert_charset dest_len parameter +2 */
     char       *m, *u;
     size_t       inplen;
     size_t       outlen;
@@ -661,7 +661,6 @@ char *mtoupath(const struct vol *vol, char *mpath, cnid_t did, int utf8)
         LOG(log_error, logtype_afpd, "conversion from %s to %s for %s failed.", (utf8)?"UTF8-MAC":vol->v_maccodepage, vol->v_volcodepage, mpath);
            return NULL;
     }
-    upath[outlen] = 0;
 
 #ifdef DEBUG
     LOG(log_debug, logtype_afpd, "mtoupath: '%s':'%s'", mpath, upath);
@@ -674,7 +673,7 @@ char *mtoupath(const struct vol *vol, char *mpath, cnid_t did, int utf8)
 */
 char *utompath(const struct vol *vol, char *upath, cnid_t id, int utf8)
 {
-    static char  mpath[ MAXPATHLEN + 1];
+    static char  mpath[ MAXPATHLEN + 2]; /* for convert_charset dest_len parameter +2 */
     char        *m, *u;
     u_int16_t    flags = CONV_IGNORE | CONV_UNESCAPEHEX;
     size_t       outlen;
@@ -699,7 +698,6 @@ char *utompath(const struct vol *vol, char *upath, cnid_t id, int utf8)
        goto utompath_error;
     }
 
-    mpath[outlen] = 0; 
     if (!(flags & CONV_REQMANGLE)) 
         flags = 0;
     else
index 6c124b912cb3f8590377246aacc251d52f3e1485..c00b76ba4c874c51227ef2100e64ce9d8a660bcf 100644 (file)
@@ -1,5 +1,5 @@
 /* 
- * $Id: mangle.c,v 1.18 2006-09-18 01:06:44 didg Exp $ 
+ * $Id: mangle.c,v 1.19 2006-09-19 01:35:45 didg Exp $ 
  *
  * Copyright (c) 2002. Joe Marcus Clarke (marcus@marcuscom.com)
  * All Rights Reserved.  See COPYRIGHT.
@@ -41,7 +41,7 @@ static size_t mangle_extension(const struct vol *vol, const char* uname,
 static char *demangle_checks ( const struct vol *vol, char* uname, char * mfilename, size_t prefix, char * ext)
 {
     u_int16_t flags;
-    static char buffer[MAXPATHLEN];
+    static char buffer[MAXPATHLEN +2];  /* for convert_charset dest_len parameter +2 */
     size_t len;
     size_t mfilenamelen;
 
@@ -51,7 +51,7 @@ static char *demangle_checks ( const struct vol *vol, char* uname, char * mfilen
 
     /* check whether file extensions match */
     {
-      char buf[MAX_EXT_LENGTH + 1];
+      char buf[MAX_EXT_LENGTH + 2];  /* for convert_charset dest_len parameter +2 */
       size_t ext_len = mangle_extension(vol, uname, buf, CH_UTF8_MAC);
 
       if (ext_len) {
@@ -233,9 +233,9 @@ demangle_osx(const struct vol *vol, char *mfilename, cnid_t did, cnid_t *fileid)
 char *
 mangle(const struct vol *vol, char *filename, size_t filenamelen, char *uname, cnid_t id, int flags) {
     char *m = NULL;
-    static char mfilename[MAXPATHLEN + 1];
+    static char mfilename[MAXPATHLEN]; /* way > maxlen */
     char mangle_suffix[MANGLE_LENGTH + 1];
-    char ext[MAX_EXT_LENGTH];
+    char ext[MAX_EXT_LENGTH +2];  /* for convert_charset dest_len parameter +2 */
     size_t ext_len;
     size_t maxlen;
     int k;
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;
 }