Gaussiandra / Safe-stack

Stack with memory protection

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Double free при заполнении и полном освобождении стека и последующем вызове деструктора

kirilliliych opened this issue · comments

int main() {
    stack_t stack1;
    stackCtor(stack1);

    for (stackElementType i = 0; i < 10; ++i) {
        stackPush(&stack1, i);
    }

    stackElementType value;

    for (stackElementType i = 0; i < 10; ++i) {
        stackPop(&stack1, &value);
        printf("%lld\n", value);
    }

    stackDtor(&stack1);
    return 0; 
}

Следующий код приводит к тому, что если заполнить и полностью освободить стек, то в stackChangeCapacity newCapacity = (size_t) fmax((double) stack->capacity * SHRINK_COEF, 0); станет 0, дальше в recalloc newPtr = (stackCanaryType *) recalloc(stack->data, getStackArraySize(newCapacity), 1); в режиме DEBUG_LEVEL_DISABLE передастся 0, в recalloc void* newPtr = realloc(ptr, sizeToAllocate); освободит память, а дальше это попытается сделать деструктор и не обнаружит, что она уже была освобождена. Таким образом, возникает double free.

Исправлено 355db4c, спасибо.