Make sure that input file name and output file name are distinct (to the extent possible).
This commit is contained in:
parent
9b0d109336
commit
65c17e6759
@ -147,6 +147,7 @@ int MAIN(const int argc, CHR *const argv[])
|
||||
init_terminal();
|
||||
setup_signal_handler(SIGINT, sigint_handler);
|
||||
int result = EXIT_FAILURE;
|
||||
CHR *input_file = NULL, *output_file = NULL;
|
||||
char *passphrase_buffer = NULL;
|
||||
|
||||
FPRINTF(stderr, T("SlunkCrypt Utility (%") T(PRIstr) T("-%") T(PRIstr) T("), by LoRd_MuldeR <MuldeR2@GMX.de>\n"), OS_TYPE, CPU_ARCH);
|
||||
@ -203,8 +204,6 @@ int MAIN(const int argc, CHR *const argv[])
|
||||
check_excess_arguments(argc, 5);
|
||||
|
||||
const CHR *const passphrase = PW_FROM_ENV ? GETENV(ENV_PASSWORD) : argv[2U];
|
||||
const CHR *const input_file = argv[PW_FROM_ENV ? 2U : 3U], *const output_file = argv[PW_FROM_ENV ? 3U : 4U];
|
||||
|
||||
if ((!passphrase) || (!passphrase[0U]))
|
||||
{
|
||||
FPUTS(T("Error: The passphrase must be specified, directly or indirectly!\n\n"), stderr);
|
||||
@ -220,9 +219,23 @@ int MAIN(const int argc, CHR *const argv[])
|
||||
}
|
||||
}
|
||||
|
||||
if ((!input_file[0U]) || (!output_file[0U]))
|
||||
input_file = absolute_path(argv[PW_FROM_ENV ? 2U : 3U]);
|
||||
if ((!input_file) || (!input_file[0U]))
|
||||
{
|
||||
FPUTS(T("Error: The input file and/or output file must not be empty!\n\n"), stderr);
|
||||
FPUTS(T("Error: Input file path could not be resolved!\n\n"), stderr);
|
||||
goto clean_up;
|
||||
}
|
||||
|
||||
output_file = absolute_path(argv[PW_FROM_ENV ? 3U : 4U]);
|
||||
if ((!output_file) || (!output_file[0U]))
|
||||
{
|
||||
FPUTS(T("Error: Output file path could not be resolved!\n\n"), stderr);
|
||||
goto clean_up;
|
||||
}
|
||||
|
||||
if (!path_compare(input_file, output_file))
|
||||
{
|
||||
FPUTS(T("Error: Input and output files must not be the same path! (effectively)\n\n"), stderr);
|
||||
goto clean_up;
|
||||
}
|
||||
|
||||
@ -303,6 +316,16 @@ clean_up:
|
||||
free(passphrase_buffer);
|
||||
}
|
||||
|
||||
if (input_file)
|
||||
{
|
||||
free(input_file);
|
||||
}
|
||||
|
||||
if (output_file)
|
||||
{
|
||||
free(output_file);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -58,6 +58,7 @@
|
||||
# define STRNICMP(X,Y,Z) _wcsnicmp((X),(Y),(Z))
|
||||
# define STRRCHR(X,Y) wcsrchr((X),(Y))
|
||||
# define STRTOUL(X) wcstoul((X), NULL, 0)
|
||||
# define STRDUP(X) _wcsdup((X))
|
||||
# define FPUTS(X,Y) fputws((X),(Y))
|
||||
# define FPRINTF(X,Y,...) fwprintf((X),(Y),__VA_ARGS__)
|
||||
# define REMOVE(X) _wremove((X))
|
||||
@ -81,6 +82,7 @@
|
||||
# define STRNICMP(X,Y,Z) strncasecmp((X),(Y),(Z))
|
||||
# define STRRCHR(X,Y) strrchr((X),(Y))
|
||||
# define STRTOUL(X) strtoul((X), NULL, 0)
|
||||
# define STRDUP(X) strdup((X))
|
||||
# define FPUTS(X,Y) fputs((X),(Y))
|
||||
# define FPRINTF(X,Y,...) fprintf((X),(Y),__VA_ARGS__)
|
||||
# define REMOVE(X) remove((X))
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include <sys/types.h>
|
||||
#include <time.h>
|
||||
#include <signal.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
/* Platform support */
|
||||
#ifdef _WIN32
|
||||
@ -35,6 +36,7 @@
|
||||
# define _O_U8TEXT 0x40000
|
||||
# endif
|
||||
#else
|
||||
# include <unistd.h>
|
||||
# if defined(__USE_LARGEFILE64) && (__USE_LARGEFILE64)
|
||||
# define STAT_T struct stat64
|
||||
# define FSTAT(X,Y) fstat64((X),(Y))
|
||||
@ -105,6 +107,65 @@ void setup_signal_handler(const int signo, signal_handler_t* const handler)
|
||||
#endif
|
||||
}
|
||||
|
||||
// ==========================================================================
|
||||
// String functions
|
||||
// ==========================================================================
|
||||
|
||||
char *concat_str(const char *const str, ...)
|
||||
{
|
||||
const char *ptr;
|
||||
char *buffer;
|
||||
size_t buff_size = 1U;
|
||||
va_list arg;
|
||||
va_start(arg, str);
|
||||
for (ptr = str; ptr != NULL; ptr = va_arg(arg, const char*))
|
||||
{
|
||||
buff_size += strlen(ptr);
|
||||
}
|
||||
if ((buffer = (char*)calloc(buff_size, sizeof(char))))
|
||||
{
|
||||
va_end(arg);
|
||||
va_start(arg, str);
|
||||
for (ptr = str; ptr != NULL; ptr = va_arg(arg, const char*))
|
||||
{
|
||||
strcat(buffer, ptr);
|
||||
}
|
||||
}
|
||||
va_end(arg);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
char* CHR_to_utf8(const CHR *const input)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
char *buffer = NULL;
|
||||
DWORD buffer_size = 0U, result = 0U;
|
||||
|
||||
buffer_size = input ? WideCharToMultiByte(CP_UTF8, 0, input, -1, NULL, 0, NULL, NULL) : 0U;
|
||||
if (buffer_size < 1U)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
buffer = (char*)malloc(sizeof(char) * buffer_size);
|
||||
if (!buffer)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
result = WideCharToMultiByte(CP_UTF8, 0, input, -1, (LPSTR)buffer, buffer_size, NULL, NULL);
|
||||
if ((result > 0U) && (result <= buffer_size))
|
||||
{
|
||||
return buffer;
|
||||
}
|
||||
|
||||
free(buffer);
|
||||
return NULL;
|
||||
#else
|
||||
return strdup(input); /*simple string copy*/
|
||||
#endif
|
||||
}
|
||||
|
||||
// ==========================================================================
|
||||
// Time functions
|
||||
// ==========================================================================
|
||||
@ -149,41 +210,6 @@ uint64_t clock_read(void)
|
||||
return 0U;
|
||||
}
|
||||
|
||||
// ==========================================================================
|
||||
// Character set conversion
|
||||
// ==========================================================================
|
||||
|
||||
char* CHR_to_utf8(const CHR *const input)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
char *buffer = NULL;
|
||||
DWORD buffer_size = 0U, result = 0U;
|
||||
|
||||
buffer_size = input ? WideCharToMultiByte(CP_UTF8, 0, input, -1, NULL, 0, NULL, NULL) : 0U;
|
||||
if (buffer_size < 1U)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
buffer = (char*) malloc(sizeof(char) * buffer_size);
|
||||
if (!buffer)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
result = WideCharToMultiByte(CP_UTF8, 0, input, -1, (LPSTR)buffer, buffer_size, NULL, NULL);
|
||||
if ((result > 0U) && (result <= buffer_size))
|
||||
{
|
||||
return buffer;
|
||||
}
|
||||
|
||||
free(buffer);
|
||||
return NULL;
|
||||
#else
|
||||
return strdup(input); /*simple string copy*/
|
||||
#endif
|
||||
}
|
||||
|
||||
// ==========================================================================
|
||||
// Byte-order support
|
||||
// ==========================================================================
|
||||
@ -233,6 +259,42 @@ size_t fread_ui64(uint64_t *const value, FILE *const stream)
|
||||
// File functions
|
||||
// ==========================================================================
|
||||
|
||||
#define JOIN_PATHS(X,Y) concat_str((X), "/", (Y), NULL)
|
||||
|
||||
CHR *absolute_path(const CHR *const path)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
wchar_t *const result = _wfullpath(NULL, path, 0U);
|
||||
#else
|
||||
char *result = realpath(path, NULL);
|
||||
if ((!result) && path[0U] && (path[0U] != '/'))
|
||||
{
|
||||
char *const cwd = getcwd(NULL, 0U);
|
||||
if (cwd)
|
||||
{
|
||||
const char *path_off = path;
|
||||
while ((path_off[0U] == '.') && (path_off[1U] == '/'))
|
||||
{
|
||||
path_off += 2U;
|
||||
while (path_off[0U] == '/') ++path_off;
|
||||
}
|
||||
result = JOIN_PATHS(cwd, path_off);
|
||||
free(cwd);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return result ? result : STRDUP(path);
|
||||
}
|
||||
|
||||
int path_compare(const CHR *const path0, const CHR *const path1)
|
||||
{
|
||||
#ifdef _WIN32
|
||||
return _wcsicmp(path0, path1);
|
||||
#else
|
||||
return strcmp(path0, path1);
|
||||
#endif
|
||||
}
|
||||
|
||||
uint64_t get_file_size(FILE* const file)
|
||||
{
|
||||
STAT_T stat;
|
||||
|
@ -23,8 +23,11 @@ size_t fwrite_ui64(const uint64_t value, FILE *const stream);
|
||||
size_t fread_ui64(uint64_t *const value, FILE *const stream);
|
||||
|
||||
char* CHR_to_utf8(const CHR *const input);
|
||||
uint64_t get_file_size(FILE* const file);
|
||||
|
||||
CHR *absolute_path(const CHR *const path);
|
||||
int path_compare(const CHR *const path0, const CHR *const path1);
|
||||
const CHR *get_file_name(const CHR *path);
|
||||
uint64_t get_file_size(FILE* const file);
|
||||
|
||||
uint64_t round_down(const uint64_t value, const uint64_t base);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user