mirror of
https://github.com/hyprwm/Hyprland
synced 2024-11-04 18:45:59 +01:00
build: fix 32bit builds (#7510)
ensure the correct type is passed to std::clamp and std::max int64_t is different on 64bit compared to 32bit, also in presentationtime tv_sec is __time_t and on 32bit its a 32bit type so right shift count >= width of type. so only bit shift on 64bit. and avoid potential nullptr deref in the for loops, check for .end() before *it <= endID.
This commit is contained in:
parent
ca85455a8e
commit
9c5a37a797
2 changed files with 10 additions and 6 deletions
|
@ -353,13 +353,13 @@ SWorkspaceIDName getWorkspaceIDNameFromString(const std::string& in) {
|
||||||
char walkDir = in[1];
|
char walkDir = in[1];
|
||||||
|
|
||||||
// sanitize. 0 means invalid oob in -
|
// sanitize. 0 means invalid oob in -
|
||||||
predictedWSID = std::max(predictedWSID, 0L);
|
predictedWSID = std::max(predictedWSID, static_cast<int64_t>(0));
|
||||||
|
|
||||||
// Count how many invalidWSes are in between (how bad the prediction was)
|
// Count how many invalidWSes are in between (how bad the prediction was)
|
||||||
WORKSPACEID beginID = in[1] == '+' ? activeWSID + 1 : predictedWSID;
|
WORKSPACEID beginID = in[1] == '+' ? activeWSID + 1 : predictedWSID;
|
||||||
WORKSPACEID endID = in[1] == '+' ? predictedWSID : activeWSID;
|
WORKSPACEID endID = in[1] == '+' ? predictedWSID : activeWSID;
|
||||||
auto begin = invalidWSes.upper_bound(beginID - 1); // upper_bound is >, we want >=
|
auto begin = invalidWSes.upper_bound(beginID - 1); // upper_bound is >, we want >=
|
||||||
for (auto it = begin; *it <= endID && it != invalidWSes.end(); it++) {
|
for (auto it = begin; it != invalidWSes.end() && *it <= endID; it++) {
|
||||||
remainingWSes++;
|
remainingWSes++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -376,7 +376,7 @@ SWorkspaceIDName getWorkspaceIDNameFromString(const std::string& in) {
|
||||||
}
|
}
|
||||||
|
|
||||||
currentItem += remains;
|
currentItem += remains;
|
||||||
currentItem = std::max(currentItem, 0UL);
|
currentItem = std::max(currentItem, static_cast<size_t>(0));
|
||||||
if (currentItem >= namedWSes.size()) {
|
if (currentItem >= namedWSes.size()) {
|
||||||
// At the seam between namedWSes and normal WSes. Behave like r+[diff] at imaginary ws 0
|
// At the seam between namedWSes and normal WSes. Behave like r+[diff] at imaginary ws 0
|
||||||
size_t diff = currentItem - (namedWSes.size() - 1);
|
size_t diff = currentItem - (namedWSes.size() - 1);
|
||||||
|
@ -384,7 +384,7 @@ SWorkspaceIDName getWorkspaceIDNameFromString(const std::string& in) {
|
||||||
WORKSPACEID beginID = 1;
|
WORKSPACEID beginID = 1;
|
||||||
WORKSPACEID endID = predictedWSID;
|
WORKSPACEID endID = predictedWSID;
|
||||||
auto begin = invalidWSes.upper_bound(beginID - 1); // upper_bound is >, we want >=
|
auto begin = invalidWSes.upper_bound(beginID - 1); // upper_bound is >, we want >=
|
||||||
for (auto it = begin; *it <= endID && it != invalidWSes.end(); it++) {
|
for (auto it = begin; it != invalidWSes.end() && *it <= endID; it++) {
|
||||||
remainingWSes++;
|
remainingWSes++;
|
||||||
}
|
}
|
||||||
walkDir = '+';
|
walkDir = '+';
|
||||||
|
@ -413,7 +413,7 @@ SWorkspaceIDName getWorkspaceIDNameFromString(const std::string& in) {
|
||||||
// Need remainingWSes more
|
// Need remainingWSes more
|
||||||
auto namedWSIdx = namedWSes.size() - remainingWSes;
|
auto namedWSIdx = namedWSes.size() - remainingWSes;
|
||||||
// Sanitze
|
// Sanitze
|
||||||
namedWSIdx = std::clamp(namedWSIdx, 0UL, namedWSes.size() - 1);
|
namedWSIdx = std::clamp(namedWSIdx, static_cast<size_t>(0), namedWSes.size() - static_cast<size_t>(1));
|
||||||
finalWSID = namedWSes[namedWSIdx];
|
finalWSID = namedWSes[namedWSIdx];
|
||||||
} else {
|
} else {
|
||||||
// Couldn't find valid workspace in negative direction, search last first one back up positive direction
|
// Couldn't find valid workspace in negative direction, search last first one back up positive direction
|
||||||
|
|
|
@ -58,8 +58,12 @@ void CPresentationFeedback::sendQueued(SP<CQueuedPresentationData> data, timespe
|
||||||
if (reportedFlags & Aquamarine::IOutput::AQ_OUTPUT_PRESENT_HW_COMPLETION)
|
if (reportedFlags & Aquamarine::IOutput::AQ_OUTPUT_PRESENT_HW_COMPLETION)
|
||||||
flags |= WP_PRESENTATION_FEEDBACK_KIND_HW_COMPLETION;
|
flags |= WP_PRESENTATION_FEEDBACK_KIND_HW_COMPLETION;
|
||||||
|
|
||||||
|
__time_t tv_sec = 0;
|
||||||
|
if (sizeof(__time_t) > 4)
|
||||||
|
tv_sec = when->tv_sec >> 32;
|
||||||
|
|
||||||
if (data->wasPresented)
|
if (data->wasPresented)
|
||||||
resource->sendPresented((uint32_t)(when->tv_sec >> 32), (uint32_t)(when->tv_sec & 0xFFFFFFFF), (uint32_t)(when->tv_nsec), untilRefreshNs, (uint32_t)(seq >> 32),
|
resource->sendPresented((uint32_t)tv_sec, (uint32_t)(when->tv_sec & 0xFFFFFFFF), (uint32_t)(when->tv_nsec), untilRefreshNs, (uint32_t)(seq >> 32),
|
||||||
(uint32_t)(seq & 0xFFFFFFFF), (wpPresentationFeedbackKind)flags);
|
(uint32_t)(seq & 0xFFFFFFFF), (wpPresentationFeedbackKind)flags);
|
||||||
else
|
else
|
||||||
resource->sendDiscarded();
|
resource->sendDiscarded();
|
||||||
|
|
Loading…
Reference in a new issue