Skip to content

Commit a3d70bd

Browse files
xaionaro@dx.centerxaionaro@dx.center
authored andcommitted
fix: add nil checks to prevent SIGSEGV in BT and media examples
Methods returning *jni.Object can return nil even without error (e.g., GetConnectedDevices returns null when no devices connected). Added nil/zero-ref guards before calling methods on returned objects.
1 parent 79c6848 commit a3d70bd

7 files changed

Lines changed: 60 additions & 36 deletions

File tree

examples/bt_beacon_scanner/main.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
8484
if err != nil {
8585
return fmt.Errorf("Manager.GetAdapter: %w", err)
8686
}
87-
if adapterObj == nil {
87+
if adapterObj == nil || adapterObj.Ref() == 0 {
8888
fmt.Fprintln(output, "BluetoothAdapter is null")
8989
return nil
9090
}
@@ -128,7 +128,7 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
128128
if err != nil {
129129
return fmt.Errorf("GetBluetoothLeScanner: %w", err)
130130
}
131-
if scannerObj == nil {
131+
if scannerObj == nil || scannerObj.Ref() == 0 {
132132
fmt.Fprintln(output, "BLE scanner not available (null)")
133133
return nil
134134
}
@@ -200,7 +200,7 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
200200
advObj, err := adapter.GetBluetoothLeAdvertiser()
201201
if err != nil {
202202
fmt.Fprintf(output, "GetBluetoothLeAdvertiser: error (%v)\n", err)
203-
} else if advObj == nil {
203+
} else if advObj == nil || advObj.Ref() == 0 {
204204
fmt.Fprintln(output, "BLE advertiser: not available")
205205
} else {
206206
advertiser := &le.BluetoothLeAdvertiser{VM: vm, Obj: advObj}
@@ -218,7 +218,7 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
218218
bondedObj, err := adapter.GetBondedDevices()
219219
if err != nil {
220220
fmt.Fprintf(output, "GetBondedDevices: error (%v)\n", err)
221-
} else if bondedObj == nil {
221+
} else if bondedObj == nil || bondedObj.Ref() == 0 {
222222
fmt.Fprintln(output, "Bonded devices: null")
223223
} else {
224224
fmt.Fprintln(output, "Bonded devices set: obtained OK")
@@ -229,7 +229,9 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
229229
connDevs, err := mgr.GetConnectedDevices(int32(bluetooth.GattConst))
230230
if err != nil {
231231
fmt.Fprintf(output, "GetConnectedDevices(GATT): %v\n", err)
232-
} else if connDevs != nil {
232+
} else if connDevs == nil || connDevs.Ref() == 0 {
233+
fmt.Fprintln(output, "GATT connected devices: null")
234+
} else {
233235
fmt.Fprintln(output, "GATT connected devices: obtained OK")
234236
vm.Do(func(env *jni.Env) error { env.DeleteGlobalRef(connDevs); return nil })
235237
}

examples/bt_gatt_client/main.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
8686
if err != nil {
8787
return fmt.Errorf("Manager.GetAdapter: %w", err)
8888
}
89-
if adapterObj == nil {
89+
if adapterObj == nil || adapterObj.Ref() == 0 {
9090
fmt.Fprintln(output, "BluetoothAdapter is null (Bluetooth may be disabled)")
9191
return nil
9292
}
@@ -140,7 +140,7 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
140140
connDevs, err := mgr.GetConnectedDevices(int32(bluetooth.GattConst))
141141
if err != nil {
142142
fmt.Fprintf(output, "GetConnectedDevices(GATT): %v\n", err)
143-
} else if connDevs == nil {
143+
} else if connDevs == nil || connDevs.Ref() == 0 {
144144
fmt.Fprintln(output, "Connected devices list: null")
145145
} else {
146146
fmt.Fprintln(output, "Connected devices list: obtained OK")
@@ -156,7 +156,7 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
156156
scannerObj, err := adapter.GetBluetoothLeScanner()
157157
if err != nil {
158158
fmt.Fprintf(output, "GetBluetoothLeScanner: error (%v)\n", err)
159-
} else if scannerObj == nil {
159+
} else if scannerObj == nil || scannerObj.Ref() == 0 {
160160
fmt.Fprintln(output, "BLE scanner: not available (null)")
161161
} else {
162162
scanner := &le.BluetoothLeScanner{VM: vm, Obj: scannerObj}
@@ -253,7 +253,7 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
253253
bondedObj, err := adapter.GetBondedDevices()
254254
if err != nil {
255255
fmt.Fprintf(output, "GetBondedDevices: error (%v)\n", err)
256-
} else if bondedObj == nil {
256+
} else if bondedObj == nil || bondedObj.Ref() == 0 {
257257
fmt.Fprintln(output, "Bonded devices set: null")
258258
} else {
259259
fmt.Fprintln(output, "Bonded devices set: obtained OK")

examples/bt_gatt_server/main.go

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
8484
if err != nil {
8585
return fmt.Errorf("Manager.GetAdapter: %w", err)
8686
}
87-
if adapterObj == nil {
87+
if adapterObj == nil || adapterObj.Ref() == 0 {
8888
fmt.Fprintln(output, "BluetoothAdapter is null")
8989
return nil
9090
}
@@ -128,7 +128,7 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
128128
connDevs, err := mgr.GetConnectedDevices(int32(bluetooth.GattServerConst))
129129
if err != nil {
130130
fmt.Fprintf(output, "GetConnectedDevices(GATT_SERVER): %v\n", err)
131-
} else if connDevs == nil {
131+
} else if connDevs == nil || connDevs.Ref() == 0 {
132132
fmt.Fprintln(output, "Connected devices list: null")
133133
} else {
134134
fmt.Fprintln(output, "Connected devices list: obtained OK")
@@ -139,7 +139,7 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
139139
connDevsGatt, err := mgr.GetConnectedDevices(int32(bluetooth.GattConst))
140140
if err != nil {
141141
fmt.Fprintf(output, "GetConnectedDevices(GATT): %v\n", err)
142-
} else if connDevsGatt == nil {
142+
} else if connDevsGatt == nil || connDevsGatt.Ref() == 0 {
143143
fmt.Fprintln(output, "GATT client connected devices: null")
144144
} else {
145145
fmt.Fprintln(output, "GATT client connected devices: obtained OK")
@@ -220,7 +220,7 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
220220
scannerObj, err := adapter.GetBluetoothLeScanner()
221221
if err != nil {
222222
fmt.Fprintf(output, "GetBluetoothLeScanner: error (%v)\n", err)
223-
} else if scannerObj == nil {
223+
} else if scannerObj == nil || scannerObj.Ref() == 0 {
224224
fmt.Fprintln(output, "BLE scanner: not available")
225225
} else {
226226
scanner := &le.BluetoothLeScanner{VM: vm, Obj: scannerObj}
@@ -235,7 +235,7 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
235235
advObj, err := adapter.GetBluetoothLeAdvertiser()
236236
if err != nil {
237237
fmt.Fprintf(output, "GetBluetoothLeAdvertiser: error (%v)\n", err)
238-
} else if advObj == nil {
238+
} else if advObj == nil || advObj.Ref() == 0 {
239239
fmt.Fprintln(output, "BLE advertiser: not available")
240240
} else {
241241
advertiser := &le.BluetoothLeAdvertiser{VM: vm, Obj: advObj}
@@ -250,7 +250,11 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
250250

251251
// --- Bonded devices ---
252252
bondedObj, err := adapter.GetBondedDevices()
253-
if err == nil && bondedObj != nil {
253+
if err != nil {
254+
fmt.Fprintf(output, "\nGetBondedDevices: error (%v)\n", err)
255+
} else if bondedObj == nil || bondedObj.Ref() == 0 {
256+
fmt.Fprintln(output, "\nBonded devices set: null")
257+
} else {
254258
fmt.Fprintln(output, "\nBonded devices set: obtained OK")
255259
vm.Do(func(env *jni.Env) error { env.DeleteGlobalRef(bondedObj); return nil })
256260
}
@@ -272,7 +276,11 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
272276
}
273277

274278
discoverableTimeout, err := adapter.GetDiscoverableTimeout()
275-
if err == nil && discoverableTimeout != nil {
279+
if err != nil {
280+
fmt.Fprintf(output, "GetDiscoverableTimeout: error (%v)\n", err)
281+
} else if discoverableTimeout == nil || discoverableTimeout.Ref() == 0 {
282+
fmt.Fprintln(output, "Discoverable timeout: null")
283+
} else {
276284
fmt.Fprintln(output, "Discoverable timeout: obtained OK")
277285
vm.Do(func(env *jni.Env) error { env.DeleteGlobalRef(discoverableTimeout); return nil })
278286
}

examples/bt_indoor_position/main.go

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
109109
if err != nil {
110110
return fmt.Errorf("Manager.GetAdapter: %w", err)
111111
}
112-
if adapterObj == nil {
112+
if adapterObj == nil || adapterObj.Ref() == 0 {
113113
fmt.Fprintln(output, "BluetoothAdapter is null")
114114
return nil
115115
}
@@ -153,7 +153,7 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
153153
if err != nil {
154154
return fmt.Errorf("GetBluetoothLeScanner: %w", err)
155155
}
156-
if scannerObj == nil {
156+
if scannerObj == nil || scannerObj.Ref() == 0 {
157157
fmt.Fprintln(output, "BLE scanner not available")
158158
return nil
159159
}
@@ -225,7 +225,7 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
225225
advObj, err := adapter.GetBluetoothLeAdvertiser()
226226
if err != nil {
227227
fmt.Fprintf(output, "GetBluetoothLeAdvertiser: error (%v)\n", err)
228-
} else if advObj == nil {
228+
} else if advObj == nil || advObj.Ref() == 0 {
229229
fmt.Fprintln(output, "BLE advertiser: not available")
230230
} else {
231231
advertiser := &le.BluetoothLeAdvertiser{VM: vm, Obj: advObj}
@@ -240,14 +240,22 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
240240

241241
// --- Bonded devices ---
242242
bondedObj, err := adapter.GetBondedDevices()
243-
if err == nil && bondedObj != nil {
243+
if err != nil {
244+
fmt.Fprintf(output, "\nGetBondedDevices: error (%v)\n", err)
245+
} else if bondedObj == nil || bondedObj.Ref() == 0 {
246+
fmt.Fprintln(output, "\nBonded devices: null")
247+
} else {
244248
fmt.Fprintln(output, "\nBonded devices set: obtained OK")
245249
vm.Do(func(env *jni.Env) error { env.DeleteGlobalRef(bondedObj); return nil })
246250
}
247251

248252
// --- GATT connected devices ---
249253
connDevs, err := mgr.GetConnectedDevices(int32(bluetooth.GattConst))
250-
if err == nil && connDevs != nil {
254+
if err != nil {
255+
fmt.Fprintf(output, "GetConnectedDevices(GATT): %v\n", err)
256+
} else if connDevs == nil || connDevs.Ref() == 0 {
257+
fmt.Fprintln(output, "GATT connected devices: null")
258+
} else {
251259
fmt.Fprintln(output, "GATT connected devices: obtained OK")
252260
vm.Do(func(env *jni.Env) error { env.DeleteGlobalRef(connDevs); return nil })
253261
}

examples/bt_mesh_relay/main.go

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
7979
if err != nil {
8080
return fmt.Errorf("Manager.GetAdapter: %w", err)
8181
}
82-
if adapterObj == nil {
82+
if adapterObj == nil || adapterObj.Ref() == 0 {
8383
fmt.Fprintln(output, "BluetoothAdapter is null")
8484
return nil
8585
}
@@ -176,7 +176,7 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
176176
if err != nil {
177177
return fmt.Errorf("GetBluetoothLeScanner: %w", err)
178178
}
179-
if scannerObj == nil {
179+
if scannerObj == nil || scannerObj.Ref() == 0 {
180180
fmt.Fprintln(output, "BLE scanner not available")
181181
return nil
182182
}
@@ -195,7 +195,7 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
195195
if err != nil {
196196
return fmt.Errorf("GetBluetoothLeAdvertiser: %w", err)
197197
}
198-
if advertiserObj == nil {
198+
if advertiserObj == nil || advertiserObj.Ref() == 0 {
199199
fmt.Fprintln(output, "BLE advertiser not available")
200200
return nil
201201
}
@@ -213,7 +213,7 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
213213
bondedObj, err := adapter.GetBondedDevices()
214214
if err != nil {
215215
fmt.Fprintf(output, "GetBondedDevices: error (%v)\n", err)
216-
} else if bondedObj == nil {
216+
} else if bondedObj == nil || bondedObj.Ref() == 0 {
217217
fmt.Fprintln(output, "Bonded devices: null")
218218
} else {
219219
fmt.Fprintln(output, "Bonded devices set: obtained OK")
@@ -224,7 +224,9 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
224224
connDevs, err := mgr.GetConnectedDevices(int32(bluetooth.GattConst))
225225
if err != nil {
226226
fmt.Fprintf(output, "GetConnectedDevices(GATT): %v\n", err)
227-
} else if connDevs != nil {
227+
} else if connDevs == nil || connDevs.Ref() == 0 {
228+
fmt.Fprintln(output, "GATT connected devices: null")
229+
} else {
228230
fmt.Fprintln(output, "GATT connected devices: obtained OK")
229231
vm.Do(func(env *jni.Env) error { env.DeleteGlobalRef(connDevs); return nil })
230232
}

examples/media_jukebox/main.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
6666
if err != nil {
6767
return fmt.Errorf("create player: %w", err)
6868
}
69+
if p == nil || p.Obj == nil || p.Obj.Ref() == 0 {
70+
return fmt.Errorf("create player: returned null")
71+
}
6972
fmt.Fprintln(output, "MediaPlayer created OK")
7073
ui.RenderOutput()
7174

examples/media_ringtone/main.go

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -74,17 +74,12 @@ func queryAudioEntries(
7474
}
7575

7676
cursor := &resolver.Cursor{VM: vm, Obj: (*jni.GlobalRef)(unsafe.Pointer(cursorObj))}
77-
defer cursor.Close()
78-
defer func() {
79-
vm.Do(func(env *jni.Env) error {
80-
env.DeleteGlobalRef(cursorObj)
81-
return nil
82-
})
83-
}()
8477

8578
count, err := cursor.GetCount()
8679
if err != nil {
8780
fmt.Fprintf(output, " (getCount failed: %v)\n", err)
81+
_ = cursor.Close()
82+
vm.Do(func(env *jni.Env) error { env.DeleteGlobalRef(cursorObj); return nil })
8883
return
8984
}
9085
fmt.Fprintf(output, " Total entries: %d\n", count)
@@ -95,7 +90,7 @@ func queryAudioEntries(
9590
mimeCol, _ := cursor.GetColumnIndex("mime_type")
9691

9792
shown := 0
98-
for shown < maxEntries {
93+
for shown < maxEntries && shown < 3 {
9994
moved, err := cursor.MoveToNext()
10095
if err != nil || !moved {
10196
break
@@ -118,9 +113,12 @@ func queryAudioEntries(
118113
shown++
119114
}
120115

121-
if int(count) > maxEntries {
122-
fmt.Fprintf(output, " ... and %d more\n", int(count)-maxEntries)
116+
if int(count) > shown {
117+
fmt.Fprintf(output, " ... and %d more\n", int(count)-shown)
123118
}
119+
120+
_ = cursor.Close()
121+
vm.Do(func(env *jni.Env) error { env.DeleteGlobalRef(cursorObj); return nil })
124122
}
125123

126124
func run(vm *jni.VM, output *bytes.Buffer) error {
@@ -138,6 +136,9 @@ func run(vm *jni.VM, output *bytes.Buffer) error {
138136
if err != nil {
139137
return fmt.Errorf("NewMediaStore: %w", err)
140138
}
139+
if store == nil || store.Obj == nil || store.Obj.Ref() == 0 {
140+
return fmt.Errorf("NewMediaStore: returned null")
141+
}
141142
defer func() {
142143
vm.Do(func(env *jni.Env) error {
143144
env.DeleteGlobalRef(store.Obj)

0 commit comments

Comments
 (0)