mirror of https://github.com/OpenTTD/OpenTTD.git
Codechange: Pass buffers for TarFile's ExtractString as span. (#12567)
ExtractString does not need to find a string terminator as StrMakeValid already does this, so simply pass the full bounds of the buffer. Removes lengthof, array indices, and needs only the buffer as a parameter.
This commit is contained in:
parent
5159aa81d4
commit
e8249e9075
|
@ -473,17 +473,14 @@ bool TarScanner::AddFile(Subdirectory sd, const std::string &filename)
|
||||||
* header contains garbage and is malicious. So, we cannot rely on the string
|
* header contains garbage and is malicious. So, we cannot rely on the string
|
||||||
* being properly terminated.
|
* being properly terminated.
|
||||||
* As such, do not use strlen to determine the actual length (explicitly or
|
* As such, do not use strlen to determine the actual length (explicitly or
|
||||||
* implictly via the std::string constructor), but also do not create a string
|
* implictly via the std::string constructor), but pass the buffer bounds
|
||||||
* of the buffer length as that makes the string contain essentially garbage.
|
* explicitly.
|
||||||
* @param buffer The buffer to read from.
|
* @param buffer The buffer to read from.
|
||||||
* @param buffer_length The length of the buffer to read from.
|
|
||||||
* @return The string data.
|
* @return The string data.
|
||||||
*/
|
*/
|
||||||
static std::string ExtractString(char *buffer, size_t buffer_length)
|
static std::string ExtractString(std::span<char> buffer)
|
||||||
{
|
{
|
||||||
size_t length = 0;
|
return StrMakeValid(std::string_view(buffer.begin(), buffer.end()));
|
||||||
for (; length < buffer_length && buffer[length] != '\0'; length++) {}
|
|
||||||
return StrMakeValid(std::string_view(buffer, length));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TarScanner::AddFile(const std::string &filename, size_t, [[maybe_unused]] const std::string &tar_filename)
|
bool TarScanner::AddFile(const std::string &filename, size_t, [[maybe_unused]] const std::string &tar_filename)
|
||||||
|
@ -557,15 +554,15 @@ bool TarScanner::AddFile(const std::string &filename, size_t, [[maybe_unused]] c
|
||||||
|
|
||||||
/* The prefix contains the directory-name */
|
/* The prefix contains the directory-name */
|
||||||
if (th.prefix[0] != '\0') {
|
if (th.prefix[0] != '\0') {
|
||||||
name = ExtractString(th.prefix, lengthof(th.prefix));
|
name = ExtractString(th.prefix);
|
||||||
name += PATHSEP;
|
name += PATHSEP;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Copy the name of the file in a safe way at the end of 'name' */
|
/* Copy the name of the file in a safe way at the end of 'name' */
|
||||||
name += ExtractString(th.name, lengthof(th.name));
|
name += ExtractString(th.name);
|
||||||
|
|
||||||
/* The size of the file, for some strange reason, this is stored as a string in octals. */
|
/* The size of the file, for some strange reason, this is stored as a string in octals. */
|
||||||
std::string size = ExtractString(th.size, lengthof(th.size));
|
std::string size = ExtractString(th.size);
|
||||||
size_t skip = size.empty() ? 0 : std::stoul(size, nullptr, 8);
|
size_t skip = size.empty() ? 0 : std::stoul(size, nullptr, 8);
|
||||||
|
|
||||||
switch (th.typeflag) {
|
switch (th.typeflag) {
|
||||||
|
@ -591,7 +588,7 @@ bool TarScanner::AddFile(const std::string &filename, size_t, [[maybe_unused]] c
|
||||||
case '1': // hard links
|
case '1': // hard links
|
||||||
case '2': { // symbolic links
|
case '2': { // symbolic links
|
||||||
/* Copy the destination of the link in a safe way at the end of 'linkname' */
|
/* Copy the destination of the link in a safe way at the end of 'linkname' */
|
||||||
std::string link = ExtractString(th.linkname, lengthof(th.linkname));
|
std::string link = ExtractString(th.linkname);
|
||||||
|
|
||||||
if (name.empty() || link.empty()) break;
|
if (name.empty() || link.empty()) break;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue