diff libinterp/corefcn/input.cc @ 26880:6c25c714bec4 stable

Improve error checking for iconv_open. * inputcc (input_system::mfile_encoding): Check return value of iconv_open before checking errno.
author Markus Mützel <markus.muetzel@gmx.de>
date Mon, 11 Mar 2019 20:48:07 +0100
parents 00f796120a6d
children e201cf0c7360
line wrap: on
line diff
--- a/libinterp/corefcn/input.cc	Mon Mar 11 11:48:47 2019 -0700
+++ b/libinterp/corefcn/input.cc	Mon Mar 11 20:48:07 2019 +0100
@@ -517,22 +517,25 @@
                             m_mfile_encoding.end (),
                             m_mfile_encoding.begin (), ::tolower);
 
-            std::string codepage = (m_mfile_encoding.compare ("system") == 0)
+            std::string encoding = (m_mfile_encoding.compare ("system") == 0)
               ? octave_locale_charset_wrapper () : m_mfile_encoding;
 
-            // Check for valid codepage.
+            // Check for valid encoding name.
             void *codec
-              = octave_iconv_open_wrapper (codepage.c_str (), "utf-8");
+              = octave_iconv_open_wrapper (encoding.c_str (), "utf-8");
 
-            if (errno == EINVAL)
+            if (codec == reinterpret_cast<void *> (-1))
               {
                 m_mfile_encoding = saved_encoding;
-
-                error ("__mfile_encoding__: conversion from codepage '%s' not supported",
-                       codepage.c_str ());
+                if (errno == EINVAL)
+                  error ("__mfile_encoding__: conversion from encoding '%s' "
+                         "not supported", encoding.c_str ());
+                else
+                  error ("__mfile_encoding__: error %d opening encoding '%s'.",
+                         errno, encoding.c_str ());
               }
-
-            octave_iconv_close_wrapper (codec);
+            else
+              octave_iconv_close_wrapper (codec);
           }
 
       }