misc/183153: [patch] Fix iconv support of mount_smbfs
Dominic Fandrey
kamikaze at bsdforen.de
Mon Oct 21 11:30:01 UTC 2013
>Number: 183153
>Category: misc
>Synopsis: [patch] Fix iconv support of mount_smbfs
>Confidential: no
>Severity: non-critical
>Priority: low
>Responsible: freebsd-bugs
>State: open
>Quarter:
>Keywords:
>Date-Required:
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Mon Oct 21 11:30:00 UTC 2013
>Closed-Date:
>Last-Modified:
>Originator: Dominic Fandrey
>Release: stable/10
>Organization:
private
>Environment:
FreeBSD mobileKamikaze.norad 10.0-BETA1 FreeBSD 10.0-BETA1 #0 r256685: Fri Oct 18 01:18:29 CEST 2013 root at mobileKamikaze.norad:/usr/obj/HP6510b-10/amd64/usr/src/sys/HP6510b-10 amd64
>Description:
mount_smb fails when trying to perform charset conversions with the -E argument:
mount_smbfs: Unable to load iconv library: Shared object "libiconv.so" not found, required by "mount_smbfs"
: No error: 0
mount_smbfs: can't initialize iconv support (UTF-8:850): syserr = No such file or directory
>How-To-Repeat:
mount_smbfs -E UTF-8:850 /from /to
>Fix:
The attached patch gets rid of dlopen() and uses base system iconv support instead.
Patch attached with submission follows:
Index: contrib/smbfs/lib/smb/nls.c
===================================================================
--- contrib/smbfs/lib/smb/nls.c (revision 256833)
+++ contrib/smbfs/lib/smb/nls.c (working copy)
@@ -36,12 +36,9 @@
__FBSDID("$FreeBSD$");
#include <sys/types.h>
-#include <sys/iconv.h>
+#include <iconv.h>
#include <sys/sysctl.h>
#include <ctype.h>
-#ifndef APPLE
-#include <dlfcn.h>
-#endif
#include <errno.h>
#include <stdio.h>
#include <string.h>
@@ -50,21 +47,10 @@
#include <err.h>
#include <netsmb/smb_lib.h>
-/*
- * prototype iconv* functions
- */
-typedef void *iconv_t;
-
-static iconv_t (*my_iconv_open)(const char *, const char *);
-static size_t(*my_iconv)(iconv_t, const char **, size_t *, char **, size_t *);
-static int(*my_iconv_close)(iconv_t);
-
u_char nls_lower[256];
u_char nls_upper[256];
static iconv_t nls_toext, nls_toloc;
-static int iconv_loaded;
-static void *iconv_lib;
int
nls_setlocale(const char *name)
@@ -90,32 +76,18 @@
#else
iconv_t icd;
- if (iconv_loaded == 2)
- return ENOENT;
- else if (iconv_loaded == 0) {
- iconv_loaded++;
- iconv_lib = dlopen("libiconv.so", RTLD_LAZY | RTLD_GLOBAL);
- if (iconv_lib == NULL) {
- warn("Unable to load iconv library: %s\n", dlerror());
- iconv_loaded++;
- return ENOENT;
- }
- my_iconv_open = dlsym(iconv_lib, "iconv_open");
- my_iconv = dlsym(iconv_lib, "iconv");
- my_iconv_close = dlsym(iconv_lib, "iconv_close");
- }
if (nls_toext)
- my_iconv_close(nls_toext);
+ iconv_close(nls_toext);
if (nls_toloc)
- my_iconv_close(nls_toloc);
+ iconv_close(nls_toloc);
nls_toext = nls_toloc = (iconv_t)0;
- icd = my_iconv_open(external, local);
+ icd = iconv_open(external, local);
if (icd == (iconv_t)-1)
return errno;
nls_toext = icd;
- icd = my_iconv_open(local, external);
+ icd = iconv_open(local, external);
if (icd == (iconv_t)-1) {
- my_iconv_close(nls_toext);
+ iconv_close(nls_toext);
nls_toext = (iconv_t)0;
return errno;
}
@@ -130,14 +102,11 @@
char *p = dst;
size_t inlen, outlen;
- if (!iconv_loaded)
- return strcpy(dst, src);
-
if (nls_toloc == (iconv_t)0)
return strcpy(dst, src);
inlen = outlen = strlen(src);
- my_iconv(nls_toloc, NULL, NULL, &p, &outlen);
- while (my_iconv(nls_toloc, &src, &inlen, &p, &outlen) == -1) {
+ iconv(nls_toloc, NULL, NULL, &p, &outlen);
+ while (iconv(nls_toloc, &src, &inlen, &p, &outlen) == -1) {
*p++ = *src++;
inlen--;
outlen--;
@@ -152,14 +121,11 @@
char *p = dst;
size_t inlen, outlen;
- if (!iconv_loaded)
- return strcpy(dst, src);
-
if (nls_toext == (iconv_t)0)
return strcpy(dst, src);
inlen = outlen = strlen(src);
- my_iconv(nls_toext, NULL, NULL, &p, &outlen);
- while (my_iconv(nls_toext, &src, &inlen, &p, &outlen) == -1) {
+ iconv(nls_toext, NULL, NULL, &p, &outlen);
+ while (iconv(nls_toext, &src, &inlen, &p, &outlen) == -1) {
*p++ = *src++;
inlen--;
outlen--;
@@ -175,9 +141,6 @@
const char *s = src;
size_t inlen, outlen;
- if (!iconv_loaded)
- return memcpy(dst, src, size);
-
if (size == 0)
return NULL;
@@ -184,8 +147,8 @@
if (nls_toloc == (iconv_t)0)
return memcpy(dst, src, size);
inlen = outlen = size;
- my_iconv(nls_toloc, NULL, NULL, &p, &outlen);
- while (my_iconv(nls_toloc, &s, &inlen, &p, &outlen) == -1) {
+ iconv(nls_toloc, NULL, NULL, &p, &outlen);
+ while (iconv(nls_toloc, &s, &inlen, &p, &outlen) == -1) {
*p++ = *s++;
inlen--;
outlen--;
@@ -203,12 +166,12 @@
if (size == 0)
return NULL;
- if (!iconv_loaded || nls_toext == (iconv_t)0)
+ if (nls_toext == (iconv_t)0)
return memcpy(dst, src, size);
inlen = outlen = size;
- my_iconv(nls_toext, NULL, NULL, &p, &outlen);
- while (my_iconv(nls_toext, &s, &inlen, &p, &outlen) == -1) {
+ iconv(nls_toext, NULL, NULL, &p, &outlen);
+ while (iconv(nls_toext, &s, &inlen, &p, &outlen) == -1) {
*p++ = *s++;
inlen--;
outlen--;
Index: usr.sbin/mount_smbfs/Makefile
===================================================================
--- usr.sbin/mount_smbfs/Makefile (revision 256833)
+++ usr.sbin/mount_smbfs/Makefile (working copy)
@@ -11,11 +11,6 @@
LDADD= -lsmb -lkiconv
DPADD= ${LIBSMB} ${LIBKICONV}
-# Needs to be dynamically linked for optional dlopen() access to
-# userland libiconv (see the -E option).
-#
-NO_SHARED?= NO
-
.PATH: ${CONTRIBDIR}/mount_smbfs
.PATH: ${MOUNTDIR}
>Release-Note:
>Audit-Trail:
>Unformatted:
More information about the freebsd-bugs
mailing list