From: didg Date: Tue, 19 Sep 2006 01:35:45 +0000 (+0000) Subject: in unicode function convert_charset needs trailing zero, spotted by HAT X-Git-Tag: before_sfm~1 X-Git-Url: https://arthur.barton.de/gitweb/?a=commitdiff_plain;h=6dc1d33c33b947a2379654553f1e9740abbe324e;p=netatalk.git in unicode function convert_charset needs trailing zero, spotted by HAT --- diff --git a/bin/megatron/nad.c b/bin/megatron/nad.c index 8f4fbf9f..2b1c14c8 100644 --- a/bin/megatron/nad.c +++ b/bin/megatron/nad.c @@ -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( "." ); diff --git a/bin/uniconv/uniconv.c b/bin/uniconv/uniconv.c index 60b12e71..f62f33c0 100644 --- a/bin/uniconv/uniconv.c +++ b/bin/uniconv/uniconv.c @@ -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", diff --git a/etc/afpd/catsearch.c b/etc/afpd/catsearch.c index 82576652..b20dcba9 100644 --- a/etc/afpd/catsearch.c +++ b/etc/afpd/catsearch.c @@ -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)) { diff --git a/etc/afpd/desktop.c b/etc/afpd/desktop.c index 91db9151..dcefcc84 100644 --- a/etc/afpd/desktop.c +++ b/etc/afpd/desktop.c @@ -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 diff --git a/etc/afpd/mangle.c b/etc/afpd/mangle.c index 6c124b91..c00b76ba 100644 --- a/etc/afpd/mangle.c +++ b/etc/afpd/mangle.c @@ -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; diff --git a/libatalk/unicode/charcnv.c b/libatalk/unicode/charcnv.c index 67ca07a8..0071c688 100644 --- a/libatalk/unicode/charcnv.c +++ b/libatalk/unicode/charcnv.c @@ -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; }