The branch, master has been updated via 9940c7690e2c1b225111d5d8e09cc735ebe296dd (commit) via 9551ab8f7b0e69349dc0c1ffb70a6f67163b242c (commit) via 7ab8f373c84c328b197f923287163e83371e7ccb (commit) via 94069bd2747a8397308c0b0b384f7bb4edd8f68b (commit) from 8568b4fa9ff8f6f1a24547ec2ed5e2942b213d9e (commit)
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit 9940c7690e2c1b225111d5d8e09cc735ebe296dd Author: Jelmer Vernooij <jel...@samba.org> Date: Sun Mar 1 22:31:10 2009 +0100 Use shared header file for character sets, remove old definitions from samba3 smb.h. commit 9551ab8f7b0e69349dc0c1ffb70a6f67163b242c Merge: 7ab8f373c84c328b197f923287163e83371e7ccb 8568b4fa9ff8f6f1a24547ec2ed5e2942b213d9e Author: Jelmer Vernooij <jel...@samba.org> Date: Sun Mar 1 22:25:57 2009 +0100 Merge branch 'master' of git://git.samba.org/samba into convenience commit 7ab8f373c84c328b197f923287163e83371e7ccb Author: Jelmer Vernooij <jel...@samba.org> Date: Sun Mar 1 22:24:34 2009 +0100 Use common header file for character set handling in Samba 3 and Samba 4. commit 94069bd2747a8397308c0b0b384f7bb4edd8f68b Author: Jelmer Vernooij <jel...@samba.org> Date: Sun Mar 1 19:55:46 2009 +0100 s4: Use same function signature for convert_* as s3. ----------------------------------------------------------------------- Summary of changes: lib/util/charset/charcnv.c | 42 +++++--- lib/util/charset/charset.h | 125 ++++++++++++++++++++--- lib/util/charset/iconv.c | 1 + lib/util/charset/tests/iconv.c | 11 +-- lib/util/charset/util_unistr.c | 44 +++++---- source3/Makefile.in | 4 +- source3/include/charset.h | 128 ------------------------ source3/include/includes.h | 2 +- source3/include/proto.h | 3 +- source3/include/smb.h | 18 ---- source3/lib/charcnv.c | 2 +- source3/lib/iconv.c | 4 +- source4/auth/ntlm/ntlm_check.c | 2 +- source4/auth/ntlmssp/ntlmssp_parse.c | 36 ++++--- source4/dsdb/common/util.c | 2 +- source4/dsdb/samdb/ldb_modules/password_hash.c | 17 ++-- source4/dsdb/schema/schema_init.c | 7 +- source4/dsdb/schema/schema_syntax.c | 24 ++--- source4/kdc/kpasswdd.c | 18 ++-- source4/lib/registry/ldb.c | 8 +- source4/lib/registry/tests/generic.c | 12 +- source4/lib/registry/util.c | 6 +- source4/lib/tdr/tdr.c | 12 +-- source4/libcli/auth/smbencrypt.c | 32 +++--- source4/libcli/raw/rawfileinfo.c | 8 +- source4/libcli/raw/rawrequest.c | 32 ++++--- source4/libcli/smb2/request.c | 18 ++-- source4/libnet/libnet_samdump.c | 4 +- source4/librpc/ndr/ndr_string.c | 56 ++++------ source4/rpc_server/samr/samr_password.c | 15 ++-- source4/smb_server/smb/request.c | 12 +- source4/torture/basic/charset.c | 5 +- source4/torture/basic/utable.c | 13 ++- source4/torture/rpc/samba3rpc.c | 2 +- source4/torture/rpc/samlogon.c | 10 +- source4/torture/rpc/spoolss_win.c | 2 +- source4/torture/rpc/wkssvc.c | 2 +- 37 files changed, 345 insertions(+), 394 deletions(-) delete mode 100644 source3/include/charset.h Changeset truncated at 500 lines: diff --git a/lib/util/charset/charcnv.c b/lib/util/charset/charcnv.c index 18be2bc..258730e 100644 --- a/lib/util/charset/charcnv.c +++ b/lib/util/charset/charcnv.c @@ -186,7 +186,7 @@ convert: destlen = 2 + (destlen*3); ob = talloc_realloc(ctx, outbuf, char, destlen); if (!ob) { - DEBUG(0, ("convert_string_talloc: realloc failed!\n")); + DEBUG(0, ("iconv_talloc: realloc failed!\n")); talloc_free(outbuf); return (size_t)-1; } else { @@ -237,10 +237,11 @@ convert: * @param destlen maximal length allowed for string * @returns the number of bytes occupied in the destination **/ -_PUBLIC_ ssize_t convert_string_convenience(struct smb_iconv_convenience *ic, +_PUBLIC_ bool convert_string_convenience(struct smb_iconv_convenience *ic, charset_t from, charset_t to, void const *src, size_t srclen, - void *dest, size_t destlen, bool allow_badcharcnv) + void *dest, size_t destlen, size_t *converted_size, + bool allow_badcharcnv) { size_t i_len, o_len; size_t retval; @@ -249,7 +250,8 @@ _PUBLIC_ ssize_t convert_string_convenience(struct smb_iconv_convenience *ic, smb_iconv_t descriptor; if (allow_badcharcnv) { - return -1; + /* Not implemented yet */ + return false; } if (srclen == (size_t)-1) @@ -261,7 +263,8 @@ _PUBLIC_ ssize_t convert_string_convenience(struct smb_iconv_convenience *ic, /* conversion not supported, use as is */ size_t len = MIN(srclen,destlen); memcpy(dest,src,len); - return len; + *converted_size = len; + return true; } i_len=srclen; @@ -272,7 +275,7 @@ _PUBLIC_ ssize_t convert_string_convenience(struct smb_iconv_convenience *ic, switch(errno) { case EINVAL: reason="Incomplete multibyte sequence"; - return -1; + return false; case E2BIG: reason="No more room"; if (from == CH_UNIX) { @@ -285,14 +288,16 @@ _PUBLIC_ ssize_t convert_string_convenience(struct smb_iconv_convenience *ic, charset_name(ic, from), charset_name(ic, to), (int)srclen, (int)destlen)); } - return -1; + return false; case EILSEQ: reason="Illegal multibyte sequence"; - return -1; + return false; } /* smb_panic(reason); */ } - return destlen-o_len; + if (converted_size != NULL) + *converted_size = destlen-o_len; + return true; } /** @@ -305,21 +310,23 @@ _PUBLIC_ ssize_t convert_string_convenience(struct smb_iconv_convenience *ic, * @returns Size in bytes of the converted string; or -1 in case of error. **/ -_PUBLIC_ ssize_t convert_string_talloc_convenience(TALLOC_CTX *ctx, +_PUBLIC_ bool convert_string_talloc_convenience(TALLOC_CTX *ctx, struct smb_iconv_convenience *ic, charset_t from, charset_t to, void const *src, size_t srclen, - void **dest, bool allow_badcharcnv) + void **dest, size_t *converted_size, + bool allow_badcharcnv) { smb_iconv_t descriptor; + ssize_t ret; if (allow_badcharcnv) - return (size_t)-1; + return false; /* Not implemented yet */ *dest = NULL; if (src == NULL || srclen == (size_t)-1 || srclen == 0) - return (size_t)-1; + return false; descriptor = get_conv_handle(ic, from, to); @@ -328,10 +335,15 @@ _PUBLIC_ ssize_t convert_string_talloc_convenience(TALLOC_CTX *ctx, DEBUG(3, ("convert_string_talloc: conversion from %s to %s not supported!\n", charset_name(ic, from), charset_name(ic, to))); - return -1; + return false; } - return iconv_talloc(ctx, descriptor, src, srclen, dest); + ret = iconv_talloc(ctx, descriptor, src, srclen, dest); + if (ret == -1) + return false; + if (converted_size != NULL) + *converted_size = ret; + return true; } /* diff --git a/lib/util/charset/charset.h b/lib/util/charset/charset.h index 3acdde3..655bae7 100644 --- a/lib/util/charset/charset.h +++ b/lib/util/charset/charset.h @@ -28,9 +28,16 @@ #include <talloc.h> /* this defines the charset types used in samba */ -typedef enum {CH_UTF16=0, CH_UNIX, CH_DOS, CH_UTF8, CH_UTF16BE, CH_UTF16MUNGED} charset_t; +typedef enum {CH_UTF16LE=0, CH_UTF16=0, CH_UNIX, CH_DISPLAY, CH_DOS, CH_UTF8, CH_UTF16BE, CH_UTF16MUNGED} charset_t; -#define NUM_CHARSETS 6 +#define NUM_CHARSETS 7 + +/* + * SMB UCS2 (16-bit unicode) internal type. + * smb_ucs2_t is *always* in little endian format. + */ + +typedef uint16_t smb_ucs2_t; /* * for each charset we have a function that pulls from that charset to @@ -51,6 +58,17 @@ typedef uint32_t codepoint_t; #define INVALID_CODEPOINT ((codepoint_t)-1) +/* + * This is auxiliary struct used by source/script/gen-8-bit-gap.sh script + * during generation of an encoding table for charset module + * */ + +struct charset_gap_table { + uint16_t start; + uint16_t end; + int32_t idx; +}; + /* generic iconv conversion structure */ typedef struct smb_iconv_s { @@ -106,19 +124,20 @@ bool strhaslower(const char *string); char *strrchr_m(const char *s, char c); char *strchr_m(const char *s, char c); -ssize_t push_ascii_talloc(TALLOC_CTX *ctx, char **dest, const char *src); -ssize_t push_ucs2_talloc(TALLOC_CTX *ctx, void **dest, const char *src); -ssize_t push_utf8_talloc(TALLOC_CTX *ctx, char **dest, const char *src); -ssize_t pull_ascii_talloc(TALLOC_CTX *ctx, char **dest, const char *src); -ssize_t pull_ucs2_talloc(TALLOC_CTX *ctx, char **dest, const void *src); -ssize_t pull_utf8_talloc(TALLOC_CTX *ctx, char **dest, const char *src); +bool push_ascii_talloc(TALLOC_CTX *ctx, char **dest, const char *src, size_t *converted_size); +bool push_ucs2_talloc(TALLOC_CTX *ctx, smb_ucs2_t **dest, const char *src, size_t *converted_size); +bool push_utf8_talloc(TALLOC_CTX *ctx, char **dest, const char *src, size_t *converted_size); +bool pull_ascii_talloc(TALLOC_CTX *ctx, char **dest, const char *src, size_t *converted_size); +bool pull_ucs2_talloc(TALLOC_CTX *ctx, char **dest, const smb_ucs2_t *src, size_t *converted_size); +bool pull_utf8_talloc(TALLOC_CTX *ctx, char **dest, const char *src, size_t *converted_size); ssize_t push_string(void *dest, const char *src, size_t dest_len, int flags); ssize_t pull_string(char *dest, const void *src, size_t dest_len, size_t src_len, int flags); -ssize_t convert_string_talloc(TALLOC_CTX *ctx, +bool convert_string_talloc(TALLOC_CTX *ctx, charset_t from, charset_t to, void const *src, size_t srclen, - void **dest, bool allow_badcharcnv); + void **dest, size_t *converted_size, + bool allow_badcharcnv); size_t convert_string(charset_t from, charset_t to, void const *src, size_t srclen, @@ -148,15 +167,16 @@ struct smb_iconv_convenience *smb_iconv_convenience_init(TALLOC_CTX *mem_ctx, const char *unix_charset, bool native_iconv); -ssize_t convert_string_convenience(struct smb_iconv_convenience *ic, +bool convert_string_convenience(struct smb_iconv_convenience *ic, charset_t from, charset_t to, void const *src, size_t srclen, - void *dest, size_t destlen, bool allow_badcharcnv); -ssize_t convert_string_talloc_convenience(TALLOC_CTX *ctx, + void *dest, size_t destlen, size_t *converted_size, + bool allow_badcharcnv); +bool convert_string_talloc_convenience(TALLOC_CTX *ctx, struct smb_iconv_convenience *ic, charset_t from, charset_t to, void const *src, size_t srclen, - void **dest, bool allow_badcharcnv); + void **dest, size_t *converted_size, bool allow_badcharcnv); /* iconv */ smb_iconv_t smb_iconv_open(const char *tocode, const char *fromcode); int smb_iconv_close(smb_iconv_t cd); @@ -169,4 +189,81 @@ smb_iconv_t smb_iconv_open_ex(TALLOC_CTX *mem_ctx, const char *tocode, void load_case_tables(void); bool charset_register_backend(const void *_funcs); +/* + * Define stub for charset module which implements 8-bit encoding with gaps. + * Encoding tables for such module should be produced from glibc's CHARMAPs + * using script source/script/gen-8bit-gap.sh + * CHARSETNAME is CAPITALIZED charset name + * + * */ +#define SMB_GENERATE_CHARSET_MODULE_8_BIT_GAP(CHARSETNAME) \ +static size_t CHARSETNAME ## _push(void *cd, const char **inbuf, size_t *inbytesleft, \ + char **outbuf, size_t *outbytesleft) \ +{ \ + while (*inbytesleft >= 2 && *outbytesleft >= 1) { \ + int i; \ + int done = 0; \ + \ + uint16 ch = SVAL(*inbuf,0); \ + \ + for (i=0; from_idx[i].start != 0xffff; i++) { \ + if ((from_idx[i].start <= ch) && (from_idx[i].end >= ch)) { \ + ((unsigned char*)(*outbuf))[0] = from_ucs2[from_idx[i].idx+ch]; \ + (*inbytesleft) -= 2; \ + (*outbytesleft) -= 1; \ + (*inbuf) += 2; \ + (*outbuf) += 1; \ + done = 1; \ + break; \ + } \ + } \ + if (!done) { \ + errno = EINVAL; \ + return -1; \ + } \ + \ + } \ + \ + if (*inbytesleft == 1) { \ + errno = EINVAL; \ + return -1; \ + } \ + \ + if (*inbytesleft > 1) { \ + errno = E2BIG; \ + return -1; \ + } \ + \ + return 0; \ +} \ + \ +static size_t CHARSETNAME ## _pull(void *cd, const char **inbuf, size_t *inbytesleft, \ + char **outbuf, size_t *outbytesleft) \ +{ \ + while (*inbytesleft >= 1 && *outbytesleft >= 2) { \ + *(uint16*)(*outbuf) = to_ucs2[((unsigned char*)(*inbuf))[0]]; \ + (*inbytesleft) -= 1; \ + (*outbytesleft) -= 2; \ + (*inbuf) += 1; \ + (*outbuf) += 2; \ + } \ + \ + if (*inbytesleft > 0) { \ + errno = E2BIG; \ + return -1; \ + } \ + \ + return 0; \ +} \ + \ +struct charset_functions CHARSETNAME ## _functions = \ + {#CHARSETNAME, CHARSETNAME ## _pull, CHARSETNAME ## _push}; \ + \ +NTSTATUS charset_ ## CHARSETNAME ## _init(void); \ +NTSTATUS charset_ ## CHARSETNAME ## _init(void) \ +{ \ + return smb_register_charset(& CHARSETNAME ## _functions); \ +} \ + + #endif /* __CHARSET_H__ */ diff --git a/lib/util/charset/iconv.c b/lib/util/charset/iconv.c index b6842a4..98284ce 100644 --- a/lib/util/charset/iconv.c +++ b/lib/util/charset/iconv.c @@ -22,6 +22,7 @@ #include "../lib/util/dlinklist.h" #include "system/iconv.h" #include "system/filesys.h" +#undef strcasecmp /** diff --git a/lib/util/charset/tests/iconv.c b/lib/util/charset/tests/iconv.c index fbe7b10..091876f 100644 --- a/lib/util/charset/tests/iconv.c +++ b/lib/util/charset/tests/iconv.c @@ -404,12 +404,12 @@ static bool test_string2key(struct torture_context *tctx) uint16_t *buf; char *dest = NULL; TALLOC_CTX *mem_ctx = talloc_new(tctx); - ssize_t ret; size_t len = (random()%1000)+1; const uint16_t in1[10] = { 'a', 0xd805, 'b', 0xdcf0, 'c', 0, 'd', 'e', 'f', 'g' }; uint8_t le1[20]; uint8_t *munged1; uint8_t *out1; + size_t ret; int i; const char *correct = "a\357\277\275b\357\277\275c\001defg"; @@ -418,8 +418,7 @@ static bool test_string2key(struct torture_context *tctx) torture_comment(tctx, "converting random buffer\n"); - ret = convert_string_talloc(mem_ctx, CH_UTF16MUNGED, CH_UTF8, (void *)buf, len*2, (void**)&dest, false); - if (ret == -1) { + if (!convert_string_talloc(mem_ctx, CH_UTF16MUNGED, CH_UTF8, (void *)buf, len*2, (void**)&dest, &ret, false)) { torture_fail(tctx, "Failed to convert random buffer\n"); } @@ -429,8 +428,7 @@ static bool test_string2key(struct torture_context *tctx) torture_comment(tctx, "converting fixed buffer to UTF16\n"); - ret = convert_string_talloc(mem_ctx, CH_UTF16MUNGED, CH_UTF16, (void *)le1, 20, (void**)&munged1, false); - if (ret == -1) { + if (!convert_string_talloc(mem_ctx, CH_UTF16MUNGED, CH_UTF16, (void *)le1, 20, (void**)&munged1, &ret, false)) { torture_fail(tctx, "Failed to convert fixed buffer to UTF16_MUNGED\n"); } @@ -438,8 +436,7 @@ static bool test_string2key(struct torture_context *tctx) torture_comment(tctx, "converting fixed buffer to UTF8\n"); - ret = convert_string_talloc(mem_ctx, CH_UTF16MUNGED, CH_UTF8, (void *)le1, 20, (void**)&out1, false); - if (ret == -1) { + if (!convert_string_talloc(mem_ctx, CH_UTF16MUNGED, CH_UTF8, (void *)le1, 20, (void**)&out1, &ret, false)) { torture_fail(tctx, "Failed to convert fixed buffer to UTF8\n"); } diff --git a/lib/util/charset/util_unistr.c b/lib/util/charset/util_unistr.c index 96c9873..ec88e78 100644 --- a/lib/util/charset/util_unistr.c +++ b/lib/util/charset/util_unistr.c @@ -668,11 +668,11 @@ static ssize_t push_ascii(void *dest, const char *src, size_t dest_len, int flag * @returns The number of bytes occupied by the string in the destination * or -1 in case of error. **/ -_PUBLIC_ ssize_t push_ascii_talloc(TALLOC_CTX *ctx, char **dest, const char *src) +_PUBLIC_ bool push_ascii_talloc(TALLOC_CTX *ctx, char **dest, const char *src, size_t *converted_size) { size_t src_len = strlen(src)+1; *dest = NULL; - return convert_string_talloc(ctx, CH_UNIX, CH_DOS, src, src_len, (void **)dest, false); + return convert_string_talloc(ctx, CH_UNIX, CH_DOS, src, src_len, (void **)dest, converted_size, false); } @@ -779,11 +779,11 @@ static ssize_t push_ucs2(void *dest, const char *src, size_t dest_len, int flags * @returns The number of bytes occupied by the string in the destination * or -1 in case of error. **/ -_PUBLIC_ ssize_t push_ucs2_talloc(TALLOC_CTX *ctx, void **dest, const char *src) +_PUBLIC_ bool push_ucs2_talloc(TALLOC_CTX *ctx, smb_ucs2_t **dest, const char *src, size_t *converted_size) { size_t src_len = strlen(src)+1; *dest = NULL; - return convert_string_talloc(ctx, CH_UNIX, CH_UTF16, src, src_len, dest, false); + return convert_string_talloc(ctx, CH_UNIX, CH_UTF16, src, src_len, (void **)dest, converted_size, false); } @@ -795,11 +795,11 @@ _PUBLIC_ ssize_t push_ucs2_talloc(TALLOC_CTX *ctx, void **dest, const char *src) * @returns The number of bytes occupied by the string in the destination **/ -_PUBLIC_ ssize_t push_utf8_talloc(TALLOC_CTX *ctx, char **dest, const char *src) +_PUBLIC_ bool push_utf8_talloc(TALLOC_CTX *ctx, char **dest, const char *src, size_t *converted_size) { size_t src_len = strlen(src)+1; *dest = NULL; - return convert_string_talloc(ctx, CH_UNIX, CH_UTF8, src, src_len, (void **)dest, false); + return convert_string_talloc(ctx, CH_UNIX, CH_UTF8, src, src_len, (void **)dest, converted_size, false); } /** @@ -850,11 +850,11 @@ static size_t pull_ucs2(char *dest, const void *src, size_t dest_len, size_t src * @returns The number of bytes occupied by the string in the destination **/ -_PUBLIC_ ssize_t pull_ascii_talloc(TALLOC_CTX *ctx, char **dest, const char *src) +_PUBLIC_ bool pull_ascii_talloc(TALLOC_CTX *ctx, char **dest, const char *src, size_t *converted_size) { size_t src_len = strlen(src)+1; *dest = NULL; - return convert_string_talloc(ctx, CH_DOS, CH_UNIX, src, src_len, (void **)dest, false); + return convert_string_talloc(ctx, CH_DOS, CH_UNIX, src, src_len, (void **)dest, converted_size, false); } /** @@ -865,11 +865,11 @@ _PUBLIC_ ssize_t pull_ascii_talloc(TALLOC_CTX *ctx, char **dest, const char *src * @returns The number of bytes occupied by the string in the destination **/ -_PUBLIC_ ssize_t pull_ucs2_talloc(TALLOC_CTX *ctx, char **dest, const void *src) +_PUBLIC_ bool pull_ucs2_talloc(TALLOC_CTX *ctx, char **dest, const smb_ucs2_t *src, size_t *converted_size) { size_t src_len = utf16_len(src); *dest = NULL; - return convert_string_talloc(ctx, CH_UTF16, CH_UNIX, src, src_len, (void **)dest, false); + return convert_string_talloc(ctx, CH_UTF16, CH_UNIX, src, src_len, (void **)dest, converted_size, false); } /** @@ -880,11 +880,11 @@ _PUBLIC_ ssize_t pull_ucs2_talloc(TALLOC_CTX *ctx, char **dest, const void *src) * @returns The number of bytes occupied by the string in the destination **/ -_PUBLIC_ ssize_t pull_utf8_talloc(TALLOC_CTX *ctx, char **dest, const char *src) +_PUBLIC_ bool pull_utf8_talloc(TALLOC_CTX *ctx, char **dest, const char *src, size_t *converted_size) { size_t src_len = strlen(src)+1; *dest = NULL; - return convert_string_talloc(ctx, CH_UTF8, CH_UNIX, src, src_len, (void **)dest, false); + return convert_string_talloc(ctx, CH_UTF8, CH_UNIX, src, src_len, (void **)dest, converted_size, false); } /** @@ -952,11 +952,16 @@ _PUBLIC_ ssize_t pull_string(char *dest, const void *src, size_t dest_len, size_ **/ _PUBLIC_ size_t convert_string(charset_t from, charset_t to, void const *src, size_t srclen, - void *dest, size_t destlen, bool allow_badcharcnv) + void *dest, size_t destlen, + bool allow_badcharcnv) { - return convert_string_convenience(get_iconv_convenience(), from, to, + size_t ret; + if (!convert_string_convenience(get_iconv_convenience(), from, to, src, srclen, - dest, destlen, allow_badcharcnv); + dest, destlen, &ret, + allow_badcharcnv)) + return -1; + return ret; } /** @@ -964,18 +969,21 @@ _PUBLIC_ size_t convert_string(charset_t from, charset_t to, * * @param srclen length of source buffer. * @param dest always set at least to NULL + * @param converted_size Size in bytes of the converted string * @note -1 is not accepted for srclen. * - * @returns Size in bytes of the converted string; or -1 in case of error. + * @returns boolean indication whether the conversion succeeded **/ -_PUBLIC_ ssize_t convert_string_talloc(TALLOC_CTX *ctx, +_PUBLIC_ bool convert_string_talloc(TALLOC_CTX *ctx, charset_t from, charset_t to, void const *src, size_t srclen, - void **dest, bool allow_badcharcnv) + void **dest, size_t *converted_size, + bool allow_badcharcnv) { return convert_string_talloc_convenience(ctx, get_iconv_convenience(), from, to, src, srclen, dest, + converted_size, allow_badcharcnv); } diff --git a/source3/Makefile.in b/source3/Makefile.in index f127255..abf6cfb 100644 --- a/source3/Makefile.in +++ b/source3/Makefile.in @@ -366,8 +366,8 @@ LIB_OBJ = $(LIBSAMBAUTIL_OBJ) $(UTIL_OBJ) $(CRYPTO_OBJ) \ lib/substitute.o lib/dbwrap_util.o \ lib/ms_fnmatch.o lib/select.o lib/errmap_unix.o \ lib/tallocmsg.o lib/dmallocmsg.o libsmb/smb_signing.o \ - lib/iconv.o lib/pam_errors.o intl/lang_tdb.o lib/conn_tdb.o \ - lib/adt_tree.o lib/gencache.o \ + ../lib/util/charset/iconv.o lib/pam_errors.o intl/lang_tdb.o \ + lib/conn_tdb.o lib/adt_tree.o lib/gencache.o \ -- Samba Shared Repository