X-Git-Url: http://git.sven.stormbind.net/?p=sven%2Fexfat-utils.git;a=blobdiff_plain;f=libexfat%2Futf.c;h=d8968dbdcf6b377ec9d7236091908e6eb8de401a;hp=98ae52dbebc19445048025e39304ce719584581d;hb=2fa6c5654e0a345af10df5227b77d9f468759f20;hpb=0e295d91bb7f18afee1a0b0d587e5a0cf58bf2fb diff --git a/libexfat/utf.c b/libexfat/utf.c index 98ae52d..d8968db 100644 --- a/libexfat/utf.c +++ b/libexfat/utf.c @@ -3,7 +3,7 @@ exFAT file system implementation library. Free exFAT implementation. - Copyright (C) 2010-2016 Andrew Nayenko + Copyright (C) 2010-2017 Andrew Nayenko This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -108,7 +108,7 @@ int utf16_to_utf8(char* output, const le16_t* input, size_t outsize, char* outp = output; wchar_t wc; - while (inp - input < insize && le16_to_cpu(*inp)) + while (inp - input < insize) { inp = utf16_to_wchar(inp, &wc, insize - (inp - input)); if (inp == NULL) @@ -122,6 +122,13 @@ int utf16_to_utf8(char* output, const le16_t* input, size_t outsize, exfat_error("name is too long"); return -ENAMETOOLONG; } + if (wc == 0) + return 0; + } + if (outp - output >= outsize) + { + exfat_error("name is too long"); + return -ENAMETOOLONG; } *outp = '\0'; return 0; @@ -202,7 +209,7 @@ int utf8_to_utf16(le16_t* output, const char* input, size_t outsize, le16_t* outp = output; wchar_t wc; - while (inp - input < insize && *inp) + while (inp - input < insize) { inp = utf8_to_wchar(inp, &wc, insize - (inp - input)); if (inp == NULL) @@ -216,6 +223,13 @@ int utf8_to_utf16(le16_t* output, const char* input, size_t outsize, exfat_error("name is too long"); return -ENAMETOOLONG; } + if (wc == 0) + break; + } + if (outp - output >= outsize) + { + exfat_error("name is too long"); + return -ENAMETOOLONG; } *outp = cpu_to_le16(0); return 0;