Skip to content

Commit ea0c2ea

Browse files
authored
Merge pull request #2225 from SmartThingsCommunity/fix/sonos-nil-index-crash-in-chained-state-queries
2 parents c2c38a1 + 43a8994 commit ea0c2ea

File tree

1 file changed

+37
-1
lines changed

1 file changed

+37
-1
lines changed

drivers/SmartThings/sonos/src/sonos_state.lua

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,10 @@ end
234234
---@param player_id PlayerId
235235
---@return string? device_id
236236
function SonosState:get_device_id_for_player(household_id, player_id)
237+
if type(player_id) ~= "string" then
238+
log.error(string.format("invalid player id provided: %s", player_id))
239+
return nil
240+
end
237241
local household = _STATE.households[household_id]
238242
if not household then
239243
log.error(string.format("No record of Sonos household with id %s", household_id))
@@ -245,6 +249,10 @@ end
245249
---@param id HouseholdId
246250
---@return SonosHousehold
247251
function SonosState:get_household(id)
252+
if type(id) ~= "string" then
253+
log.error(string.format("invalid household id provided: %s", id))
254+
return nil
255+
end
248256
return _STATE.households[id]
249257
end
250258

@@ -311,6 +319,10 @@ function SonosState:get_group_for_player(household_id, player_id)
311319
true
312320
)
313321
)
322+
if type(player_id) ~= "string" then
323+
log.error(string.format("invalid player id provided: %s", player_id))
324+
return nil
325+
end
314326
local household = _STATE.households[household_id]
315327
if household == nil then
316328
log.error(
@@ -334,6 +346,10 @@ function SonosState:get_coordinator_for_player(household_id, player_id)
334346
true
335347
)
336348
)
349+
if type(player_id) ~= "string" then
350+
log.error(string.format("invalid player id provided: %s", player_id))
351+
return nil
352+
end
337353
return self:get_coordinator_for_group(
338354
household_id,
339355
self:get_group_for_player(household_id, player_id)
@@ -352,6 +368,10 @@ function SonosState:get_coordinator_for_group(household_id, group_id)
352368
true
353369
)
354370
)
371+
if type(group_id) ~= "string" then
372+
log.error(string.format("invalid group id provided: %s", group_id))
373+
return nil
374+
end
355375
local household = _STATE.households[household_id]
356376
if household == nil then
357377
log.error(
@@ -368,7 +388,14 @@ function SonosState:get_coordinator_for_group(household_id, group_id)
368388
false
369389
)
370390
end
371-
return household.groups[group_id].coordinatorId
391+
392+
local group = (household.groups or {})[group_id]
393+
if type(group) ~= "table" then
394+
log.error(string.format("No known group for id %s in household %s", group_id, household_id))
395+
return
396+
end
397+
398+
return group.coordinatorId
372399
end
373400

374401
--- @param device SonosDevice
@@ -421,6 +448,9 @@ end
421448
--- @return PlayerId|nil player_id nil on error
422449
--- @return nil|string error nil on success
423450
function SonosState:get_player_for_device(device)
451+
if type(device) ~= "table" then
452+
return nil, string.format("Invalid device argument for get_player_for_device: %s", device)
453+
end
424454
local household_id, _, player_id, err = self:get_sonos_ids_for_device(device)
425455
if err then
426456
return nil, nil, err
@@ -433,6 +463,9 @@ end
433463
--- @return GroupId|nil group_id nil on error
434464
--- @return nil|string error nil on success
435465
function SonosState:get_group_for_device(device)
466+
if type(device) ~= "table" then
467+
return nil, string.format("Invalid device argument for get_player_for_device: %s", device)
468+
end
436469
local household_id, group_id, _, err = self:get_sonos_ids_for_device(device)
437470
if err then
438471
return nil, nil, err
@@ -445,6 +478,9 @@ end
445478
--- @return PlayerId|nil coordinator_id nil on error
446479
--- @return nil|string error nil on success
447480
function SonosState:get_coordinator_for_device(device)
481+
if type(device) ~= "table" then
482+
return nil, string.format("Invalid device argument for get_player_for_device: %s", device)
483+
end
448484
local household_id, group_id, _, err = self:get_sonos_ids_for_device(device)
449485
if err then
450486
return nil, nil, err

0 commit comments

Comments
 (0)