(file_ops.c) 7zip UTF16 buffer allocation cleanups

This commit is contained in:
twinaphex 2015-12-02 01:35:01 +01:00
parent 846e009037
commit 7aab9baaa8
1 changed files with 15 additions and 33 deletions

View File

@ -48,61 +48,43 @@
#include "deps/7zip/7zFile.h" #include "deps/7zip/7zFile.h"
#include "deps/7zip/7zVersion.h" #include "deps/7zip/7zVersion.h"
static int Buf_EnsureSize(CBuf *dest, size_t size) static int Buf_EnsureSize(uint8_t **utf_data, size_t size)
{ {
if (dest->size >= size) *utf_data = (uint8_t*)malloc(size);
return 1; if (*utf_data == 0)
free(dest->data);
dest->data = 0;
dest->size = 0;
dest->data = (uint8_t*)malloc(size);
if (dest->data == 0)
return 0; return 0;
dest->size = size;
return 1; return 1;
} }
static bool Utf16_To_Char(CBuf *dest, const uint16_t *s) static bool Utf16_To_Char(uint8_t **utf_data, size_t *dest_len, const uint16_t *s)
{ {
bool res;
size_t dest_len = 0;
unsigned len = 0; unsigned len = 0;
while (s[len] != '\0') while (s[len] != '\0')
len++; len++;
utf16_conv_utf8(NULL, &dest_len, s, len); utf16_conv_utf8(NULL, dest_len, s, len);
dest_len += 1; *dest_len += 1;
if (!Buf_EnsureSize(dest, dest_len)) if (!Buf_EnsureSize(utf_data, *dest_len))
return false; return false;
res = utf16_conv_utf8(dest->data, &dest_len, s, len); return utf16_conv_utf8(*utf_data, dest_len, s, len);
dest->data[dest_len] = 0;
return res;
} }
static bool ConvertUtf16toCharString(const uint16_t *in, char *s, size_t len) static bool ConvertUtf16toCharString(const uint16_t *in, char *s, size_t len)
{ {
CBuf dest; size_t dest_len = 0;
bool ret; uint8_t *utf16_data = NULL;
bool ret = Utf16_To_Char(&utf16_data, &dest_len, in);
dest.data = 0; utf16_data[dest_len] = 0;
dest.size = 0;
ret = Utf16_To_Char(&dest, in);
if (ret) if (ret)
strlcpy(s, (const char*)dest.data, len); strlcpy(s, (const char*)utf16_data, len);
free(dest.data); free(utf16_data);
dest.data = 0; utf16_data = NULL;
dest.size = 0;
return ret; return ret;
} }