]> granicus.if.org Git - ejabberd/commitdiff
Gracefully report invalid encoding of a translation file
authorEvgeny Khramtsov <ekhramtsov@process-one.net>
Wed, 10 Jul 2019 21:04:32 +0000 (00:04 +0300)
committerEvgeny Khramtsov <ekhramtsov@process-one.net>
Wed, 10 Jul 2019 21:04:32 +0000 (00:04 +0300)
src/translate.erl

index 562df38d8611e64b43a8b1b93ac73f638393d9cc..12d5b6c044c889107568d5aa2df1d24e8df9ac76 100644 (file)
@@ -40,7 +40,8 @@
 -define(ZERO_DATETIME, {{0,0,0}, {0,0,0}}).
 
 -type error_reason() :: file:posix() | {integer(), module(), term()} |
-                       badarg | terminated | system_limit | bad_file.
+                       badarg | terminated | system_limit | bad_file |
+                       bad_encoding.
 
 -record(state, {}).
 
@@ -146,9 +147,13 @@ load_file(File) ->
        {ok, Lines} ->
            lists:map(
              fun({In, Out}) ->
-                     InB = iolist_to_binary(In),
-                     OutB = iolist_to_binary(Out),
-                     {{Lang, InB}, OutB};
+                     try
+                         InB = unicode:characters_to_binary(In, utf8),
+                         OutB = unicode:characters_to_binary(Out, utf8),
+                         {{Lang, InB}, OutB}
+                     catch _:badarg ->
+                             {error, File, bad_encoding}
+                     end;
                 (_) ->
                      {error, File, bad_file}
              end, Lines);
@@ -289,6 +294,8 @@ lang_of_file(FileName) ->
 -spec format_error(error_reason()) -> string().
 format_error(bad_file) ->
     "corrupted or invalid translation file";
+format_error(bad_encoding) ->
+    "not an UTF-8 encoding";
 format_error({_, _, _} = Reason) ->
     "at line " ++ file:format_error(Reason);
 format_error(Reason) ->