X-Git-Url: https://git.sven.stormbind.net/?p=sven%2Fexfat-utils.git;a=blobdiff_plain;f=libexfat%2Futf.c;h=0d0018c0c2eb9f98b2d0b11e2ad651b607d97c9c;hp=6f14882e8a4694f98820d61d718c3fcceb653ce9;hb=HEAD;hpb=9420cfdeee25e4d97e7fc6f7cbb286e5089caccb diff --git a/libexfat/utf.c b/libexfat/utf.c index 6f14882..0d0018c 100644 --- a/libexfat/utf.c +++ b/libexfat/utf.c @@ -3,7 +3,7 @@ exFAT file system implementation library. Free exFAT implementation. - Copyright (C) 2010-2015 Andrew Nayenko + Copyright (C) 2010-2018 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;