Просмотр исходного кода

Fixes a crash caused by invalid skill ID (#4935)

* Fixes #4934.
* Fixes a potential crash when using atcommand useskill.
Thanks to @Stingor and @CairoLee!
CairoLee 5 лет назад
Родитель
Сommit
bf4b41bd66
2 измененных файлов с 14 добавлено и 0 удалено
  1. 8 0
      src/map/atcommand.cpp
  2. 6 0
      src/map/unit.cpp

+ 8 - 0
src/map/atcommand.cpp

@@ -5835,6 +5835,14 @@ ACMD_FUNC(useskill)
 		return -1;
 	}
 
+	if (!skill_id || !skill_db.find(skill_id)) {
+		clif_displaymessage(fd, msg_txt(sd, 198)); // This skill number doesn't exist.
+		return -1;
+	}
+
+	if (!skill_lv)
+		skill_lv = 1;
+
 	if(!strcmp(atcmd_player_name,"self"))
 		pl_sd = sd; //quick keyword
 	else if ( (pl_sd = map_nick2sd(atcmd_player_name,true)) == NULL ){

+ 6 - 0
src/map/unit.cpp

@@ -1558,6 +1558,9 @@ int unit_skilluse_id2(struct block_list *src, int target_id, uint16 skill_id, ui
 	int inf = skill_get_inf(skill_id);
 	std::shared_ptr<s_skill_db> skill = skill_db.find(skill_id);
 
+	if (!skill)
+		return 0;
+
 	// temp: used to signal combo-skills right now.
 	if (sc && sc->data[SC_COMBO] &&
 		skill_is_combo(skill_id) &&
@@ -2035,6 +2038,9 @@ int unit_skilluse_pos2( struct block_list *src, short skill_x, short skill_y, ui
 	if (sc && !sc->count)
 		sc = NULL;
 
+	if (!skill_db.find(skill_id))
+		return 0;
+
 	if( sd ) {
 		if( skill_isNotOk(skill_id, sd) || !skill_check_condition_castbegin(sd, skill_id, skill_lv) )
 			return 0;