diff options
| author | Mark Young <marky@lunarg.com> | 2017-04-25 08:08:29 -0600 |
|---|---|---|
| committer | Mark Young <marky@lunarg.com> | 2017-05-10 12:51:14 -0600 |
| commit | c393548b176dc2e04a632937e95ffaac60e7b013 (patch) | |
| tree | 070372ae9729add73aee0d21227d5445f401f5e0 /loader/loader.c | |
| parent | 26ce3e47be66e372b7cc3a7ebfc1b4bf7a101971 (diff) | |
| download | usermoji-c393548b176dc2e04a632937e95ffaac60e7b013.tar.xz | |
loader : gh1675 - Further strncat changes
This doesn't completely satisfy GH 1675, but at least resolves a
few of the holes discovered by @randomascii.
Change-Id: Idb2273851e36d4470d2f14cb09d6ac1c314497a8
Diffstat (limited to 'loader/loader.c')
| -rw-r--r-- | loader/loader.c | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/loader/loader.c b/loader/loader.c index 45af17e4..5b61f573 100644 --- a/loader/loader.c +++ b/loader/loader.c @@ -290,7 +290,7 @@ static inline void loader_free_getenv(char *val, const struct loader_instance *i void loader_log(const struct loader_instance *inst, VkFlags msg_type, int32_t msg_code, const char *format, ...) { char msg[512]; char cmd_line_msg[512]; - uint16_t cmd_line_size = sizeof(cmd_line_msg); + size_t cmd_line_size = sizeof(cmd_line_msg); va_list ap; int ret; @@ -311,6 +311,8 @@ void loader_log(const struct loader_instance *inst, VkFlags msg_type, int32_t ms } cmd_line_msg[0] = '\0'; + cmd_line_size -= 1; + size_t original_size = cmd_line_size; va_start(ap, format); if ((msg_type & LOADER_INFO_BIT) != 0) { @@ -318,7 +320,7 @@ void loader_log(const struct loader_instance *inst, VkFlags msg_type, int32_t ms cmd_line_size -= 4; } if ((msg_type & LOADER_WARN_BIT) != 0) { - if (cmd_line_size != sizeof(cmd_line_msg)) { + if (cmd_line_size != original_size) { strncat(cmd_line_msg, " | ", cmd_line_size); cmd_line_size -= 3; } @@ -326,7 +328,7 @@ void loader_log(const struct loader_instance *inst, VkFlags msg_type, int32_t ms cmd_line_size -= 7; } if ((msg_type & LOADER_PERF_BIT) != 0) { - if (cmd_line_size != sizeof(cmd_line_msg)) { + if (cmd_line_size != original_size) { strncat(cmd_line_msg, " | ", cmd_line_size); cmd_line_size -= 3; } @@ -334,7 +336,7 @@ void loader_log(const struct loader_instance *inst, VkFlags msg_type, int32_t ms cmd_line_size -= 4; } if ((msg_type & LOADER_ERROR_BIT) != 0) { - if (cmd_line_size != sizeof(cmd_line_msg)) { + if (cmd_line_size != original_size) { strncat(cmd_line_msg, " | ", cmd_line_size); cmd_line_size -= 3; } @@ -342,23 +344,35 @@ void loader_log(const struct loader_instance *inst, VkFlags msg_type, int32_t ms cmd_line_size -= 5; } if ((msg_type & LOADER_DEBUG_BIT) != 0) { - if (cmd_line_size != sizeof(cmd_line_msg)) { + if (cmd_line_size != original_size) { strncat(cmd_line_msg, " | ", cmd_line_size); cmd_line_size -= 3; } strncat(cmd_line_msg, "DEBUG", cmd_line_size); cmd_line_size -= 5; } - if (cmd_line_size != sizeof(cmd_line_msg)) { + if (cmd_line_size != original_size) { strncat(cmd_line_msg, ": ", cmd_line_size); cmd_line_size -= 2; } - strncat(cmd_line_msg, msg, cmd_line_size); + + if (0 < cmd_line_size) { + // If the message is too long, trim it down + if (strlen(msg) > cmd_line_size) { + msg[cmd_line_size - 1] = '\0'; + } + strncat(cmd_line_msg, msg, cmd_line_size); + } else { + // Shouldn't get here, but check to make sure if we've already overrun + // the string boundary + assert(false); + } #if defined(WIN32) OutputDebugString(cmd_line_msg); OutputDebugString("\n"); #endif + fputs(cmd_line_msg, stderr); fputc('\n', stderr); } |
