SWDEV-490256 - Fix uri_decode logic to handle Memory URI.

Uri decoder logic currently silently ignores processing of memory uri.
This patch enables the existing logic to handle the processing of offset
and size related to loaded code-object having memory URI.

Change-Id: If03579cefb11d91f667410464dc89404df9270a3
This commit is contained in:
Amit Pandey
2024-10-23 02:03:38 -05:00
committed by Amit Pandey
parent dff8197b1d
commit 11cd37ce0b
2 changed files with 27 additions and 28 deletions
+3 -3
View File
@@ -96,9 +96,9 @@ void handleSanitizerService(Payload* packt_payload, uint64_t activemask,
int64_t loadAddrAdjust = 0;
auto uri_fd = amd::Os::FDescInit();
if (uri_locator) {
device::UriLocator::UriInfo fileuri_info = uri_locator->lookUpUri(callstack[0]);
std::tie(offset, size) = uri_locator->decodeUriAndGetFd(fileuri_info, &uri_fd);
loadAddrAdjust = fileuri_info.loadAddressDiff;
device::UriLocator::UriInfo uri_info = uri_locator->lookUpUri(callstack[0]);
std::tie(offset, size) = uri_locator->decodeUriAndGetFd(uri_info, &uri_fd);
loadAddrAdjust = uri_info.loadAddressDiff;
}
#if defined(__linux__)
+24 -25
View File
@@ -106,7 +106,7 @@ std::pair<uint64_t, uint64_t> UriLocator::decodeUriAndGetFd(UriInfo& uri,
if (uri.uriPath.size() == 0)
return {0,0};
auto pos = uri.uriPath.find("//");
if (pos == std::string::npos || uri.uriPath.substr(0, pos) != "file:") {
if (pos == std::string::npos) {
uri.uriPath="";
return {0,0};
}
@@ -126,32 +126,31 @@ std::pair<uint64_t, uint64_t> UriLocator::decodeUriAndGetFd(UriInfo& uri,
else {
rspos = uri.uriPath.size()-1;
}
pos += 2;
//decode filepath
for (auto i=pos; i<= rspos;) {
cur = uri.uriPath[i];
if (isalnum(cur) || cur == '/' || cur == '-' ||
cur == '_' || cur == '.' || cur == '~') {
ss << cur;
i++;
}
else {
//characters prefix with '%' char
char tbits = uri.uriPath[i+1], lbits = uri.uriPath[i+2];
uint8_t t = (tbits < 58) ? ( tbits - 48) : ((tbits - 65) + 10);
uint8_t l = (lbits < 58) ? ( lbits - 48) : ((lbits - 65) + 10);
ss << (char)(((0b00000000 | t)<<4) | l);
i += 3;
if (uri.uriPath.substr(0, pos) == "file:") {
pos += 2;
// decode filepath
for (auto i = pos; i <= rspos;) {
cur = uri.uriPath[i];
if (isalnum(cur) || cur == '/' || cur == '-' || cur == '_' || cur == '.' || cur == '~') {
ss << cur;
i++;
} else {
// characters prefix with '%' char
char tbits = uri.uriPath[i + 1], lbits = uri.uriPath[i + 2];
uint8_t t = (tbits < 58) ? (tbits - 48) : ((tbits - 65) + 10);
uint8_t l = (lbits < 58) ? (lbits - 48) : ((lbits - 65) + 10);
ss << (char)(((0b00000000 | t) << 4) | l);
i += 3;
}
}
uri.uriPath = ss.str();
size_t fd_size;
(void)amd::Os::GetFileHandle(uri.uriPath.c_str(), uri_fd, &fd_size);
// As per URI locator syntax, range_specifier is optional
// if range_specifier is absent return total size of the file
// and set offset to begin at 0.
if (size == 0) size = fd_size;
}
uri.uriPath = ss.str();
size_t fd_size;
(void) amd::Os::GetFileHandle(uri.uriPath.c_str(), uri_fd, &fd_size);
// As per URI locator syntax, range_specifier is optional
// if range_specifier is absent return total size of the file
// and set offset to begin at 0.
if (size == 0)
size = fd_size;
return {offset, size};
}