fix(ll): prevent use after free when removing items from any type of ll
This commit is contained in:
parent
6d04487bc7
commit
5e4ae41113
1 changed files with 32 additions and 42 deletions
74
ds.c
74
ds.c
|
|
@ -92,27 +92,22 @@ void
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = -1, cur = *ll; cur; i++, cur = cur->next) {
|
if (idx == 0) {
|
||||||
if (i + 1 == idx) {
|
rm = *ll;
|
||||||
if (idx == 0) {
|
*ll = rm->next;
|
||||||
rm = cur;
|
} else {
|
||||||
if (!rm) {
|
for (i = -1, cur = *ll; cur; i++, cur = cur->next) {
|
||||||
return NULL;
|
if (idx == i + 1) {
|
||||||
}
|
|
||||||
*ll = cur->next;
|
|
||||||
} else {
|
|
||||||
rm = cur->next;
|
rm = cur->next;
|
||||||
if (!rm) {
|
break;
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
cur->next = cur->next->next;
|
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (!rm) {
|
if (!rm) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
cur->next = rm->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
data = rm->data;
|
data = rm->data;
|
||||||
|
|
@ -132,33 +127,28 @@ void
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = -1, cur = *ll; cur; i++, cur = cur->next) {
|
if (idx == 0) {
|
||||||
if (i + 1 == idx) {
|
rm = *ll;
|
||||||
if (idx == 0) {
|
*ll = rm->next;
|
||||||
rm = cur;
|
if (rm->next) {
|
||||||
if (!rm) {
|
rm->next->prev = NULL;
|
||||||
return NULL;
|
}
|
||||||
}
|
} else {
|
||||||
if (cur->next) {
|
for (i = 0, cur = *ll; cur; i++, cur = cur->next) {
|
||||||
cur->next->prev = NULL;
|
if (i == idx) {
|
||||||
*ll = cur->next;
|
rm = cur;
|
||||||
}
|
break;
|
||||||
} else {
|
}
|
||||||
rm = cur->next;
|
|
||||||
if (!rm) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
cur->next = cur->next->next;
|
|
||||||
if (cur->next) {
|
|
||||||
cur->next->prev = cur;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (!rm) {
|
if (!rm) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
rm->prev->next = rm->next;
|
||||||
|
if (rm->next) {
|
||||||
|
rm->next->prev = rm->prev;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
data = rm->data;
|
data = rm->data;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue