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 <cerrno>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
#include <cstdlib>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
@ -12,6 +13,7 @@
|
|||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include "color.h"
|
||||||
#include "const.h"
|
#include "const.h"
|
||||||
#include "cups.h"
|
#include "cups.h"
|
||||||
#include "editor_easy.h"
|
#include "editor_easy.h"
|
||||||
@ -82,6 +84,7 @@ void menu() {
|
|||||||
}
|
}
|
||||||
items.push_back(nullptr);
|
items.push_back(nullptr);
|
||||||
main_menu.items = new ITEM*[items.size()];
|
main_menu.items = new ITEM*[items.size()];
|
||||||
|
main_menu.items_size = items.size() - 1;
|
||||||
memcpy(main_menu.items, items.data(), (items.size() * sizeof(ITEM*)));
|
memcpy(main_menu.items, items.data(), (items.size() * sizeof(ITEM*)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -168,18 +171,106 @@ void menu() {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'm':
|
case 'm': {
|
||||||
std::stringstream item_name_ss(item_name(current_item(main_menu.menu)));
|
std::stringstream item_desc_ss(
|
||||||
|
item_description(current_item(main_menu.menu)));
|
||||||
std::string name_date[2];
|
std::string name_date[2];
|
||||||
for (uint8_t i = 0; i < ARRAY_SIZE(name_date); i++) {
|
name_date[0] = item_name(current_item(main_menu.menu));
|
||||||
std::getline(item_name_ss, name_date[i], ' ');
|
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;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
redrawwin(main_menu.win);
|
|
||||||
wrefresh(main_menu.win);
|
wrefresh(main_menu.win);
|
||||||
refresh();
|
refresh();
|
||||||
|
redrawwin(main_menu.win);
|
||||||
|
wrefresh(main_menu.win);
|
||||||
}
|
}
|
||||||
|
|
||||||
unpost_menu(main_menu.menu);
|
unpost_menu(main_menu.menu);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user