Skip to content

Commit 4f62a7e

Browse files
committed
instead of performing costly memory dealloc and alloc, check if inner array is alloced, clear and rewrite it, this will also hopefully correct strange crash conditions when the NAC changes during operation;
1 parent d05a593 commit 4f62a7e

1 file changed

Lines changed: 42 additions & 16 deletions

File tree

src/common/p25/NID.cpp

Lines changed: 42 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ bool NID::decode(const uint8_t* data)
7171
// handle digital "squelch" NAC
7272
if ((m_nac == NAC_DIGITAL_SQ) || (m_nac == NAC_REUSE_RX_NAC)) {
7373
uint32_t nac = ((nid[0U] << 4) + (nid[1U] >> 4)) & 0xFFFU;
74-
cleanupArrays();
7574
createRxTxNID(nac); // bryanb: I hate this and it'll be slow
7675
}
7776

@@ -144,7 +143,6 @@ void NID::encode(uint8_t* data, defines::DUID::E duid)
144143
else {
145144
// handle digital "squelch" NAC
146145
if (m_nac == NAC_DIGITAL_SQ) {
147-
cleanupArrays();
148146
createRxTxNID(DEFAULT_NAC);
149147
}
150148

@@ -202,49 +200,63 @@ void NID::createRxTxNID(uint32_t nac)
202200
{
203201
edac::BCH bch;
204202

205-
m_rxTx[DUID::HDU] = new uint8_t[P25_NID_LENGTH_BYTES];
203+
if (m_rxTx[DUID::HDU] == nullptr)
204+
m_rxTx[DUID::HDU] = new uint8_t[P25_NID_LENGTH_BYTES];
205+
::memset(m_rxTx[DUID::HDU], 0, P25_NID_LENGTH_BYTES);
206206
m_rxTx[DUID::HDU][0U] = (nac >> 4) & 0xFFU;
207207
m_rxTx[DUID::HDU][1U] = (nac << 4) & 0xF0U;
208208
m_rxTx[DUID::HDU][1U] |= DUID::HDU;
209209
bch.encode(m_rxTx[DUID::HDU]);
210210
m_rxTx[DUID::HDU][7U] &= 0xFEU; // Clear the parity bit
211211

212-
m_rxTx[DUID::TDU] = new uint8_t[P25_NID_LENGTH_BYTES];
212+
if (m_rxTx[DUID::TDU] == nullptr)
213+
m_rxTx[DUID::TDU] = new uint8_t[P25_NID_LENGTH_BYTES];
214+
::memset(m_rxTx[DUID::TDU], 0, P25_NID_LENGTH_BYTES);
213215
m_rxTx[DUID::TDU][0U] = (nac >> 4) & 0xFFU;
214216
m_rxTx[DUID::TDU][1U] = (nac << 4) & 0xF0U;
215217
m_rxTx[DUID::TDU][1U] |= DUID::TDU;
216218
bch.encode(m_rxTx[DUID::TDU]);
217219
m_rxTx[DUID::TDU][7U] &= 0xFEU; // Clear the parity bit
218220

219-
m_rxTx[DUID::LDU1] = new uint8_t[P25_NID_LENGTH_BYTES];
221+
if (m_rxTx[DUID::LDU1] == nullptr)
222+
m_rxTx[DUID::LDU1] = new uint8_t[P25_NID_LENGTH_BYTES];
223+
::memset(m_rxTx[DUID::LDU1], 0, P25_NID_LENGTH_BYTES);
220224
m_rxTx[DUID::LDU1][0U] = (nac >> 4) & 0xFFU;
221225
m_rxTx[DUID::LDU1][1U] = (nac << 4) & 0xF0U;
222226
m_rxTx[DUID::LDU1][1U] |= DUID::LDU1;
223227
bch.encode(m_rxTx[DUID::LDU1]);
224228
m_rxTx[DUID::LDU1][7U] |= 0x01U; // Set the parity bit
225229

226-
m_rxTx[DUID::PDU] = new uint8_t[P25_NID_LENGTH_BYTES];
230+
if (m_rxTx[DUID::PDU] == nullptr)
231+
m_rxTx[DUID::PDU] = new uint8_t[P25_NID_LENGTH_BYTES];
232+
::memset(m_rxTx[DUID::PDU], 0, P25_NID_LENGTH_BYTES);
227233
m_rxTx[DUID::PDU][0U] = (nac >> 4) & 0xFFU;
228234
m_rxTx[DUID::PDU][1U] = (nac << 4) & 0xF0U;
229235
m_rxTx[DUID::PDU][1U] |= DUID::PDU;
230236
bch.encode(m_rxTx[DUID::PDU]);
231237
m_rxTx[DUID::PDU][7U] &= 0xFEU; // Clear the parity bit
232238

233-
m_rxTx[DUID::TSDU] = new uint8_t[P25_NID_LENGTH_BYTES];
239+
if (m_rxTx[DUID::TSDU] == nullptr)
240+
m_rxTx[DUID::TSDU] = new uint8_t[P25_NID_LENGTH_BYTES];
241+
::memset(m_rxTx[DUID::TSDU], 0, P25_NID_LENGTH_BYTES);
234242
m_rxTx[DUID::TSDU][0U] = (nac >> 4) & 0xFFU;
235243
m_rxTx[DUID::TSDU][1U] = (nac << 4) & 0xF0U;
236244
m_rxTx[DUID::TSDU][1U] |= DUID::TSDU;
237245
bch.encode(m_rxTx[DUID::TSDU]);
238246
m_rxTx[DUID::TSDU][7U] &= 0xFEU; // Clear the parity bit
239247

240-
m_rxTx[DUID::LDU2] = new uint8_t[P25_NID_LENGTH_BYTES];
248+
if (m_rxTx[DUID::LDU2] == nullptr)
249+
m_rxTx[DUID::LDU2] = new uint8_t[P25_NID_LENGTH_BYTES];
250+
::memset(m_rxTx[DUID::LDU2], 0, P25_NID_LENGTH_BYTES);
241251
m_rxTx[DUID::LDU2][0U] = (nac >> 4) & 0xFFU;
242252
m_rxTx[DUID::LDU2][1U] = (nac << 4) & 0xF0U;
243253
m_rxTx[DUID::LDU2][1U] |= DUID::LDU2;
244254
bch.encode(m_rxTx[DUID::LDU2]);
245255
m_rxTx[DUID::LDU2][7U] |= 0x01U; // Set the parity bit
246256

247-
m_rxTx[DUID::TDULC] = new uint8_t[P25_NID_LENGTH_BYTES];
257+
if (m_rxTx[DUID::TDULC] == nullptr)
258+
m_rxTx[DUID::TDULC] = new uint8_t[P25_NID_LENGTH_BYTES];
259+
::memset(m_rxTx[DUID::TDULC], 0, P25_NID_LENGTH_BYTES);
248260
m_rxTx[DUID::TDULC][0U] = (nac >> 4) & 0xFFU;
249261
m_rxTx[DUID::TDULC][1U] = (nac << 4) & 0xF0U;
250262
m_rxTx[DUID::TDULC][1U] |= DUID::TDULC;
@@ -258,49 +270,63 @@ void NID::createTxNID(uint32_t nac)
258270
{
259271
edac::BCH bch;
260272

261-
m_tx[DUID::HDU] = new uint8_t[P25_NID_LENGTH_BYTES];
273+
if (m_tx[DUID::HDU] == nullptr)
274+
m_tx[DUID::HDU] = new uint8_t[P25_NID_LENGTH_BYTES];
275+
::memset(m_tx[DUID::HDU], 0, P25_NID_LENGTH_BYTES);
262276
m_tx[DUID::HDU][0U] = (nac >> 4) & 0xFFU;
263277
m_tx[DUID::HDU][1U] = (nac << 4) & 0xF0U;
264278
m_tx[DUID::HDU][1U] |= DUID::HDU;
265279
bch.encode(m_tx[DUID::HDU]);
266280
m_tx[DUID::HDU][7U] &= 0xFEU; // Clear the parity bit
267281

268-
m_tx[DUID::TDU] = new uint8_t[P25_NID_LENGTH_BYTES];
282+
if (m_tx[DUID::TDU] == nullptr)
283+
m_tx[DUID::TDU] = new uint8_t[P25_NID_LENGTH_BYTES];
284+
::memset(m_tx[DUID::TDU], 0, P25_NID_LENGTH_BYTES);
269285
m_tx[DUID::TDU][0U] = (nac >> 4) & 0xFFU;
270286
m_tx[DUID::TDU][1U] = (nac << 4) & 0xF0U;
271287
m_tx[DUID::TDU][1U] |= DUID::TDU;
272288
bch.encode(m_tx[DUID::TDU]);
273289
m_tx[DUID::TDU][7U] &= 0xFEU; // Clear the parity bit
274290

275-
m_tx[DUID::LDU1] = new uint8_t[P25_NID_LENGTH_BYTES];
291+
if (m_tx[DUID::LDU1] == nullptr)
292+
m_tx[DUID::LDU1] = new uint8_t[P25_NID_LENGTH_BYTES];
293+
::memset(m_tx[DUID::LDU1], 0, P25_NID_LENGTH_BYTES);
276294
m_tx[DUID::LDU1][0U] = (nac >> 4) & 0xFFU;
277295
m_tx[DUID::LDU1][1U] = (nac << 4) & 0xF0U;
278296
m_tx[DUID::LDU1][1U] |= DUID::LDU1;
279297
bch.encode(m_tx[DUID::LDU1]);
280298
m_tx[DUID::LDU1][7U] |= 0x01U; // Set the parity bit
281299

282-
m_tx[DUID::PDU] = new uint8_t[P25_NID_LENGTH_BYTES];
300+
if (m_tx[DUID::PDU] == nullptr)
301+
m_tx[DUID::PDU] = new uint8_t[P25_NID_LENGTH_BYTES];
302+
::memset(m_tx[DUID::PDU], 0, P25_NID_LENGTH_BYTES);
283303
m_tx[DUID::PDU][0U] = (nac >> 4) & 0xFFU;
284304
m_tx[DUID::PDU][1U] = (nac << 4) & 0xF0U;
285305
m_tx[DUID::PDU][1U] |= DUID::PDU;
286306
bch.encode(m_tx[DUID::PDU]);
287307
m_tx[DUID::PDU][7U] &= 0xFEU; // Clear the parity bit
288308

289-
m_tx[DUID::TSDU] = new uint8_t[P25_NID_LENGTH_BYTES];
309+
if (m_tx[DUID::TSDU] == nullptr)
310+
m_tx[DUID::TSDU] = new uint8_t[P25_NID_LENGTH_BYTES];
311+
::memset(m_tx[DUID::TSDU], 0, P25_NID_LENGTH_BYTES);
290312
m_tx[DUID::TSDU][0U] = (nac >> 4) & 0xFFU;
291313
m_tx[DUID::TSDU][1U] = (nac << 4) & 0xF0U;
292314
m_tx[DUID::TSDU][1U] |= DUID::TSDU;
293315
bch.encode(m_tx[DUID::TSDU]);
294316
m_tx[DUID::TSDU][7U] &= 0xFEU; // Clear the parity bit
295317

296-
m_tx[DUID::LDU2] = new uint8_t[P25_NID_LENGTH_BYTES];
318+
if (m_tx[DUID::LDU2] == nullptr)
319+
m_tx[DUID::LDU2] = new uint8_t[P25_NID_LENGTH_BYTES];
320+
::memset(m_tx[DUID::LDU2], 0, P25_NID_LENGTH_BYTES);
297321
m_tx[DUID::LDU2][0U] = (nac >> 4) & 0xFFU;
298322
m_tx[DUID::LDU2][1U] = (nac << 4) & 0xF0U;
299323
m_tx[DUID::LDU2][1U] |= DUID::LDU2;
300324
bch.encode(m_tx[DUID::LDU2]);
301325
m_tx[DUID::LDU2][7U] |= 0x01U; // Set the parity bit
302326

303-
m_tx[DUID::TDULC] = new uint8_t[P25_NID_LENGTH_BYTES];
327+
if (m_tx[DUID::TDULC] == nullptr)
328+
m_tx[DUID::TDULC] = new uint8_t[P25_NID_LENGTH_BYTES];
329+
::memset(m_tx[DUID::TDULC], 0, P25_NID_LENGTH_BYTES);
304330
m_tx[DUID::TDULC][0U] = (nac >> 4) & 0xFFU;
305331
m_tx[DUID::TDULC][1U] = (nac << 4) & 0xF0U;
306332
m_tx[DUID::TDULC][1U] |= DUID::TDULC;

0 commit comments

Comments
 (0)