aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2021-01-09 19:17:29 +0100
committerDavid Robillard <d@drobilla.net>2021-01-09 19:25:31 +0100
commit0b187ad97c52a2443b8c2b2bef7c4c9e66508a65 (patch)
treef7a7f748e898253426e4b44cac2f0125f389abf0
parentb3a07044be6f31e20587011309b7798243ed93e0 (diff)
downloadserd-0b187ad97c52a2443b8c2b2bef7c4c9e66508a65.tar.gz
serd-0b187ad97c52a2443b8c2b2bef7c4c9e66508a65.tar.bz2
serd-0b187ad97c52a2443b8c2b2bef7c4c9e66508a65.zip
Avoid GCC warning about printed string overflow
GCC seems to think there was a potential overflow here, but I don't see it. I think it just can't figure out that the printed text and the size both depend on the same variable. In any case, avoiding formatting functions here avoids the warning, and is probably faster anyway.
-rw-r--r--src/node.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/src/node.c b/src/node.c
index 5bd08817..4750a83a 100644
--- a/src/node.c
+++ b/src/node.c
@@ -189,23 +189,28 @@ serd_node_new_file_uri(const uint8_t* path,
{
const size_t path_len = strlen((const char*)path);
const size_t hostname_len = hostname ? strlen((const char*)hostname) : 0;
- const bool evil = is_windows_path(path);
+ const bool is_windows = is_windows_path(path);
size_t uri_len = 0;
uint8_t* uri = NULL;
- if (path[0] == '/' || is_windows_path(path)) {
- uri_len = strlen("file://") + hostname_len + evil;
+ if (path[0] == '/' || is_windows) {
+ uri_len = strlen("file://") + hostname_len + is_windows;
uri = (uint8_t*)malloc(uri_len + 1);
- snprintf((char*)uri,
- uri_len + 1,
- "file://%s%s",
- hostname ? (const char*)hostname : "",
- evil ? "/" : "");
+
+ strcpy((char*)uri, "file://");
+
+ if (hostname) {
+ strcpy((char*)uri + 7, (char*)hostname);
+ }
+
+ if (is_windows) {
+ ((char*)uri)[7 + hostname_len] = '/';
+ }
}
SerdChunk chunk = {uri, uri_len};
for (size_t i = 0; i < path_len; ++i) {
- if (evil && path[i] == '\\') {
+ if (is_windows && path[i] == '\\') {
serd_chunk_sink("/", 1, &chunk);
} else if (path[i] == '%') {
serd_chunk_sink("%%", 2, &chunk);