forked from Imagelibrary/rtems
dosfs: Correct handling of iconv() return value
This commit is contained in:
committed by
Sebastian Huber
parent
f55215a837
commit
3dbb68d991
@@ -52,12 +52,12 @@ static int msdos_utf8_convert_with_iconv(
|
|||||||
size_t *dst_size
|
size_t *dst_size
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
int eno = 0;
|
int eno;
|
||||||
size_t inbytes_left = src_size;
|
size_t inbytes_left = src_size;
|
||||||
size_t outbytes_left = *dst_size;
|
size_t outbytes_left = *dst_size;
|
||||||
char *inbuf = (void *) (uintptr_t) src;
|
char *inbuf = (void *) (uintptr_t) src;
|
||||||
char *outbuf = dst;
|
char *outbuf = dst;
|
||||||
ssize_t iconv_status;
|
size_t iconv_status;
|
||||||
|
|
||||||
iconv_status = iconv(
|
iconv_status = iconv(
|
||||||
desc,
|
desc,
|
||||||
@@ -69,10 +69,21 @@ static int msdos_utf8_convert_with_iconv(
|
|||||||
|
|
||||||
*dst_size -= outbytes_left;
|
*dst_size -= outbytes_left;
|
||||||
|
|
||||||
if ( iconv_status > 0 ) {
|
if ( iconv_status == 0 ) {
|
||||||
eno = EINVAL;
|
eno = 0;
|
||||||
} else if ( iconv_status < 0 ) {
|
} else if ( iconv_status == (size_t) -1 ) {
|
||||||
|
/*
|
||||||
|
* iconv() has detected an error. The most likely reason seems to be a too
|
||||||
|
* small outbuf.
|
||||||
|
*/
|
||||||
eno = ENOMEM;
|
eno = ENOMEM;
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* The iconv_status contains the number of characters converted in a
|
||||||
|
* non-reversible way. We want to use reversible conversions only.
|
||||||
|
* Characters permitted within DOSFS names seem to be reversible.
|
||||||
|
*/
|
||||||
|
eno = EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return eno;
|
return eno;
|
||||||
|
|||||||
Reference in New Issue
Block a user