iconv: restore verbosity with unrecognized encoding names (bug 30694)

Message ID mvmfs52kdho.fsf@suse.de
State Committed
Commit fc72b6d7d818ab2868920af956d1542d03342a4d
Headers
Series iconv: restore verbosity with unrecognized encoding names (bug 30694) |

Checks

Context Check Description
redhat-pt-bot/TryBot-apply_patch success Patch applied to master at the time it was sent
redhat-pt-bot/TryBot-32bit success Build for i686
linaro-tcwg-bot/tcwg_glibc_check--master-arm success Testing passed
linaro-tcwg-bot/tcwg_glibc_build--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_glibc_check--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_glibc_build--master-arm success Testing passed

Commit Message

Andreas Schwab Aug. 1, 2023, 3:07 p.m. UTC
  Commit 91927b7c76 ("Rewrite iconv option parsing [BZ #19519]") changed the
iconv program to call __gconv_open directly instead of the iconv_open
wrapper, but the former does not set errno.  Update the caller to
interpret the return codes like iconv_open does.
---
 iconv/iconv_prog.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
  

Comments

Arjun Shankar Aug. 2, 2023, 11:05 a.m. UTC | #1
Hi Andreas,

> Commit 91927b7c76 ("Rewrite iconv option parsing [BZ #19519]") changed the
> iconv program to call __gconv_open directly instead of the iconv_open
> wrapper, but the former does not set errno.  Update the caller to
> interpret the return codes like iconv_open does.
> ---
>  iconv/iconv_prog.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/iconv/iconv_prog.c b/iconv/iconv_prog.c
> index bee898c63c..cf32cf9b44 100644
> --- a/iconv/iconv_prog.c
> +++ b/iconv/iconv_prog.c
> @@ -187,7 +187,7 @@ main (int argc, char *argv[])
>
>        if (res != __GCONV_OK)
>         {
> -         if (errno == EINVAL)
> +         if (res == __GCONV_NOCONV || res == __GCONV_NODB)
>             {
>               /* Try to be nice with the user and tell her which of the
>                  two encoding names is wrong.  This is possible because

OK. errno could have changed in ways we don't know since the
assignment we actually care about, but res contains the correct reason
returned by __gconv_open. This also aligns with iconv_open where we
set errno (as required by the standard) after checking the value of
res.

This looks good to me. Thanks!

Reviewed-by: Arjun Shankar <arjun@redhat.com>
  

Patch

diff --git a/iconv/iconv_prog.c b/iconv/iconv_prog.c
index bee898c63c..cf32cf9b44 100644
--- a/iconv/iconv_prog.c
+++ b/iconv/iconv_prog.c
@@ -187,7 +187,7 @@  main (int argc, char *argv[])
 
       if (res != __GCONV_OK)
 	{
-	  if (errno == EINVAL)
+	  if (res == __GCONV_NOCONV || res == __GCONV_NODB)
 	    {
 	      /* Try to be nice with the user and tell her which of the
 		 two encoding names is wrong.  This is possible because