Skip to content

Commit 8dd5185

Browse files
committed
Fix a crash-on-exit in the OpenNI2 driver caused by using a deleted iterator.
Signed-off-by: Robert Xiao <[email protected]>
1 parent 7a1bc22 commit 8dd5185

File tree

1 file changed

+29
-22
lines changed

1 file changed

+29
-22
lines changed

OpenNI2-FreenectDriver/src/DeviceDriver.cpp

Lines changed: 29 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,20 @@ namespace FreenectDriver
210210
class Driver : public oni::driver::DriverBase, private Freenect::Freenect
211211
{
212212
private:
213-
std::map<OniDeviceInfo, oni::driver::DeviceBase*> devices;
213+
typedef std::map<OniDeviceInfo, oni::driver::DeviceBase*> OniDeviceMap;
214+
OniDeviceMap devices;
215+
216+
static std::string devid_to_uri(int id) {
217+
return "freenect://" + to_string(id);
218+
}
219+
220+
static int uri_to_devid(const std::string uri) {
221+
int id;
222+
std::istringstream is(uri);
223+
is.seekg(strlen("freenect://"));
224+
is >> id;
225+
return id;
226+
}
214227

215228
public:
216229
Driver(OniDriverServices* pDriverServices) : DriverBase(pDriverServices)
@@ -230,8 +243,8 @@ namespace FreenectDriver
230243
DriverBase::initialize(connectedCallback, disconnectedCallback, deviceStateChangedCallback, pCookie);
231244
for (int i = 0; i < Freenect::deviceCount(); i++)
232245
{
233-
std::string uri = "freenect://" + to_string(i);
234-
246+
std::string uri = devid_to_uri(i);
247+
235248
WriteMessage("Found device " + uri);
236249

237250
OniDeviceInfo info;
@@ -247,7 +260,7 @@ namespace FreenectDriver
247260

248261
oni::driver::DeviceBase* deviceOpen(const char* uri, const char* mode = NULL)
249262
{
250-
for (std::map<OniDeviceInfo, oni::driver::DeviceBase*>::iterator iter = devices.begin(); iter != devices.end(); iter++)
263+
for (OniDeviceMap::iterator iter = devices.begin(); iter != devices.end(); iter++)
251264
{
252265
if (strcmp(iter->first.uri, uri) == 0) // found
253266
{
@@ -258,11 +271,7 @@ namespace FreenectDriver
258271
else
259272
{
260273
WriteMessage("Opening device " + std::string(uri));
261-
262-
unsigned int id;
263-
std::istringstream is(iter->first.uri);
264-
is.seekg(strlen("freenect://"));
265-
is >> id;
274+
int id = uri_to_devid(iter->first.uri);
266275
Device* device = &createDevice<Device>(id);
267276
iter->second = device;
268277
return device;
@@ -276,24 +285,16 @@ namespace FreenectDriver
276285

277286
void deviceClose(oni::driver::DeviceBase* pDevice)
278287
{
279-
for (std::map<OniDeviceInfo, oni::driver::DeviceBase*>::iterator iter = devices.begin(); iter != devices.end();)
288+
for (OniDeviceMap::iterator iter = devices.begin(); iter != devices.end(); iter++)
280289
{
281290
if (iter->second == pDevice)
282291
{
283292
WriteMessage("Closing device " + std::string(iter->first.uri));
284-
285-
unsigned int id;
286-
std::istringstream is(std::string(iter->first.uri));
287-
is.seekg(strlen("freenect://"));
288-
is >> id;
289-
devices.erase(iter++);
293+
int id = uri_to_devid(iter->first.uri);
294+
devices.erase(iter);
290295
deleteDevice(id);
291296
return;
292297
}
293-
else
294-
{
295-
iter++;
296-
}
297298
}
298299

299300
LogError("Could not close unrecognized device");
@@ -310,8 +311,14 @@ namespace FreenectDriver
310311

311312
void shutdown()
312313
{
313-
for (std::map<OniDeviceInfo, oni::driver::DeviceBase*>::iterator iter = devices.begin(); iter != devices.end(); iter++)
314-
deviceClose(iter->second);
314+
for (OniDeviceMap::iterator iter = devices.begin(); iter != devices.end(); iter++)
315+
{
316+
WriteMessage("Closing device " + std::string(iter->first.uri));
317+
int id = uri_to_devid(iter->first.uri);
318+
deleteDevice(id);
319+
}
320+
321+
devices.clear();
315322
}
316323

317324

0 commit comments

Comments
 (0)