Skip to content

Commit 76e0e88

Browse files
committed
fix: guard role-to-enum casts in models to prevent RangeDefect crashes
Fixes #21085 Add defensive bounds checks before converting Qt role integers to Nim enum roles across list-model data methods. Return early when role is outside low(EnumRole)..high(EnumRole) Prevent RangeDefect from bubbling through Qt event handlers during model/delegate lifecycle and tab switches Apply the same protection pattern consistently across main, shared, onboarding, and keycard popup models Includes the SectionModel hotspot and all other detected role-to-enum cast sites
1 parent ee83704 commit 76e0e88

72 files changed

Lines changed: 258 additions & 393 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/app/modules/main/activity_center/model.nim

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import app/modules/shared_models/model_utils
12
import nimqml, tables, json, sequtils, strutils
23
import ./item
34
import ../../../../app_service/service/activity_center/dto/notification
@@ -60,10 +61,7 @@ QtObject:
6061
method rowCount*(self: Model, index: QModelIndex = nil): int = self.activityCenterNotifications.len
6162

6263
method data(self: Model, index: QModelIndex, role: int): QVariant =
63-
if not index.isValid:
64-
return
65-
if index.row < 0 or index.row >= self.activityCenterNotifications.len:
66-
return
64+
guardModelData(index, self.activityCenterNotifications.len, role, NotifRoles)
6765

6866
let activityNotificationItem = self.activityCenterNotifications[index.row]
6967
let notificationItemRole = role.NotifRoles

src/app/modules/main/app_search/models/chat_search_model.nim

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import app/modules/shared_models/model_utils
12
import nimqml, tables
23
import chat_search_item
34
import ../../../shared_models/model_utils
@@ -86,11 +87,10 @@ QtObject:
8687
}.toTable
8788

8889
method data(self: Model, index: QModelIndex, role: int): QVariant =
89-
if not index.isValid:
90-
return
91-
if index.row < 0 or index.row >= self.items.len:
92-
return
90+
guardModelData(index, self.items.len, role, ModelRole)
91+
9392
let item = self.items[index.row]
93+
9494
let enumRole = role.ModelRole
9595

9696
case enumRole:

src/app/modules/main/app_search/models/location_menu_model.nim

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import app/modules/shared_models/model_utils
12
import nimqml, tables, strutils
23

34
import location_menu_item, location_menu_sub_item
@@ -38,13 +39,10 @@ QtObject:
3839
}.toTable
3940

4041
method data(self: Model, index: QModelIndex, role: int): QVariant =
41-
if (not index.isValid):
42-
return
43-
44-
if (index.row < 0 or index.row >= self.items.len):
45-
return
42+
guardModelData(index, self.items.len, role, ModelRole)
4643

4744
let item = self.items[index.row]
45+
4846
let enumRole = role.ModelRole
4947

5048
case enumRole:
@@ -78,4 +76,3 @@ QtObject:
7876

7977
proc setup(self: Model) =
8078
self.QAbstractListModel.setup
81-

src/app/modules/main/app_search/models/location_menu_sub_model.nim

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import app/modules/shared_models/model_utils
12
import nimqml, tables, strutils, std/strformat
23

34
import location_menu_sub_item
@@ -59,13 +60,10 @@ QtObject:
5960
}.toTable
6061

6162
method data(self: SubModel, index: QModelIndex, role: int): QVariant =
62-
if (not index.isValid):
63-
return
64-
65-
if (index.row < 0 or index.row >= self.items.len):
66-
return
63+
guardModelData(index, self.items.len, role, SubModelRole)
6764

6865
let item = self.items[index.row]
66+
6967
let enumRole = role.SubModelRole
7068

7169
case enumRole:
@@ -105,4 +103,3 @@ QtObject:
105103

106104
proc setup(self: SubModel) =
107105
self.QAbstractListModel.setup
108-

src/app/modules/main/app_search/models/result_model.nim

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import app/modules/shared_models/model_utils
12
import nimqml, tables, strutils, std/strformat
23

34
import result_item
@@ -67,13 +68,10 @@ QtObject:
6768
}.toTable
6869

6970
method data(self: Model, index: QModelIndex, role: int): QVariant =
70-
if (not index.isValid):
71-
return
72-
73-
if (index.row < 0 or index.row >= self.resultList.len):
74-
return
71+
guardModelData(index, self.resultList.len, role, ModelRole)
7572

7673
let item = self.resultList[index.row]
74+
7775
let enumRole = role.ModelRole
7876

7977
case enumRole:
@@ -130,4 +128,3 @@ QtObject:
130128

131129
proc setup(self: Model) =
132130
self.QAbstractListModel.setup
133-

src/app/modules/main/browser_section/bookmark/model.nim

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import app/modules/shared_models/model_utils
12
import nimqml, tables, strutils, std/strformat
23

34
import item
@@ -45,13 +46,10 @@ QtObject:
4546
}.toTable
4647

4748
method data(self: Model, index: QModelIndex, role: int): QVariant =
48-
if (not index.isValid):
49-
return
50-
51-
if (index.row < 0 or index.row >= self.items.len):
52-
return
49+
guardModelData(index, self.items.len, role, ModelRole)
5350

5451
let item = self.items[index.row]
52+
5553
let enumRole = role.ModelRole
5654

5755
case enumRole:
@@ -118,4 +116,3 @@ QtObject:
118116

119117
proc setup(self: Model) =
120118
self.QAbstractListModel.setup
121-

src/app/modules/main/browser_section/dapps/accounts.nim

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import app/modules/shared_models/model_utils
12
import nimqml, tables, strutils, std/strformat
23
import ../../../../../app_service/service/wallet_account/service as wallet_account_service
34

@@ -47,13 +48,10 @@ QtObject:
4748
}.toTable
4849

4950
method data(self: AccountsModel, index: QModelIndex, role: int): QVariant =
50-
if (not index.isValid):
51-
return
52-
53-
if (index.row < 0 or index.row >= self.items.len):
54-
return
51+
guardModelData(index, self.items.len, role, ModelRole)
5552

5653
let item = self.items[index.row]
54+
5755
let enumRole = role.ModelRole
5856

5957
case enumRole:
@@ -91,4 +89,3 @@ QtObject:
9189

9290
proc setup(self: AccountsModel) =
9391
self.QAbstractListModel.setup
94-

src/app/modules/main/browser_section/dapps/dapps.nim

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import app/modules/shared_models/model_utils
12
import nimqml, tables, strutils, std/strformat, json
23
import ./item
34

@@ -44,13 +45,10 @@ QtObject:
4445
}.toTable
4546

4647
method data(self: DappsModel, index: QModelIndex, role: int): QVariant =
47-
if (not index.isValid):
48-
return
49-
50-
if (index.row < 0 or index.row >= self.items.len):
51-
return
48+
guardModelData(index, self.items.len, role, ModelRole)
5249

5350
let item = self.items[index.row]
51+
5452
let enumRole = role.ModelRole
5553
case enumRole:
5654
of ModelRole.Name:
@@ -84,4 +82,3 @@ QtObject:
8482

8583
proc setup(self: DappsModel) =
8684
self.QAbstractListModel.setup
87-

src/app/modules/main/browser_section/dapps/permissions.nim

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import app/modules/shared_models/model_utils
12
import nimqml, tables, strutils, std/strformat
23

34
type
@@ -39,11 +40,8 @@ QtObject:
3940
}.toTable
4041

4142
method data(self: PermissionsModel, index: QModelIndex, role: int): QVariant =
42-
if (not index.isValid):
43-
return
43+
guardModelDataIndex(index, self.items.len)
4444

45-
if (index.row < 0 or index.row >= self.items.len):
46-
return
4745
result = newQVariant(self.items[index.row])
4846

4947
proc addItem*(self: PermissionsModel, item: string) =
@@ -68,4 +66,3 @@ QtObject:
6866

6967
proc setup(self: PermissionsModel) =
7068
self.QAbstractListModel.setup
71-

src/app/modules/main/chat_section/chat_content/input_area/urls_model.nim

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import app/modules/shared_models/model_utils
12
import nimqml, tables, sequtils
23

34
type
@@ -33,11 +34,7 @@ QtObject:
3334
}.toTable
3435

3536
method data(self: Model, index: QModelIndex, role: int): QVariant =
36-
if (not index.isValid):
37-
return
38-
39-
if (index.row < 0 or index.row >= self.items.len):
40-
return
37+
guardModelData(index, self.items.len, role, ModelRole)
4138

4239
let enumRole = role.ModelRole
4340

@@ -93,4 +90,3 @@ QtObject:
9390

9491
proc setup(self: Model) =
9592
self.QAbstractListModel.setup
96-

0 commit comments

Comments
 (0)