fix use after free and ststus iteration
Some checks failed
build_test / build (push) Failing after 5m28s
Some checks failed
build_test / build (push) Failing after 5m28s
This commit is contained in:
parent
7f427a47fc
commit
a9e9dfc85b
103
src/menu.cpp
103
src/menu.cpp
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user