Opublikowano 20 Sierpnia 20232 l Cześć wszystkim,😊 Podczas przeglądania kodu znalazłem problem w funkcji 'do_shutdown'. W oryginalnym kodzie nie było sprawdzania, czy wskaźnik postaci (ch) jest nullem, a jednak próbował korzystać z metod związanych z postacią, co mogło prowadzić do niezdefiniowanego zachowania. Co więcej, funkcja nie sprawdzała, czy dana postać posiada uprawnienia GM przed próbą wyłączenia serwera, co stanowiło potencjalne ryzyko związane z bezpieczeństwem. 🧩 Rozwiązanie: 📂 Lokalizacja pliku: 'game -> cmd_general.cpp' 🔍 Szukamy funkcji: Tylko zalogowani Zaloguj się, aby wyświetlić chronioną treść Ten post zawiera treści dostępne tylko dla członków. Zaloguj się lub utwórz konto, aby odblokować całą zawartość tego posta. Zaloguj się Utwórz konto 🔄 Zmieniamy na poprawioną wersję: W powyższej wersji dokonałem następujących zmian: Zabezpieczyłem kod przed niebezpiecznym dostępem do metody GetName(), jeśli wskaźnik ch jest nullem. Dodałem kontrolę uprawnień GM, aby upewnić się, że tylko postacie z odpowiednimi uprawnieniami mają możliwość wywołania tej funkcji.
Opublikowano 13 Stycznia13 Sty Sorry za odkopanie, ale nie ma tego nigdzie a mega irytujeC++Kod został skopiowanyw void Shutdown(int iSec) pod SendNotice(buf); dodajesz; if (g_shutdownEvent){ event_cancel(&g_shutdownEvent); g_shutdownEvent = nullptr;} event_create(shutdown_event, info, 1); zmieniasz na g_shutdownEvent = event_create(shutdown_event, info, 1); ---nizej masz TPacketGGShutdown p; dodajesz nad tym // Funkcja od anulowania odliczania if (g_shutdownEvent) { event_cancel(&g_shutdownEvent); g_shutdownEvent = nullptr; g_bNoMoreClient = false; // cofamy blokadę nowych klientów, jeśli była ustawiona SendNotice(LC_TEXT("Shutdown anulowany.")); sys_log(0, "Shutdown anulowan przez %s", ch->GetName()); return; }no i wsio a to sprawdza po prostu czy jest odliczanie jak jest nie nakłada tego jak wcześniej, następna anuluje funkcje.A i macie LPEVENT g_shutdownEvent = nullptr; jak ktoś tego w ogóle używa xd
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto