forked from lix-project/lix
Sergei Trofimovich
b74962c92b
Without the change build with `-D_GLIBCXX_ASSERTIONS` exposes testsuite assertion: $ gdb src/libexpr/tests/libnixexpr-tests Reading symbols from src/libexpr/tests/libnixexpr-tests... (gdb) break __glibcxx_assert_fail (gdb) run (gdb) bt in std::__glibcxx_assert_fail(char const*, int, char const*, char const*)@plt () from /mnt/archive/big/git/nix/src/libexpr/libnixexpr.so in std::basic_string_view<char, std::char_traits<char> >::operator[] (this=0x7fffffff56c0, __pos=4) at /nix/store/r74fw2j8rx5idb0w8s1s6ynwwgs0qmh9-gcc-14.0.0/include/c++/14.0.0/string_view:258 in nix::SearchPath::Prefix::suffixIfPotentialMatch (this=0x7fffffff5780, path=...) at src/libexpr/search-path.cc:15 in nix::SearchPathElem_suffixIfPotentialMatch_partialPrefix_Test::TestBody (this=0x555555a17540) at src/libexpr/tests/search-path.cc:62 As string sizes are usigned types `(a - b) > 0` effectively means `a != b`. While the intention should be `a > b`. The change fixes test suite pass.
57 lines
1.3 KiB
C++
57 lines
1.3 KiB
C++
#include "search-path.hh"
|
|
#include "util.hh"
|
|
|
|
namespace nix {
|
|
|
|
std::optional<std::string_view> SearchPath::Prefix::suffixIfPotentialMatch(
|
|
std::string_view path) const
|
|
{
|
|
auto n = s.size();
|
|
|
|
/* Non-empty prefix and suffix must be separated by a /, or the
|
|
prefix is not a valid path prefix. */
|
|
bool needSeparator = n > 0 && n < path.size();
|
|
|
|
if (needSeparator && path[n] != '/') {
|
|
return std::nullopt;
|
|
}
|
|
|
|
/* Prefix must be prefix of this path. */
|
|
if (path.compare(0, n, s) != 0) {
|
|
return std::nullopt;
|
|
}
|
|
|
|
/* Skip next path separator. */
|
|
return {
|
|
path.substr(needSeparator ? n + 1 : n)
|
|
};
|
|
}
|
|
|
|
|
|
SearchPath::Elem SearchPath::Elem::parse(std::string_view rawElem)
|
|
{
|
|
size_t pos = rawElem.find('=');
|
|
|
|
return SearchPath::Elem {
|
|
.prefix = Prefix {
|
|
.s = pos == std::string::npos
|
|
? std::string { "" }
|
|
: std::string { rawElem.substr(0, pos) },
|
|
},
|
|
.path = Path {
|
|
.s = std::string { rawElem.substr(pos + 1) },
|
|
},
|
|
};
|
|
}
|
|
|
|
|
|
SearchPath parseSearchPath(const Strings & rawElems)
|
|
{
|
|
SearchPath res;
|
|
for (auto & rawElem : rawElems)
|
|
res.elements.emplace_back(SearchPath::Elem::parse(rawElem));
|
|
return res;
|
|
}
|
|
|
|
}
|