Skip to content

Commit

Permalink
nvapi-drs: Copy only initialized bytes
Browse files Browse the repository at this point in the history
  • Loading branch information
jp7677 committed Feb 7, 2025
1 parent 5060ff2 commit 74f2d69
Show file tree
Hide file tree
Showing 5 changed files with 24 additions and 5 deletions.
6 changes: 4 additions & 2 deletions src/nvapi_drs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,10 @@ extern "C" {
[[fallthrough]];
case NVDRS_APPLICATION_VER_V1:
std::memset(pApplication->launcher, 0, sizeof(pApplication->launcher));
std::memcpy(pApplication->userFriendlyName, appName, sizeof(NvAPI_UnicodeString));
std::memcpy(pApplication->appName, appName, sizeof(NvAPI_UnicodeString));
std::memset(pApplication->userFriendlyName, 0, sizeof(pApplication->userFriendlyName));
std::memset(pApplication->appName, 0, sizeof(pApplication->appName));
str::copynvus(pApplication->userFriendlyName, appName);
str::copynvus(pApplication->appName, appName);
pApplication->isPredefined = 0;
break;
default:
Expand Down
5 changes: 5 additions & 0 deletions src/util/util_string.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@ namespace dxvk::str {
return {w.begin(), w.end()};
}

void copynvus(NvAPI_UnicodeString dst, NvAPI_UnicodeString src) {
auto w = std::wstring(reinterpret_cast<wchar_t*>(src));
w.copy(reinterpret_cast<wchar_t*>(dst), w.size());
}

void tonvss(NvAPI_ShortString nvss, std::string str) {
str.resize(NVAPI_SHORT_STRING_MAX - 1);
strcpy(nvss, str.c_str());
Expand Down
2 changes: 2 additions & 0 deletions src/util/util_string.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ namespace dxvk::str {

std::string fromnvus(NvAPI_UnicodeString nvus);

void copynvus(NvAPI_UnicodeString dst, NvAPI_UnicodeString src);

void tonvss(NvAPI_ShortString nvss, std::string str);

inline void append(std::stringstream&) {}
Expand Down
8 changes: 5 additions & 3 deletions tests/nvapi_drs.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,14 +70,16 @@ TEST_CASE("DRS methods succeed", "[.drs]") {
NvDRSSessionHandle handle{};
NvDRSProfileHandle profile;
NvAPI_UnicodeString name;
memcpy(name, L"Application", 24);
std::memcpy(name, L"Application", 24);
NvAPI_UnicodeString namePaddedEnd{};
memcpy(namePaddedEnd, name, 24);
NvAPI_UnicodeString empty{};
NVDRS_APPLICATION application;
application.version = NVDRS_APPLICATION_VER_V4;
REQUIRE(NvAPI_DRS_FindApplicationByName(handle, name, &profile, &application) == NVAPI_OK);
CHECK_FALSE(application.isPredefined);
CHECK_FALSE(memcmp(application.appName, name, sizeof(NvAPI_UnicodeString)));
CHECK_FALSE(memcmp(application.userFriendlyName, name, sizeof(NvAPI_UnicodeString)));
CHECK_FALSE(memcmp(application.appName, namePaddedEnd, sizeof(NvAPI_UnicodeString)));
CHECK_FALSE(memcmp(application.userFriendlyName, namePaddedEnd, sizeof(NvAPI_UnicodeString)));
CHECK_FALSE(memcmp(application.launcher, empty, sizeof(NvAPI_UnicodeString)));
CHECK_FALSE(memcmp(application.fileInFolder, empty, sizeof(NvAPI_UnicodeString)));
CHECK_FALSE(application.isMetro);
Expand Down
8 changes: 8 additions & 0 deletions tests/util.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,14 @@ TEST_CASE("String", "[.util]") {
REQUIRE(dxvk::str::fromnvus(us) == "Unicode");
}

SECTION("copynvus") {
NvAPI_UnicodeString us = {'U', 'n', 'i', 'c', 'o', 'd', 'e'};
NvAPI_UnicodeString dst{};

dxvk::str::copynvus(dst, us);
REQUIRE(dxvk::str::fromnvus(dst) == "Unicode");
}

SECTION("tonvss") {
NvAPI_ShortString ss{};

Expand Down

0 comments on commit 74f2d69

Please sign in to comment.