aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--iconv/gconv_db.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/iconv/gconv_db.c b/iconv/gconv_db.c
index 9fe0759..8879fe0 100644
--- a/iconv/gconv_db.c
+++ b/iconv/gconv_db.c
@@ -613,7 +613,8 @@ find_derivation (const char *toset, const char *toset_expand,
int
internal_function
__gconv_find_transform (const char *toset, const char *fromset,
- struct __gconv_step **handle, size_t *nsteps)
+ struct __gconv_step **handle, size_t *nsteps,
+ int flags)
{
__libc_once_define (static, once);
const char *fromset_expand = NULL;
@@ -648,6 +649,21 @@ __gconv_find_transform (const char *toset, const char *fromset,
toset_expand = found != NULL ? (*found)->toname : NULL;
}
+ if ((flags & GCONV_AVOID_NOCONV)
+ /* We are not supposed to create a pseudo transformation (means
+ copying) when the input and output character set are the same. */
+ && (strcmp (toset, fromset) == 0
+ || (toset_expand != NULL && strcmp (toset_expand, fromset) == 0)
+ || (fromset_expand != NULL
+ && (strcmp (toset, fromset_expand) == 0
+ || (toset_expand != NULL
+ && strcmp (toset_expand, fromset_expand) == 0)))))
+ {
+ /* Both character sets are the same. */
+ __libc_lock_unlock (lock);
+ return __GCONV_NOCONV;
+ }
+
result = find_derivation (toset, toset_expand, fromset, fromset_expand,
handle, nsteps);