fix(platform): fix string truncation warnings on Windows
Replace strncpy with memcpy+nullterm to handle Windows MAX_PATH (259) vs STK_PATH_MAX (256) mismatch.
This commit is contained in:
+31
-15
@@ -288,7 +288,7 @@ void *platform_get_symbol(void *h, const char *s)
|
|||||||
|
|
||||||
char (*platform_directory_init_scan(const char *dir_path, size_t *out_count))
|
char (*platform_directory_init_scan(const char *dir_path, size_t *out_count))
|
||||||
[STK_PATH_MAX] {
|
[STK_PATH_MAX] {
|
||||||
size_t count = 0, i = 0;
|
size_t count = 0, i = 0, name_len;
|
||||||
char (*list)[STK_PATH_MAX] = NULL;
|
char (*list)[STK_PATH_MAX] = NULL;
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
WIN32_FIND_DATAA fd;
|
WIN32_FIND_DATAA fd;
|
||||||
@@ -323,8 +323,14 @@ char (*platform_directory_init_scan(const char *dir_path, size_t *out_count))
|
|||||||
do {
|
do {
|
||||||
if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
|
if ((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
|
||||||
continue;
|
continue;
|
||||||
if (is_valid_module_file(fd.cFileName) && i < count)
|
if (is_valid_module_file(fd.cFileName) && i < count) {
|
||||||
strncpy(list[i++], fd.cFileName, STK_PATH_MAX - 1);
|
name_len = strlen(fd.cFileName);
|
||||||
|
if (name_len >= STK_PATH_MAX)
|
||||||
|
len = STK_PATH_MAX - 1;
|
||||||
|
|
||||||
|
memcpy(list[i], fd.cFileName, name_len);
|
||||||
|
list[i++][len] = '\0';
|
||||||
|
}
|
||||||
} while (FindNextFileA(h, &fd));
|
} while (FindNextFileA(h, &fd));
|
||||||
|
|
||||||
FindClose(h);
|
FindClose(h);
|
||||||
@@ -340,7 +346,6 @@ char (*platform_directory_init_scan(const char *dir_path, size_t *out_count))
|
|||||||
struct dirent *e;
|
struct dirent *e;
|
||||||
struct stat st;
|
struct stat st;
|
||||||
char f[STK_PATH_MAX_OS];
|
char f[STK_PATH_MAX_OS];
|
||||||
size_t name_len;
|
|
||||||
|
|
||||||
d = opendir(dir_path);
|
d = opendir(dir_path);
|
||||||
if (!d)
|
if (!d)
|
||||||
@@ -484,6 +489,7 @@ void *platform_directory_watch_start(const char *path)
|
|||||||
fd, path, IN_CLOSE_WRITE | IN_DELETE | IN_MOVED_TO | IN_MOVED_FROM);
|
fd, path, IN_CLOSE_WRITE | IN_DELETE | IN_MOVED_TO | IN_MOVED_FROM);
|
||||||
return (void *)(long)fd;
|
return (void *)(long)fd;
|
||||||
#else
|
#else
|
||||||
|
size_t name_len;
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
WIN32_FIND_DATAA fd;
|
WIN32_FIND_DATAA fd;
|
||||||
HANDLE h;
|
HANDLE h;
|
||||||
@@ -538,10 +544,11 @@ void *platform_directory_watch_start(const char *path)
|
|||||||
do {
|
do {
|
||||||
if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
|
if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
|
||||||
is_valid_module_file(fd.cFileName) && i < count) {
|
is_valid_module_file(fd.cFileName) && i < count) {
|
||||||
strncpy(ctx->snaps[i].filename, fd.cFileName,
|
name_len = strlen(fd.cFileName);
|
||||||
STK_PATH_MAX - 1);
|
if (len >= STK_PATH_MAX)
|
||||||
ctx->snaps[i].mtime = fd.ftLastWriteTime;
|
len = STK_PATH_MAX - 1;
|
||||||
i++;
|
memcpy(ctx->snaps[i].filename, fd.cFileName, len);
|
||||||
|
ctx->snaps[i++].mtime = fd.ftLastWriteTime;
|
||||||
}
|
}
|
||||||
} while (FindNextFileA(h, &fd));
|
} while (FindNextFileA(h, &fd));
|
||||||
|
|
||||||
@@ -759,14 +766,14 @@ stk_module_event_t *platform_directory_watch_check(
|
|||||||
#else
|
#else
|
||||||
platform_watch_context_t *ctx = (platform_watch_context_t *)handle;
|
platform_watch_context_t *ctx = (platform_watch_context_t *)handle;
|
||||||
platform_snapshot_t *new_snaps = NULL;
|
platform_snapshot_t *new_snaps = NULL;
|
||||||
size_t new_count = 0, i, j, ev_index = 0;
|
size_t new_count = 0, i, j, ev_index = 0, name_len;
|
||||||
stk_module_event_t *evs = NULL;
|
stk_module_event_t *evs = NULL;
|
||||||
int found;
|
int found;
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
WIN32_FIND_DATAA fd;
|
WIN32_FIND_DATAA fd;
|
||||||
HANDLE h;
|
HANDLE h;
|
||||||
char s[STK_PATH_MAX_OS];
|
char s[STK_PATH_MAX_OS];
|
||||||
size_t count = 0;
|
size_t count = 0, name_len;
|
||||||
|
|
||||||
sprintf(s, "%s\\*", ctx->path);
|
sprintf(s, "%s\\*", ctx->path);
|
||||||
h = FindFirstFileA(s, &fd);
|
h = FindFirstFileA(s, &fd);
|
||||||
@@ -797,8 +804,13 @@ stk_module_event_t *platform_directory_watch_check(
|
|||||||
do {
|
do {
|
||||||
if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
|
if (!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
|
||||||
is_valid_module_file(fd.cFileName) && new_count < count) {
|
is_valid_module_file(fd.cFileName) && new_count < count) {
|
||||||
strncpy(new_snaps[new_count].filename, fd.cFileName,
|
name_len = strlen(fd.cFileName);
|
||||||
STK_PATH_MAX - 1);
|
if (len >= STK_PATH_MAX)
|
||||||
|
len = STK_PATH_MAX - 1;
|
||||||
|
|
||||||
|
memcpy(new_snaps[new_count].filename, fd.cFileName,
|
||||||
|
len);
|
||||||
|
new_snaps[new_count].filename[len] = '\0';
|
||||||
new_snaps[new_count].mtime = fd.ftLastWriteTime;
|
new_snaps[new_count].mtime = fd.ftLastWriteTime;
|
||||||
new_count++;
|
new_count++;
|
||||||
}
|
}
|
||||||
@@ -905,9 +917,13 @@ build_diff:
|
|||||||
if (ctx->snaps[i].mtime != new_snaps[j].mtime) {
|
if (ctx->snaps[i].mtime != new_snaps[j].mtime) {
|
||||||
if (is_file_ready(ctx->path,
|
if (is_file_ready(ctx->path,
|
||||||
new_snaps[j].filename)) {
|
new_snaps[j].filename)) {
|
||||||
strncpy((*file_list)[ev_index],
|
name_len =
|
||||||
new_snaps[j].filename,
|
strlen(ctx->snaps[i].filename);
|
||||||
STK_PATH_MAX - 1);
|
if (name_len >= STK_PATH_MAX)
|
||||||
|
len = STK_PATH_MAX;
|
||||||
|
memcpy((*file_list)[ev_index],
|
||||||
|
ctx->snaps[i].filename,
|
||||||
|
name_len);
|
||||||
evs[ev_index++] = STK_MOD_RELOAD;
|
evs[ev_index++] = STK_MOD_RELOAD;
|
||||||
} else {
|
} else {
|
||||||
new_snaps[j].mtime =
|
new_snaps[j].mtime =
|
||||||
|
|||||||
Reference in New Issue
Block a user