fix(ll): prevent use after free when removing items from any type of ll

This commit is contained in:
2025-09-07 00:29:05 -04:00
parent 6d04487bc7
commit 5e4ae41113

74
ds.c
View File

@@ -92,27 +92,22 @@ void
return NULL;
}
for (i = -1, cur = *ll; cur; i++, cur = cur->next) {
if (i + 1 == idx) {
if (idx == 0) {
rm = cur;
if (!rm) {
return NULL;
}
*ll = cur->next;
} else {
if (idx == 0) {
rm = *ll;
*ll = rm->next;
} else {
for (i = -1, cur = *ll; cur; i++, cur = cur->next) {
if (idx == i + 1) {
rm = cur->next;
if (!rm) {
return NULL;
}
cur->next = cur->next->next;
break;
}
break;
}
}
if (!rm) {
return NULL;
if (!rm) {
return NULL;
}
cur->next = rm->next;
}
data = rm->data;
@@ -132,33 +127,28 @@ void
return NULL;
}
for (i = -1, cur = *ll; cur; i++, cur = cur->next) {
if (i + 1 == idx) {
if (idx == 0) {
rm = cur;
if (!rm) {
return NULL;
}
if (cur->next) {
cur->next->prev = NULL;
*ll = cur->next;
}
} else {
rm = cur->next;
if (!rm) {
return NULL;
}
cur->next = cur->next->next;
if (cur->next) {
cur->next->prev = cur;
}
}
break;
if (idx == 0) {
rm = *ll;
*ll = rm->next;
if (rm->next) {
rm->next->prev = NULL;
}
} else {
for (i = 0, cur = *ll; cur; i++, cur = cur->next) {
if (i == idx) {
rm = cur;
break;
}
}
}
if (!rm) {
return NULL;
if (!rm) {
return NULL;
}
rm->prev->next = rm->next;
if (rm->next) {
rm->next->prev = rm->prev;
}
}
data = rm->data;