fix use after free and ststus iteration
Some checks failed
build_test / build (push) Failing after 5m28s

This commit is contained in:
PoliEcho 2025-05-30 11:06:33 +02:00
parent 7f427a47fc
commit a9e9dfc85b

View File

@ -4,6 +4,7 @@
#include <cerrno>
#include <cstddef>
#include <cstdint>
#include <cstdlib>
#include <cstring>
#include <filesystem>
#include <fstream>
@ -12,6 +13,7 @@
#include <sstream>
#include <string>
#include <vector>
#include "color.h"
#include "const.h"
#include "cups.h"
#include "editor_easy.h"
@ -82,6 +84,7 @@ void menu() {
}
items.push_back(nullptr);
main_menu.items = new ITEM*[items.size()];
main_menu.items_size = items.size() - 1;
memcpy(main_menu.items, items.data(), (items.size() * sizeof(ITEM*)));
}
@ -168,18 +171,106 @@ void menu() {
break;
}
break;
case 'm':
std::stringstream item_name_ss(item_name(current_item(main_menu.menu)));
case 'm': {
std::stringstream item_desc_ss(
item_description(current_item(main_menu.menu)));
std::string name_date[2];
for (uint8_t i = 0; i < ARRAY_SIZE(name_date); i++) {
std::getline(item_name_ss, name_date[i], ' ');
}
name_date[0] = item_name(current_item(main_menu.menu));
std::getline(item_desc_ss, name_date[1], ' ');
{
uint8_t n = 0;
size_t indexes[2];
for (size_t i = 0; (i < main_menu_allocated.size()); i++) {
if (main_menu_allocated[i].ptr ==
item_name(current_item(main_menu.menu))) {
delete[] static_cast<char*>(main_menu_allocated[i].ptr);
indexes[0] = i;
n++;
} else if (main_menu_allocated[i].ptr ==
item_description(current_item(main_menu.menu))) {
delete[] static_cast<char*>(main_menu_allocated[i].ptr);
indexes[1] = i;
n++;
}
if (n >= 2) {
break;
}
}
if (indexes[0] > indexes[1]) {
std::swap(indexes[0], indexes[1]);
}
main_menu_allocated.erase(main_menu_allocated.begin() + indexes[1]);
main_menu_allocated.erase(main_menu_allocated.begin() + indexes[0]);
}
{
std::ifstream selected_file(COMPLAINTS_DIR "/" + name_date[0] + '_' +
name_date[1]);
if (!selected_file.is_open()) {
std::clog << selected_file.rdstate() << "\n";
std::cerr << RED "[ERROR] " RESET << loc_strings->invalid_input
<< "\n"
<< "File: "
<< COMPLAINTS_DIR "/" + name_date[0] + '_' + name_date[1]
<< "\n";
exit(EINVAL);
}
json selected_file_json = json::parse(selected_file);
selected_file.close();
if (selected_file_json["status"].is_null() ||
selected_file_json["status"].get<size_t>() < STATUS_COUNT) {
(selected_file_json["status"].get<uint8_t>() + 1 >= STATUS_COUNT)
? selected_file_json["status"] = NOT_SEND
: selected_file_json["status"] =
selected_file_json["status"].get<uint8_t>() + 1;
std::ofstream selected_file(COMPLAINTS_DIR "/" + name_date[0] +
'_' + name_date[1]);
selected_file << selected_file_json;
selected_file.close();
} else {
std::cerr << RED "[ERROR] " RESET << loc_strings->invalid_input
<< "\n";
exit(EINVAL);
}
name_date[1].append(" ");
name_date[1].append(
loc_strings->status_strings[selected_file_json["status"]
.get<uint8_t>()]);
char* date_status = new char[name_date[1].length() + 1];
main_menu_allocated.push_back({GENERIC_TYPE, date_status, 1});
strlcpy(date_status, name_date[1].c_str(), name_date[1].length() + 1);
char* name = new char[name_date[0].length() + 1];
main_menu_allocated.push_back({GENERIC_TYPE, name, 1});
strlcpy(name, name_date[0].c_str(), name_date[0].length() + 1);
for (size_t i = 0; i < main_menu.items_size; i++) {
if (main_menu.items[i] == current_item(main_menu.menu)) {
free_item(main_menu.items[i]);
main_menu.items[i] = new_item(name, date_status);
break;
}
}
}
WINDOW* old_win_sub = menu_sub(main_menu.menu);
unpost_menu(main_menu.menu);
free_menu(main_menu.menu);
main_menu.menu = new_menu(main_menu.items);
set_menu_win(main_menu.menu, main_menu.win);
set_menu_sub(main_menu.menu, old_win_sub);
set_menu_format(main_menu.menu, 7, 1);
set_menu_mark(main_menu.menu, " * ");
post_menu(main_menu.menu);
break;
}
}
redrawwin(main_menu.win);
wrefresh(main_menu.win);
refresh();
redrawwin(main_menu.win);
wrefresh(main_menu.win);
}
unpost_menu(main_menu.menu);