Tighten change_filename_extension handling of overflow
This commit is contained in:
parent
a9142bb65a
commit
b0ebe3b82c
|
@ -135,23 +135,17 @@ void removeext(const char *const filename, std::array<char, 20> &out)
|
||||||
memcpy(out.data(), filename, copy_len);
|
memcpy(out.data(), filename, copy_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//give a filename a new extension, won't append if strlen(dest) > 8 chars.
|
//give a filename a new extension, won't append if strlen(dest) > 8 chars.
|
||||||
void change_filename_extension(const std::span<char> dest, const char *const src, const std::span<const char, 4> ext)
|
void change_filename_extension(const std::span<char> dest, const char *const src, const std::span<const char, 4> ext)
|
||||||
{
|
{
|
||||||
char *p;
|
const char *const p = strrchr(src, '.');
|
||||||
|
const std::size_t src_dist_to_last_dot = p ? std::distance(src, p) : strlen(src);
|
||||||
strcpy(dest.data(), src);
|
if (src_dist_to_last_dot + 1 + ext.size() > dest.size())
|
||||||
p = strrchr(dest.data(), '.');
|
{
|
||||||
if (!p) {
|
dest.front() = 0;
|
||||||
if (strlen(dest.data()) > FILENAME_LEN - 5)
|
|
||||||
return; // a non-opened file is better than a bad memory access
|
return; // a non-opened file is better than a bad memory access
|
||||||
|
|
||||||
p = dest.data() + strlen(dest.data());
|
|
||||||
*p = '.';
|
|
||||||
}
|
}
|
||||||
|
std::snprintf(dest.data(), dest.size(), "%.*s.%s", static_cast<int>(src_dist_to_last_dot), src, ext.data());
|
||||||
strcpy(p + 1, ext.data());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
splitpath_t d_splitpath(const char *name)
|
splitpath_t d_splitpath(const char *name)
|
||||||
|
|
Loading…
Reference in a new issue