Add dst_size parameter to character conv funcs

Character conversion functions did not previously ask for a maximum
buffer size for their 'dst' parameter, it's unsafe to assume some given
destination buffer may have enough size to accommodate a conversion.
This commit is contained in:
jp9000
2014-05-22 03:42:43 -07:00
parent 6578e2952b
commit d536df30b0
5 changed files with 81 additions and 35 deletions

View File

@@ -214,7 +214,9 @@ struct os_dirent *os_readdir(os_dir_t dir)
return NULL;
}
os_wcs_to_utf8(dir->wfd.cFileName, 255, dir->out.d_name);
os_wcs_to_utf8(dir->wfd.cFileName, 0, dir->out.d_name,
sizeof(dir->out.d_name));
dir->out.directory =
!!(dir->wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);

View File

@@ -228,50 +228,88 @@ bool os_quick_write_utf8_file(const char *path, const char *str, size_t len,
return true;
}
size_t os_mbs_to_wcs(const char *str, size_t len, wchar_t *dst)
size_t os_mbs_to_wcs(const char *str, size_t len, wchar_t *dst, size_t dst_size)
{
size_t out_len = dst ? len : mbstowcs(NULL, str, len);
if (len && dst) {
mbstowcs(dst, str, out_len+1);
if (!dst_size)
return 0;
if (out_len) {
if ((out_len + 1) > dst_size)
out_len = dst_size - 1;
mbstowcs(dst, str, out_len + 1);
}
dst[out_len] = 0;
}
return out_len;
}
size_t os_utf8_to_wcs(const char *str, size_t len, wchar_t *dst)
size_t os_utf8_to_wcs(const char *str, size_t len, wchar_t *dst,
size_t dst_size)
{
size_t in_len = len ? len : strlen(str);
size_t out_len = dst ? len : utf8_to_wchar(str, in_len, NULL, 0, 0);
if (out_len && dst) {
utf8_to_wchar(str, in_len, dst, out_len+1, 0);
if (!dst_size)
return 0;
if (out_len) {
if ((out_len + 1) > dst_size)
out_len = dst_size - 1;
utf8_to_wchar(str, in_len, dst, out_len + 1, 0);
}
dst[out_len] = 0;
}
return out_len;
}
size_t os_wcs_to_mbs(const wchar_t *str, size_t len, char *dst)
size_t os_wcs_to_mbs(const wchar_t *str, size_t len, char *dst, size_t dst_size)
{
size_t out_len = dst ? len : wcstombs(NULL, str, len);
if (len && dst) {
wcstombs(dst, str, out_len+1);
if (!dst_size)
return 0;
if (out_len) {
if ((out_len + 1) > dst_size)
out_len = dst_size - 1;
wcstombs(dst, str, out_len + 1);
}
dst[out_len] = 0;
}
return out_len;
}
size_t os_wcs_to_utf8(const wchar_t *str, size_t len, char *dst)
size_t os_wcs_to_utf8(const wchar_t *str, size_t len, char *dst,
size_t dst_size)
{
size_t in_len = (len != 0) ? len : wcslen(str);
size_t out_len = dst ? len : wchar_to_utf8(str, in_len, NULL, 0, 0);
if (out_len && dst) {
wchar_to_utf8(str, in_len, dst, out_len+1, 0);
if (!dst_size)
return 0;
if (out_len) {
if ((out_len + 1) > dst_size)
out_len = dst_size - 1;
wchar_to_utf8(str, in_len, dst, out_len + 1, 0);
}
dst[out_len] = 0;
}
@@ -280,33 +318,34 @@ size_t os_wcs_to_utf8(const wchar_t *str, size_t len, char *dst)
size_t os_mbs_to_wcs_ptr(const char *str, size_t len, wchar_t **pstr)
{
size_t out_len = os_mbs_to_wcs(str, len, NULL);
size_t out_len = os_mbs_to_wcs(str, len, NULL, 0);
*pstr = bmalloc((out_len+1) * sizeof(wchar_t));
return os_mbs_to_wcs(str, out_len, *pstr);
*pstr = bmalloc((out_len + 1) * sizeof(wchar_t));
return os_mbs_to_wcs(str, out_len, *pstr, out_len + 1);
}
size_t os_utf8_to_wcs_ptr(const char *str, size_t len, wchar_t **pstr)
{
size_t out_len = os_utf8_to_wcs(str, len, NULL);
*pstr = bmalloc((out_len+1) * sizeof(wchar_t));
return os_utf8_to_wcs(str, out_len, *pstr);
size_t out_len = os_utf8_to_wcs(str, len, NULL, 0);
*pstr = bmalloc((out_len + 1) * sizeof(wchar_t));
return os_utf8_to_wcs(str, out_len, *pstr, out_len + 1);
}
size_t os_wcs_to_mbs_ptr(const wchar_t *str, size_t len, char **pstr)
{
size_t out_len = os_wcs_to_mbs(str, len, NULL);
size_t out_len = os_wcs_to_mbs(str, len, NULL, 0);
*pstr = bmalloc((out_len+1) * sizeof(char));
return os_wcs_to_mbs(str, out_len, *pstr);
*pstr = bmalloc((out_len + 1) * sizeof(char));
return os_wcs_to_mbs(str, out_len, *pstr, out_len + 1);
}
size_t os_wcs_to_utf8_ptr(const wchar_t *str, size_t len, char **pstr)
{
size_t out_len = os_wcs_to_utf8(str, len, NULL);
size_t out_len = os_wcs_to_utf8(str, len, NULL, 0);
*pstr = bmalloc((out_len+1) * sizeof(char));
return os_wcs_to_utf8(str, out_len, *pstr);
*pstr = bmalloc((out_len + 1) * sizeof(char));
return os_wcs_to_utf8(str, out_len, *pstr, out_len + 1);
}
size_t os_utf8_to_mbs_ptr(const char *str, size_t len, char **pstr)

View File

@@ -48,10 +48,14 @@ EXPORT char *os_quick_read_mbs_file(const char *path);
EXPORT bool os_quick_write_mbs_file(const char *path, const char *str,
size_t len);
EXPORT size_t os_mbs_to_wcs(const char *str, size_t len, wchar_t *dst);
EXPORT size_t os_utf8_to_wcs(const char *str, size_t len, wchar_t *dst);
EXPORT size_t os_wcs_to_mbs(const wchar_t *str, size_t len, char *dst);
EXPORT size_t os_wcs_to_utf8(const wchar_t *str, size_t len, char *dst);
EXPORT size_t os_mbs_to_wcs(const char *str, size_t str_len, wchar_t *dst,
size_t dst_size);
EXPORT size_t os_utf8_to_wcs(const char *str, size_t len, wchar_t *dst,
size_t dst_size);
EXPORT size_t os_wcs_to_mbs(const wchar_t *str, size_t len, char *dst,
size_t dst_size);
EXPORT size_t os_wcs_to_utf8(const wchar_t *str, size_t len, char *dst,
size_t dst_size);
EXPORT size_t os_mbs_to_wcs_ptr(const char *str, size_t len, wchar_t **pstr);
EXPORT size_t os_utf8_to_wcs_ptr(const char *str, size_t len, wchar_t **pstr);