瀏覽代碼

Follow up a7b8fd4a5d33de75ae

Fix an invalid check on skill_parse_row_requiredb() for EQUIP_REQUIRE
Fix itemdb_group_free call in itemdb_read_itemgroup_sub using real
va_list, (preventing compilation on ARM)
Add some notes.
lighta 9 年之前
父節點
當前提交
4342221a1e
共有 4 個文件被更改,包括 21 次插入16 次删除
  1. 2 0
      src/common/strlib.c
  2. 2 1
      src/map/itemdb.c
  3. 1 2
      src/map/pc.c
  4. 16 13
      src/map/skill.c

+ 2 - 0
src/common/strlib.c

@@ -1044,6 +1044,8 @@ bool sv_readdb(const char* directory, const char* filename, char delim, int minc
 		if( !parseproc(fields+1, columns, entries) )
 		{
 			ShowError("sv_readdb: Could not process contents of line %d of \"%s\".\n", lines, path);
+                        //perhaps call a provided function to clean entries if we have fail
+                        //clearproc(fields+1, columns, entries)
 			continue; // invalid row contents
 		}
 

+ 2 - 1
src/map/itemdb.c

@@ -613,7 +613,8 @@ static void itemdb_read_itemgroup_sub(const char* filename, bool silent)
 
 		// Remove from DB
 		if (strcmpi(str[1], "clear") == 0 && itemdb_group->remove(itemdb_group, db_ui2key(group_id), &data)) {
-			itemdb_group_free(db_ui2key(group_id), &data, 0);
+                        va_list ap;
+			itemdb_group_free(db_ui2key(group_id), &data, ap);
 			ShowNotice("Item Group '%s' has been cleared.\n", str[0]);
 			continue;
 		}

+ 1 - 2
src/map/pc.c

@@ -1963,8 +1963,7 @@ int pc_disguise(struct map_session_data *sd, int class_)
 		}
 		if (sd->chatID) {
 			struct chat_data* cd;
-
-			if (cd = (struct chat_data*)map_id2bl(sd->chatID))
+			if ((cd = (struct chat_data*)map_id2bl(sd->chatID)) != NULL)
 				clif_dispchat(cd,0);
 		}
 	}

+ 16 - 13
src/map/skill.c

@@ -20276,22 +20276,24 @@ static bool skill_parse_row_requiredb(char* split[], int columns, int current)
 	trim(split[11]);
 	if (split[11][0] != '\0' || atoi(split[11])) {
 		int require[MAX_SKILL_STATUS_REQUIRE];
-
 		if ((skill_db[idx]->require.status_count = skill_split_atoi2(split[11], require, ":", SC_STONE, ARRAYLENGTH(require)))) {
 			CREATE(skill_db[idx]->require.status, enum sc_type, skill_db[idx]->require.status_count);
-			for (i = 0; i < skill_db[idx]->require.status_count; i++)
+			for (i = 0; i < skill_db[idx]->require.status_count; i++){
+                                //todo add a check if possible here
 				skill_db[idx]->require.status[i] = (sc_type)require[i];
+                        }
 		}
 	}
 
 	skill_split_atoi(split[12],skill_db[idx]->require.spiritball);
 
 	for( i = 0; i < MAX_SKILL_ITEM_REQUIRE; i++ ) {
-		if (atoi(split[13 + 2 * i]) > 0 && !itemdb_exists(atoi(split[13 + 2 * i]))) {
-			ShowError("skill_parse_row_requiredb: Invalid item %d for skill %d.\n", atoi(split[13 + 2 * i]), atoi(split[0]));
+                int32 itemid = atoi(split[13 + 2 * i]);
+		if (itemid > 0 && !itemdb_exists(itemid) ) {
+			ShowError("skill_parse_row_requiredb: Invalid item (in ITEM_REQUIRE list) %d for skill %d.\n", itemid, atoi(split[0]));
 			return false;
 		}
-		skill_db[idx]->require.itemid[i] = atoi(split[13+ 2*i]);
+		skill_db[idx]->require.itemid[i] = itemid;
 		skill_db[idx]->require.amount[i] = atoi(split[14+ 2*i]);
 	}
 
@@ -20299,16 +20301,17 @@ static bool skill_parse_row_requiredb(char* split[], int columns, int current)
 	trim(split[33]);
 	if (split[33][0] != '\0' || atoi(split[33])) {
 		int require[MAX_SKILL_EQUIP_REQUIRE];
-
 		if ((skill_db[idx]->require.eqItem_count = skill_split_atoi2(split[33], require, ":", 500, ARRAYLENGTH(require)))) {
-			if (require[i] > 0 && !itemdb_exists(require[i])) {
-				ShowError("skill_parse_row_requiredb: Invalid item %d for skill %d.\n", require[i], atoi(split[0]));
-				return false;
-			}
-
 			CREATE(skill_db[idx]->require.eqItem, uint16, skill_db[idx]->require.eqItem_count);
-			for (i = 0; i < skill_db[idx]->require.eqItem_count; i++)
-				skill_db[idx]->require.eqItem[i] = require[i];
+			for (i = 0; i < skill_db[idx]->require.eqItem_count; i++){
+                            if (require[i] > 0 && !itemdb_exists(require[i])) {
+				ShowError("skill_parse_row_requiredb: Invalid item (in EQUIP_REQUIRE list)  %d for skill %d.\n", require[i], atoi(split[0]));
+                                aFree(skill_db[idx]->require.eqItem); //don't need to retain this
+                                skill_db[idx]->require.eqItem_count = 0;
+				return false;
+                            }
+                            skill_db[idx]->require.eqItem[i] = require[i];
+                        }
 		}
 	}
 	return true;