summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakob P. Liljenberg <admin@qvantnet.com>2023-08-26 19:14:00 +0200
committerGitHub <noreply@github.com>2023-08-26 19:14:00 +0200
commit1556388c83644d122fab9241aa876232d94d1928 (patch)
treee5841cfd97025fcb92a6b4a0f3247fd8845fdeaa
parent1b126f55e38de76a2cca796593ef1554828d61e6 (diff)
parentd17e1a2dac79458940319d7117a21bdcd73ed53c (diff)
Merge pull request #599 from joske/main
[macos] fix temp sensor on system with many cores
-rw-r--r--src/osx/smc.cpp16
1 files changed, 10 insertions, 6 deletions
diff --git a/src/osx/smc.cpp b/src/osx/smc.cpp
index 95d75f0..6c483db 100644
--- a/src/osx/smc.cpp
+++ b/src/osx/smc.cpp
@@ -18,6 +18,9 @@ tab-size = 4
#include "smc.hpp"
+static constexpr size_t MaxIndexCount = sizeof("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") - 1;
+static constexpr const char *KeyIndexes = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
static UInt32 _strtoul(char *str, int size, int base) {
UInt32 total = 0;
int i;
@@ -34,7 +37,7 @@ static UInt32 _strtoul(char *str, int size, int base) {
static void _ultostr(char *str, UInt32 val) {
str[0] = '\0';
- sprintf(str, "%c%c%c%c",
+ snprintf(str, 5, "%c%c%c%c",
(unsigned int)val >> 24,
(unsigned int)val >> 16,
(unsigned int)val >> 8,
@@ -44,10 +47,8 @@ static void _ultostr(char *str, UInt32 val) {
namespace Cpu {
SMCConnection::SMCConnection() {
- IOMasterPort(kIOMasterPortDefault, &masterPort);
-
CFMutableDictionaryRef matchingDictionary = IOServiceMatching("AppleSMC");
- result = IOServiceGetMatchingServices(masterPort, matchingDictionary, &iterator);
+ result = IOServiceGetMatchingServices(0, matchingDictionary, &iterator);
if (result != kIOReturnSuccess) {
throw std::runtime_error("failed to get AppleSMC");
}
@@ -92,12 +93,15 @@ namespace Cpu {
long long SMCConnection::getTemp(int core) {
char key[] = SMC_KEY_CPU_TEMP;
if (core >= 0) {
- snprintf(key, 5, "TC%1dc", core);
+ if ((size_t)core > MaxIndexCount) {
+ return -1;
+ }
+ snprintf(key, 5, "TC%1cc", KeyIndexes[core]);
}
long long result = getSMCTemp(key);
if (result == -1) {
// try again with C
- snprintf(key, 5, "TC%1dC", core);
+ snprintf(key, 5, "TC%1dC", KeyIndexes[core]);
result = getSMCTemp(key);
}
return result;