@@ -96,11 +96,31 @@ bool loadSchedule() {
9696 for (JsonObject e : doc.as <JsonArray>()) {
9797 if (numScheduleEvents >= MAX_SCHEDULE_EVENTS) break ;
9898
99+ // Extract and validate JSON fields before assignment
100+ int sm = e[" sm" ].as <int >();
101+ int sd = e[" sd" ].as <int >();
102+ int em = e[" em" ].as <int >();
103+ int ed = e[" ed" ].as <int >();
104+ int r = e[" r" ].as <int >();
105+ int h = e[" h" ].as <int >();
106+ int m = e[" m" ].as <int >();
107+ int p = e[" p" ].as <int >();
108+
109+ // Validate ranges: months 1–12, days 1–31, hours 0–23, minutes 0–59,
110+ // repeat mask 0–127, preset ID 1–250
111+ if (sm < 1 || sm > 12 || em < 1 || em > 12 ||
112+ sd < 1 || sd > 31 || ed < 1 || ed > 31 ||
113+ h < 0 || h > 23 || m < 0 || m > 59 ||
114+ r < 0 || r > 127 || p < 1 || p > 250 ) {
115+ DEBUG_PRINTF_P (PSTR (" [Schedule] Invalid values in event %u, skipping\n " ), numScheduleEvents);
116+ continue ;
117+ }
118+
99119 scheduleEvents[numScheduleEvents++] = {
100- (uint8_t )e[ " sm " ]. as < int >() , (uint8_t )e[ " sd " ]. as < int >(), // start month, day
101- (uint8_t )e[ " em " ]. as < int >() , (uint8_t )e[ " ed " ]. as < int >(), // end month, day
102- (uint8_t )e[ " r " ]. as < int >() , (uint8_t )e[ " h " ]. as < int >(), // repeat mask, hour
103- (uint8_t )e[ " m " ]. as < int >() , (uint8_t )e[ " p " ]. as < int >() // minute, preset
120+ (uint8_t )sm , (uint8_t )sd,
121+ (uint8_t )em , (uint8_t )ed,
122+ (uint8_t )r , (uint8_t )h,
123+ (uint8_t )m , (uint8_t )p
104124 };
105125 }
106126
0 commit comments