Skip to content

Commit 3e49f07

Browse files
committed
Harden list management in pgm.c/config_gram.y
1 parent 731d581 commit 3e49f07

File tree

2 files changed

+43
-38
lines changed

2 files changed

+43
-38
lines changed

src/config_gram.y

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -536,25 +536,22 @@ usb_pid_list:
536536
TKN_NUMBER {
537537
{
538538
/* overwrite pids, so clear the existing entries */
539-
ldestroy_cb(current_prog->usbpid, free);
539+
if(current_prog->usbpid)
540+
ldestroy_cb(current_prog->usbpid, free);
540541
current_prog->usbpid = lcreat(NULL, 0);
541542
}
542543
{
543-
int *ip = malloc(sizeof(int));
544-
if (ip) {
545-
*ip = $1->value.number;
546-
ladd(current_prog->usbpid, ip);
547-
}
544+
int *ip = cfg_malloc("usb_pid_list", sizeof(int));
545+
*ip = $1->value.number;
546+
ladd(current_prog->usbpid, ip);
548547
free_token($1);
549548
}
550549
} |
551550
usb_pid_list TKN_COMMA TKN_NUMBER {
552551
{
553-
int *ip = malloc(sizeof(int));
554-
if (ip) {
555-
*ip = $3->value.number;
556-
ladd(current_prog->usbpid, ip);
557-
}
552+
int *ip = cfg_malloc("usb_pid_list", sizeof(int));
553+
*ip = $3->value.number;
554+
ladd(current_prog->usbpid, ip);
558555
free_token($3);
559556
}
560557
}
@@ -568,25 +565,22 @@ hvupdi_support_list:
568565
TKN_NUMBER {
569566
{
570567
/* overwrite list entries, so clear the existing entries */
571-
ldestroy_cb(current_prog->hvupdi_support, free);
568+
if(current_prog->hvupdi_support)
569+
ldestroy_cb(current_prog->hvupdi_support, free);
572570
current_prog->hvupdi_support = lcreat(NULL, 0);
573571
}
574572
{
575-
int *ip = malloc(sizeof(int));
576-
if (ip) {
577-
*ip = $1->value.number;
578-
ladd(current_prog->hvupdi_support, ip);
579-
}
573+
int *ip = cfg_malloc("hvupdi_support_list", sizeof(int));
574+
*ip = $1->value.number;
575+
ladd(current_prog->hvupdi_support, ip);
580576
free_token($1);
581577
}
582578
} |
583579
hvupdi_support_list TKN_COMMA TKN_NUMBER {
584580
{
585-
int *ip = malloc(sizeof(int));
586-
if (ip) {
587-
*ip = $3->value.number;
588-
ladd(current_prog->hvupdi_support, ip);
589-
}
581+
int *ip = cfg_malloc("hvupdi_support_list", sizeof(int));
582+
*ip = $3->value.number;
583+
ladd(current_prog->hvupdi_support, ip);
590584
free_token($3);
591585
}
592586
}

src/pgm.c

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -152,12 +152,18 @@ PROGRAMMER *pgm_new(void) {
152152

153153
void pgm_free(PROGRAMMER *p) {
154154
if(p) {
155-
ldestroy_cb(p->id, free);
156-
ldestroy_cb(p->usbpid, free);
157-
ldestroy_cb(p->hvupdi_support, free);
158-
p->id = NULL;
159-
p->usbpid = NULL;
160-
p->hvupdi_support = NULL;
155+
if(p->id) {
156+
ldestroy_cb(p->id, free);
157+
p->id = NULL;
158+
}
159+
if(p->usbpid) {
160+
ldestroy_cb(p->usbpid, free);
161+
p->usbpid = NULL;
162+
}
163+
if(p->hvupdi_support) {
164+
ldestroy_cb(p->hvupdi_support, free);
165+
p->hvupdi_support = NULL;
166+
}
161167
// Never free const char *, eg, p->desc, which are set by cache_string()
162168
// p->cookie is freed by pgm_teardown
163169
free(p);
@@ -168,22 +174,27 @@ PROGRAMMER *pgm_dup(const PROGRAMMER *src) {
168174
PROGRAMMER *pgm = pgm_new();
169175

170176
if(src) {
177+
ldestroy_cb(pgm->id, free);
178+
ldestroy_cb(pgm->usbpid, free);
179+
ldestroy_cb(pgm->hvupdi_support, free);
171180
memcpy(pgm, src, sizeof(*pgm));
172181
pgm->id = lcreat(NULL, 0);
173182
pgm->usbpid = lcreat(NULL, 0);
174183
pgm->hvupdi_support = lcreat(NULL, 0);
175184

176185
// Leave id list empty but copy usbpid and hvupdi_support over
177-
for(LNODEID ln = lfirst(src->hvupdi_support); ln; ln = lnext(ln)) {
178-
int *ip = cfg_malloc("pgm_dup()", sizeof(int));
179-
*ip = *(int *) ldata(ln);
180-
ladd(pgm->hvupdi_support, ip);
181-
}
182-
for(LNODEID ln = lfirst(src->usbpid); ln; ln = lnext(ln)) {
183-
int *ip = cfg_malloc("pgm_dup()", sizeof(int));
184-
*ip = *(int *) ldata(ln);
185-
ladd(pgm->usbpid, ip);
186-
}
186+
if(src->hvupdi_support)
187+
for(LNODEID ln = lfirst(src->hvupdi_support); ln; ln = lnext(ln)) {
188+
int *ip = cfg_malloc("pgm_dup()", sizeof(int));
189+
*ip = *(int *) ldata(ln);
190+
ladd(pgm->hvupdi_support, ip);
191+
}
192+
if(src->usbpid)
193+
for(LNODEID ln = lfirst(src->usbpid); ln; ln = lnext(ln)) {
194+
int *ip = cfg_malloc("pgm_dup()", sizeof(int));
195+
*ip = *(int *) ldata(ln);
196+
ladd(pgm->usbpid, ip);
197+
}
187198
}
188199

189200
return pgm;

0 commit comments

Comments
 (0)