Milestone 5: deliver embedded RDP sessions and lifecycle hardening
This commit is contained in:
128
third_party/FreeRDP/winpr/libwinpr/file/test/TestFileWriteFile.c
vendored
Normal file
128
third_party/FreeRDP/winpr/libwinpr/file/test/TestFileWriteFile.c
vendored
Normal file
@@ -0,0 +1,128 @@
|
||||
|
||||
#include <stdio.h>
|
||||
#include <winpr/crt.h>
|
||||
#include <winpr/file.h>
|
||||
#include <winpr/windows.h>
|
||||
|
||||
static const char* get_dir(char* filename, size_t len)
|
||||
{
|
||||
#if defined(WIN32)
|
||||
if ((len == 0) || (strnlen_s(filename, len) == len))
|
||||
return nullptr;
|
||||
char* ptr = strrchr(filename, '\\');
|
||||
#else
|
||||
if ((len == 0) || (strnlen(filename, len) == len))
|
||||
return nullptr;
|
||||
char* ptr = strrchr(filename, '/');
|
||||
#endif
|
||||
if (!ptr)
|
||||
return nullptr;
|
||||
*ptr = '\0';
|
||||
return filename;
|
||||
}
|
||||
|
||||
static BOOL get_tmp(char* path, size_t len)
|
||||
{
|
||||
#if defined(WIN32)
|
||||
const char template[] = "tmpdir.XXXXXX";
|
||||
strncmp(path, template, strnlen_s(template, len) + 1);
|
||||
if (!mktemp_s(path))
|
||||
return FALSE;
|
||||
return winpr_str_append("testfile", path, len, "\\");
|
||||
#else
|
||||
const char template[] = "/tmp/tmpdir.XXXXXX";
|
||||
if (!strncpy(path, template, strnlen(template, len) + 1))
|
||||
return FALSE;
|
||||
if (!mkdtemp(path))
|
||||
return FALSE;
|
||||
return winpr_str_append("testfile", path, len, "/");
|
||||
#endif
|
||||
}
|
||||
|
||||
static BOOL test_write(const char* filename, const char* data, size_t datalen)
|
||||
{
|
||||
BOOL rc = FALSE;
|
||||
|
||||
WINPR_ASSERT(filename);
|
||||
WINPR_ASSERT(data);
|
||||
WINPR_ASSERT(datalen > 0);
|
||||
|
||||
HANDLE hdl = CreateFileA(filename, GENERIC_WRITE, 0, nullptr, CREATE_NEW, FILE_ATTRIBUTE_NORMAL,
|
||||
nullptr);
|
||||
if (!hdl || (hdl == INVALID_HANDLE_VALUE))
|
||||
goto fail;
|
||||
|
||||
DWORD written = 0;
|
||||
if (!WriteFile(hdl, data, datalen, &written, nullptr))
|
||||
goto fail;
|
||||
if (written != datalen)
|
||||
goto fail;
|
||||
|
||||
if (!FlushFileBuffers(hdl))
|
||||
goto fail;
|
||||
|
||||
rc = TRUE;
|
||||
fail:
|
||||
CloseHandle(hdl);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static BOOL test_read(const char* filename, const char* data, size_t datalen)
|
||||
{
|
||||
BOOL rc = FALSE;
|
||||
|
||||
WINPR_ASSERT(filename);
|
||||
WINPR_ASSERT(data);
|
||||
WINPR_ASSERT(datalen > 0);
|
||||
|
||||
char* cmp = calloc(datalen + 1, sizeof(char));
|
||||
HANDLE hdl = CreateFileA(filename, GENERIC_READ, 0, nullptr, OPEN_EXISTING,
|
||||
FILE_ATTRIBUTE_NORMAL, nullptr);
|
||||
if (!hdl || (hdl == INVALID_HANDLE_VALUE) || !cmp)
|
||||
goto fail;
|
||||
|
||||
DWORD read = 0;
|
||||
if (!ReadFile(hdl, cmp, datalen, &read, nullptr))
|
||||
goto fail;
|
||||
if (read != datalen)
|
||||
goto fail;
|
||||
if (memcmp(data, cmp, datalen) != 0)
|
||||
goto fail;
|
||||
if (FlushFileBuffers(hdl))
|
||||
goto fail;
|
||||
|
||||
rc = TRUE;
|
||||
fail:
|
||||
free(cmp);
|
||||
CloseHandle(hdl);
|
||||
return rc;
|
||||
}
|
||||
|
||||
int TestFileWriteFile(int argc, char* argv[])
|
||||
{
|
||||
const char data[] = "sometesttext\nanother line\r\ngogogo\r\tfoo\t\r\n\r";
|
||||
char filename[MAX_PATH] = WINPR_C_ARRAY_INIT;
|
||||
|
||||
int rc = -1;
|
||||
if (!get_tmp(filename, sizeof(filename)))
|
||||
goto fail;
|
||||
|
||||
if (!test_write(filename, data, sizeof(data)))
|
||||
goto fail;
|
||||
|
||||
if (!test_read(filename, data, sizeof(data)))
|
||||
goto fail;
|
||||
|
||||
rc = 0;
|
||||
fail:
|
||||
if (!DeleteFile(filename))
|
||||
rc = -2;
|
||||
|
||||
const char* d = get_dir(filename, sizeof(filename));
|
||||
if (d)
|
||||
{
|
||||
if (!RemoveDirectory(d))
|
||||
rc = -3;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
Reference in New Issue
Block a user