From 70f8503cbb319009d9aa209c1b4327df7e4f391b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=82=86=E6=9C=88?= <2835601846@qq.com> Date: Wed, 22 Jul 2026 17:46:39 +0800 Subject: [PATCH] fix: prevent OLED sleep duration truncation (#834) OLED sleep settings are stored as seconds, but the kvm_system reader parsed the value into a uint8_t before assigning it to the uint16_t state field. Values above 255 seconds wrapped, so 5 min, 10 min, 30 min, and 1 hour did not behave as selected. Parse the setting into a uint16_t-sized temporary value and terminate the read buffer before atoi so all configured durations up to 3600 seconds are preserved. Closes #826 --- .../kvm_system/main/lib/oled_ui/oled_ui.cpp | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/support/sg2002/kvm_system/main/lib/oled_ui/oled_ui.cpp b/support/sg2002/kvm_system/main/lib/oled_ui/oled_ui.cpp index 3b98604..2de6576 100644 --- a/support/sg2002/kvm_system/main/lib/oled_ui/oled_ui.cpp +++ b/support/sg2002/kvm_system/main/lib/oled_ui/oled_ui.cpp @@ -492,26 +492,30 @@ void oled_auto_sleep_time_update(void) void oled_auto_sleep(void) { - uint8_t tmp8; + uint16_t tmp16; uint8_t sleep_close_signal = 0; FILE *fp; int file_size; - uint8_t RW_Data[10]; + char RW_Data[10] = {0}; if(access("/etc/kvm/oled_sleep", F_OK) == 0){ fp = fopen("/etc/kvm/oled_sleep", "r"); fseek(fp, 0, SEEK_END); file_size = ftell(fp); fseek(fp, 0, SEEK_SET); + if(file_size >= (int)sizeof(RW_Data)){ + file_size = sizeof(RW_Data) - 1; + } fread(RW_Data, sizeof(char), file_size, fp); + RW_Data[file_size] = '\0'; fclose(fp); if(file_size != 0){ - tmp8 = atoi((char*)RW_Data); + tmp16 = atoi(RW_Data); } else { - tmp8 = OLED_SLEEP_DELAY_DEFAULT; + tmp16 = OLED_SLEEP_DELAY_DEFAULT; } - if(tmp8 != kvm_oled_state.oled_sleep_param){ - // printf("/etc/kvm/oled_sleep = %d\n", tmp8); - kvm_oled_state.oled_sleep_param = tmp8; + if(tmp16 != kvm_oled_state.oled_sleep_param){ + // printf("/etc/kvm/oled_sleep = %d\n", tmp16); + kvm_oled_state.oled_sleep_param = tmp16; if(kvm_oled_state.oled_sleep_param < OLED_SLEEP_DELAY_MIN){ sleep_close_signal = 1; } else { @@ -552,4 +556,4 @@ void kvm_show_UE(void) // OLED_ShowString_AlignRight(AlignRightEND_P, 3, " FPS", 4); // kvm_init_pcie_ui(); } -} \ No newline at end of file +}