(file_ops.c) 7zip UTF16 buffer allocation cleanups
This commit is contained in:
parent
846e009037
commit
7aab9baaa8
48
file_ops.c
48
file_ops.c
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue