From fc9a644002dc501a5c224e5cc1a7dfba3ca2d1d8 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Mon, 25 Nov 2019 13:13:05 +0100 Subject: Cleanup: move overflow safe alloc code into libsquashfs There were only a hand full of instances outside libsquashfs that used the alloc code. In most cases, the thing allocated hat its size derived from something already in memory anyway, so it is safe to assume its size fits into a size_t. At the same time, the opencoded Windows path conversion functions are all unified into a single helper function. Signed-off-by: David Oberhollenzer --- lib/compat/Makemodule.am | 1 + lib/compat/chdir.c | 27 +++------------------------ lib/compat/path_to_windows.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 24 deletions(-) create mode 100644 lib/compat/path_to_windows.c (limited to 'lib/compat') diff --git a/lib/compat/Makemodule.am b/lib/compat/Makemodule.am index fb37b46..7137f2c 100644 --- a/lib/compat/Makemodule.am +++ b/lib/compat/Makemodule.am @@ -1,5 +1,6 @@ libcompat_a_SOURCES = lib/compat/getline.c lib/compat/getsubopt.c libcompat_a_SOURCES += lib/compat/strndup.c lib/compat/mockups.c libcompat_a_SOURCES += lib/compat/chdir.c include/compat.h +libcompat_a_SOURCES += lib/compat/path_to_windows.c noinst_LIBRARIES += libcompat.a diff --git a/lib/compat/chdir.c b/lib/compat/chdir.c index b1b2d0c..04dcf17 100644 --- a/lib/compat/chdir.c +++ b/lib/compat/chdir.c @@ -10,37 +10,16 @@ #include "util/util.h" #ifdef _WIN32 -#define WIN32_LEAN_AND_MEAN -#include #include int chdir(const char *path) { - WCHAR *wpath, *ptr; - DWORD length; + WCHAR *wpath; int ret; - length = MultiByteToWideChar(CP_UTF8, 0, path, -1, NULL, 0); - if (length <= 0) { - fprintf(stderr, "Converting '%s' to UTF-16: %ld\n", - path, GetLastError()); - return -1; - } - - wpath = alloc_array(sizeof(wpath[0]), length + 1); - if (wpath == NULL) { - fprintf(stderr, "Converting '%s' to UTF-16: out of memory\n", - path); + wpath = path_to_windows(path); + if (wpath == NULL) return -1; - } - - MultiByteToWideChar(CP_UTF8, 0, path, -1, wpath, length + 1); - wpath[length] = '\0'; - - for (ptr = wpath; *ptr != '\0'; ++ptr) { - if (*ptr == '/') - *ptr = '\\'; - } if (!SetCurrentDirectoryW(wpath)) { fprintf(stderr, "Switching to directory '%s': %ld\n", diff --git a/lib/compat/path_to_windows.c b/lib/compat/path_to_windows.c new file mode 100644 index 0000000..ff3a5d2 --- /dev/null +++ b/lib/compat/path_to_windows.c @@ -0,0 +1,43 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * path_to_windows.c + * + * Copyright (C) 2019 David Oberhollenzer + */ +#include "config.h" +#include "compat.h" + +#include +#include + +#if defined(_WIN32) || defined(__WINDOWS__) +WCHAR *path_to_windows(const char *input) +{ + WCHAR *wpath, *ptr; + DWORD length; + + length = MultiByteToWideChar(CP_UTF8, 0, input, -1, NULL, 0); + if (length <= 0) { + fprintf(stderr, "Converting UTF-8 path to UTF-16: %ld\n", + GetLastError()); + return NULL; + } + + wpath = calloc(sizeof(wpath[0]), length + 1); + if (wpath == NULL) { + fprintf(stderr, + "Converting UTF-8 path to UTF-16: out of memory\n"); + return NULL; + } + + MultiByteToWideChar(CP_UTF8, 0, input, -1, wpath, length + 1); + wpath[length] = '\0'; + + for (ptr = wpath; *ptr != '\0'; ++ptr) { + if (*ptr == '/') + *ptr = '\\'; + } + + return wpath; +} +#endif -- cgit v1.2.3