Harden list management in pgm.c/config_gram.y
This commit is contained in:
parent
731d581398
commit
3e49f078b3
|
@ -536,25 +536,22 @@ usb_pid_list:
|
||||||
TKN_NUMBER {
|
TKN_NUMBER {
|
||||||
{
|
{
|
||||||
/* overwrite pids, so clear the existing entries */
|
/* overwrite pids, so clear the existing entries */
|
||||||
|
if(current_prog->usbpid)
|
||||||
ldestroy_cb(current_prog->usbpid, free);
|
ldestroy_cb(current_prog->usbpid, free);
|
||||||
current_prog->usbpid = lcreat(NULL, 0);
|
current_prog->usbpid = lcreat(NULL, 0);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
int *ip = malloc(sizeof(int));
|
int *ip = cfg_malloc("usb_pid_list", sizeof(int));
|
||||||
if (ip) {
|
|
||||||
*ip = $1->value.number;
|
*ip = $1->value.number;
|
||||||
ladd(current_prog->usbpid, ip);
|
ladd(current_prog->usbpid, ip);
|
||||||
}
|
|
||||||
free_token($1);
|
free_token($1);
|
||||||
}
|
}
|
||||||
} |
|
} |
|
||||||
usb_pid_list TKN_COMMA TKN_NUMBER {
|
usb_pid_list TKN_COMMA TKN_NUMBER {
|
||||||
{
|
{
|
||||||
int *ip = malloc(sizeof(int));
|
int *ip = cfg_malloc("usb_pid_list", sizeof(int));
|
||||||
if (ip) {
|
|
||||||
*ip = $3->value.number;
|
*ip = $3->value.number;
|
||||||
ladd(current_prog->usbpid, ip);
|
ladd(current_prog->usbpid, ip);
|
||||||
}
|
|
||||||
free_token($3);
|
free_token($3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -568,25 +565,22 @@ hvupdi_support_list:
|
||||||
TKN_NUMBER {
|
TKN_NUMBER {
|
||||||
{
|
{
|
||||||
/* overwrite list entries, so clear the existing entries */
|
/* overwrite list entries, so clear the existing entries */
|
||||||
|
if(current_prog->hvupdi_support)
|
||||||
ldestroy_cb(current_prog->hvupdi_support, free);
|
ldestroy_cb(current_prog->hvupdi_support, free);
|
||||||
current_prog->hvupdi_support = lcreat(NULL, 0);
|
current_prog->hvupdi_support = lcreat(NULL, 0);
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
int *ip = malloc(sizeof(int));
|
int *ip = cfg_malloc("hvupdi_support_list", sizeof(int));
|
||||||
if (ip) {
|
|
||||||
*ip = $1->value.number;
|
*ip = $1->value.number;
|
||||||
ladd(current_prog->hvupdi_support, ip);
|
ladd(current_prog->hvupdi_support, ip);
|
||||||
}
|
|
||||||
free_token($1);
|
free_token($1);
|
||||||
}
|
}
|
||||||
} |
|
} |
|
||||||
hvupdi_support_list TKN_COMMA TKN_NUMBER {
|
hvupdi_support_list TKN_COMMA TKN_NUMBER {
|
||||||
{
|
{
|
||||||
int *ip = malloc(sizeof(int));
|
int *ip = cfg_malloc("hvupdi_support_list", sizeof(int));
|
||||||
if (ip) {
|
|
||||||
*ip = $3->value.number;
|
*ip = $3->value.number;
|
||||||
ladd(current_prog->hvupdi_support, ip);
|
ladd(current_prog->hvupdi_support, ip);
|
||||||
}
|
|
||||||
free_token($3);
|
free_token($3);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
15
src/pgm.c
15
src/pgm.c
|
@ -152,12 +152,18 @@ PROGRAMMER *pgm_new(void) {
|
||||||
|
|
||||||
void pgm_free(PROGRAMMER *p) {
|
void pgm_free(PROGRAMMER *p) {
|
||||||
if(p) {
|
if(p) {
|
||||||
|
if(p->id) {
|
||||||
ldestroy_cb(p->id, free);
|
ldestroy_cb(p->id, free);
|
||||||
ldestroy_cb(p->usbpid, free);
|
|
||||||
ldestroy_cb(p->hvupdi_support, free);
|
|
||||||
p->id = NULL;
|
p->id = NULL;
|
||||||
|
}
|
||||||
|
if(p->usbpid) {
|
||||||
|
ldestroy_cb(p->usbpid, free);
|
||||||
p->usbpid = NULL;
|
p->usbpid = NULL;
|
||||||
|
}
|
||||||
|
if(p->hvupdi_support) {
|
||||||
|
ldestroy_cb(p->hvupdi_support, free);
|
||||||
p->hvupdi_support = NULL;
|
p->hvupdi_support = NULL;
|
||||||
|
}
|
||||||
// Never free const char *, eg, p->desc, which are set by cache_string()
|
// Never free const char *, eg, p->desc, which are set by cache_string()
|
||||||
// p->cookie is freed by pgm_teardown
|
// p->cookie is freed by pgm_teardown
|
||||||
free(p);
|
free(p);
|
||||||
|
@ -168,17 +174,22 @@ PROGRAMMER *pgm_dup(const PROGRAMMER *src) {
|
||||||
PROGRAMMER *pgm = pgm_new();
|
PROGRAMMER *pgm = pgm_new();
|
||||||
|
|
||||||
if(src) {
|
if(src) {
|
||||||
|
ldestroy_cb(pgm->id, free);
|
||||||
|
ldestroy_cb(pgm->usbpid, free);
|
||||||
|
ldestroy_cb(pgm->hvupdi_support, free);
|
||||||
memcpy(pgm, src, sizeof(*pgm));
|
memcpy(pgm, src, sizeof(*pgm));
|
||||||
pgm->id = lcreat(NULL, 0);
|
pgm->id = lcreat(NULL, 0);
|
||||||
pgm->usbpid = lcreat(NULL, 0);
|
pgm->usbpid = lcreat(NULL, 0);
|
||||||
pgm->hvupdi_support = lcreat(NULL, 0);
|
pgm->hvupdi_support = lcreat(NULL, 0);
|
||||||
|
|
||||||
// Leave id list empty but copy usbpid and hvupdi_support over
|
// Leave id list empty but copy usbpid and hvupdi_support over
|
||||||
|
if(src->hvupdi_support)
|
||||||
for(LNODEID ln = lfirst(src->hvupdi_support); ln; ln = lnext(ln)) {
|
for(LNODEID ln = lfirst(src->hvupdi_support); ln; ln = lnext(ln)) {
|
||||||
int *ip = cfg_malloc("pgm_dup()", sizeof(int));
|
int *ip = cfg_malloc("pgm_dup()", sizeof(int));
|
||||||
*ip = *(int *) ldata(ln);
|
*ip = *(int *) ldata(ln);
|
||||||
ladd(pgm->hvupdi_support, ip);
|
ladd(pgm->hvupdi_support, ip);
|
||||||
}
|
}
|
||||||
|
if(src->usbpid)
|
||||||
for(LNODEID ln = lfirst(src->usbpid); ln; ln = lnext(ln)) {
|
for(LNODEID ln = lfirst(src->usbpid); ln; ln = lnext(ln)) {
|
||||||
int *ip = cfg_malloc("pgm_dup()", sizeof(int));
|
int *ip = cfg_malloc("pgm_dup()", sizeof(int));
|
||||||
*ip = *(int *) ldata(ln);
|
*ip = *(int *) ldata(ln);
|
||||||
|
|
Loading…
Reference in New Issue