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

50
ds.c
View File

@@ -92,21 +92,13 @@ void
return NULL; return NULL;
} }
for (i = -1, cur = *ll; cur; i++, cur = cur->next) {
if (i + 1 == idx) {
if (idx == 0) { if (idx == 0) {
rm = cur; rm = *ll;
if (!rm) { *ll = rm->next;
return NULL;
}
*ll = cur->next;
} else { } else {
for (i = -1, cur = *ll; cur; i++, cur = cur->next) {
if (idx == i + 1) {
rm = cur->next; rm = cur->next;
if (!rm) {
return NULL;
}
cur->next = cur->next->next;
}
break; break;
} }
} }
@@ -115,6 +107,9 @@ void
return NULL; return NULL;
} }
cur->next = rm->next;
}
data = rm->data; data = rm->data;
free(rm); free(rm);
return data; return data;
@@ -132,27 +127,16 @@ void
return NULL; return NULL;
} }
for (i = -1, cur = *ll; cur; i++, cur = cur->next) {
if (i + 1 == idx) {
if (idx == 0) { if (idx == 0) {
rm = cur; rm = *ll;
if (!rm) { *ll = rm->next;
return NULL; if (rm->next) {
} rm->next->prev = NULL;
if (cur->next) {
cur->next->prev = NULL;
*ll = cur->next;
} }
} else { } else {
rm = cur->next; for (i = 0, cur = *ll; cur; i++, cur = cur->next) {
if (!rm) { if (i == idx) {
return NULL; rm = cur;
}
cur->next = cur->next->next;
if (cur->next) {
cur->next->prev = cur;
}
}
break; break;
} }
} }
@@ -161,6 +145,12 @@ void
return NULL; return NULL;
} }
rm->prev->next = rm->next;
if (rm->next) {
rm->next->prev = rm->prev;
}
}
data = rm->data; data = rm->data;
free(rm); free(rm);
return data; return data;