Type enforcement

Change the type of
father_id,mother_id,child_id
mail.zeny,mail.send_id,mail.dest_id
from int to uint32, as this is their DB representation anyway and most
of those are mapped to char_id which is uint32.
This should remove the need of implicite cast and improve security
overall.
This commit is contained in:
lighta
2015-10-29 23:43:48 -04:00
parent ae98019014
commit 05aa1ffc8c
9 changed files with 41 additions and 43 deletions

View File

@@ -373,7 +373,7 @@ int char_mmo_char_tosql(uint32 char_id, struct mmo_charstatus* p){
{
if( SQL_ERROR == Sql_Query(sql_handle, "UPDATE `%s` SET `class`='%d',"
"`hair`='%d',`hair_color`='%d',`clothes_color`='%d',"
"`partner_id`='%d', `father`='%d', `mother`='%d', `child`='%d',"
"`partner_id`='%u', `father`='%u', `mother`='%u', `child`='%u',"
"`karma`='%d',`manner`='%d', `fame`='%d'"
" WHERE `account_id`='%d' AND `char_id` = '%d'",
schema_config.char_db, p->class_,
@@ -1080,10 +1080,10 @@ int char_mmo_char_fromsql(uint32 char_id, struct mmo_charstatus* p, bool load_ev
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 41, SQLDT_STRING, &save_map, sizeof(save_map), NULL, NULL)
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 42, SQLDT_SHORT, &p->save_point.x, 0, NULL, NULL)
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 43, SQLDT_SHORT, &p->save_point.y, 0, NULL, NULL)
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 44, SQLDT_INT, &p->partner_id, 0, NULL, NULL)
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 45, SQLDT_INT, &p->father, 0, NULL, NULL)
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 46, SQLDT_INT, &p->mother, 0, NULL, NULL)
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 47, SQLDT_INT, &p->child, 0, NULL, NULL)
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 44, SQLDT_UINT32, &p->partner_id, 0, NULL, NULL)
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 45, SQLDT_UINT32, &p->father, 0, NULL, NULL)
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 46, SQLDT_UINT32, &p->mother, 0, NULL, NULL)
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 47, SQLDT_UINT32, &p->child, 0, NULL, NULL)
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 48, SQLDT_INT, &p->fame, 0, NULL, NULL)
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 49, SQLDT_SHORT, &p->rename, 0, NULL, NULL)
|| SQL_ERROR == SqlStmt_BindColumn(stmt, 50, SQLDT_UINT32, &p->delete_date, 0, NULL, NULL)

View File

@@ -45,14 +45,14 @@ static int mail_fromsql(uint32 char_id, struct mail_data* md)
msg = &md->msg[i];
Sql_GetData(sql_handle, 0, &data, NULL); msg->id = atoi(data);
Sql_GetData(sql_handle, 1, &data, NULL); safestrncpy(msg->send_name, data, NAME_LENGTH);
Sql_GetData(sql_handle, 2, &data, NULL); msg->send_id = atoi(data);
Sql_GetData(sql_handle, 2, &data, NULL); msg->send_id = strtoul(data, NULL, 10);
Sql_GetData(sql_handle, 3, &data, NULL); safestrncpy(msg->dest_name, data, NAME_LENGTH);
Sql_GetData(sql_handle, 4, &data, NULL); msg->dest_id = atoi(data);
Sql_GetData(sql_handle, 4, &data, NULL); msg->dest_id = strtoul(data, NULL, 10);
Sql_GetData(sql_handle, 5, &data, NULL); safestrncpy(msg->title, data, MAIL_TITLE_LENGTH);
Sql_GetData(sql_handle, 6, &data, NULL); safestrncpy(msg->body, data, MAIL_BODY_LENGTH);
Sql_GetData(sql_handle, 7, &data, NULL); msg->timestamp = atoi(data);
Sql_GetData(sql_handle, 7, &data, NULL); msg->timestamp = atoi(data); //strtoull ?
Sql_GetData(sql_handle, 8, &data, NULL); msg->status = (mail_status)atoi(data);
Sql_GetData(sql_handle, 9, &data, NULL); msg->zeny = atoi(data);
Sql_GetData(sql_handle, 9, &data, NULL); msg->zeny = strtoul(data, NULL, 10);
item = &msg->item;
Sql_GetData(sql_handle,10, &data, NULL); item->amount = (short)atoi(data);
Sql_GetData(sql_handle,11, &data, NULL); item->nameid = atoi(data);

View File

@@ -374,9 +374,9 @@ struct mmo_charstatus {
uint32 char_id;
uint32 account_id;
uint32 partner_id;
int father;
int mother;
int child;
uint32 father;
uint32 mother;
uint32 child;
unsigned int base_exp,job_exp;
int zeny;
@@ -444,17 +444,17 @@ typedef enum mail_status {
struct mail_message {
int id;
int send_id;
char send_name[NAME_LENGTH];
int dest_id;
char dest_name[NAME_LENGTH];
uint32 send_id; //hold char_id of sender
char send_name[NAME_LENGTH]; //sender nickname
uint32 dest_id; //hold char_id of receiver
char dest_name[NAME_LENGTH]; //receiver nickname
char title[MAIL_TITLE_LENGTH];
char body[MAIL_BODY_LENGTH];
mail_status status;
time_t timestamp; // marks when the message was sent
int zeny;
uint32 zeny;
struct item item;
};

View File

@@ -9582,7 +9582,7 @@ ACMD_FUNC(cloneequip) {
nullpo_retr(-1, sd);
memset(atcmd_output, '\0', sizeof(atcmd_output));
if( !message || !*message || (sscanf(message, "%d", &char_id) < 1 && sscanf(message, "\"%23[^\"]\"", atcmd_output) < 1) ) {
if( !message || !*message || (sscanf(message, "%u", &char_id) < 1 && sscanf(message, "\"%23[^\"]\"", atcmd_output) < 1) ) {
clif_displaymessage(fd, msg_txt(sd, 735)); // Please enter char_id or \"char name\".
return -1;
}
@@ -9658,7 +9658,7 @@ ACMD_FUNC(clonestat) {
nullpo_retr(-1, sd);
memset(atcmd_output, '\0', sizeof(atcmd_output));
if( !message || !*message || (sscanf(message, "%d", &char_id) < 1 && sscanf(message, "\"%23[^\"]\"", atcmd_output) < 1) ) {
if( !message || !*message || (sscanf(message, "%u", &char_id) < 1 && sscanf(message, "\"%23[^\"]\"", atcmd_output) < 1) ) {
clif_displaymessage(fd, msg_txt(sd, 735)); // Please enter char_id or \"char name\".
return -1;
}

View File

@@ -1049,7 +1049,7 @@ int chrif_divorceack(uint32 char_id, int partner_id) {
/*==========================================
* Removes Baby from parents
*------------------------------------------*/
int chrif_deadopt(int father_id, int mother_id, int child_id) {
int chrif_deadopt(uint32 father_id, uint32 mother_id, uint32 child_id) {
struct map_session_data* sd;
uint16 idx = skill_get_index(WE_CALLBABY);

View File

@@ -11573,7 +11573,7 @@ static void clif_parse_UseSkillToPos_mercenary(struct mercenary_data *md, struct
void clif_parse_UseSkillToId(int fd, struct map_session_data *sd)
{
uint16 skill_id, skill_lv;
int tmp, target_id;
int inf,target_id;
unsigned int tick = gettick();
struct s_packet_db* info = &packet_db[sd->packet_ver][RFIFOW(fd,0)];
@@ -11583,8 +11583,8 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd)
if( skill_lv < 1 ) skill_lv = 1; //No clue, I have seen the client do this with guild skills :/ [Skotlex]
tmp = skill_get_inf(skill_id);
if (tmp&INF_GROUND_SKILL || !tmp)
inf = skill_get_inf(skill_id);
if (inf&INF_GROUND_SKILL || !inf)
return; //Using a ground/passive skill on a target? WRONG.
if( SKILL_CHK_HOMUN(skill_id) ) {
@@ -11606,14 +11606,14 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd)
clif_msg(sd, USAGE_FAIL); // TODO look for the client date that has this message.
return;
#else
if( !sd->npc_item_flag || !(tmp&INF_SELF_SKILL) )
if( !sd->npc_item_flag || !(inf&INF_SELF_SKILL) )
return;
#endif
}
if( (pc_cant_act2(sd) || sd->chatID) && skill_id != RK_REFRESH && !(skill_id == SR_GENTLETOUCH_CURE &&
(sd->sc.opt1 == OPT1_STONE || sd->sc.opt1 == OPT1_FREEZE || sd->sc.opt1 == OPT1_STUN)) &&
sd->state.storage_flag && !(tmp&INF_SELF_SKILL) ) //SELF skills can be used with the storage open, issue: 8027
sd->state.storage_flag && !(inf&INF_SELF_SKILL) ) //SELF skills can be used with the storage open, issue: 8027
return;
if( pc_issit(sd) )
@@ -11622,7 +11622,7 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd)
if( skill_isNotOk(skill_id, sd) )
return;
if( sd->bl.id != target_id && tmp&INF_SELF_SKILL )
if( sd->bl.id != target_id && inf&INF_SELF_SKILL )
target_id = sd->bl.id; // never trust the client
if( target_id < 0 && -target_id == sd->bl.id ) // for disguises [Valaris]
@@ -11650,15 +11650,15 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd)
} else if( sd->menuskill_id != SA_AUTOSPELL )
return; //Can't use skills while a menu is open.
}
if( sd->skillitem == skill_id ) {
if( skill_lv != sd->skillitemlv )
skill_lv = sd->skillitemlv;
if( !(tmp&INF_SELF_SKILL) )
if( !(inf&INF_SELF_SKILL) )
pc_delinvincibletimer(sd); // Target skills thru items cancel invincibility. [Inkfish]
unit_skilluse_id(&sd->bl, target_id, skill_id, skill_lv);
return;
}
sd->skillitem = sd->skillitemlv = 0;
if( SKILL_CHK_GUILD(skill_id) ) {
@@ -11667,9 +11667,7 @@ void clif_parse_UseSkillToId(int fd, struct map_session_data *sd)
else
skill_lv = 0;
} else {
tmp = pc_checkskill(sd, skill_id);
if( skill_lv > tmp )
skill_lv = tmp;
skill_lv = min(pc_checkskill(sd, skill_id),skill_lv); //never trust client
}
pc_delinvincibletimer(sd);
@@ -14511,11 +14509,11 @@ void clif_Mail_setattachment(int fd, int index, uint8 flag)
/// 0 = success
/// 1 = failure
/// 2 = too many items
void clif_Mail_getattachment(int fd, uint8 flag)
void clif_Mail_getattachment(int fd, uint8 result)
{
WFIFOHEAD(fd,packet_len(0x245));
WFIFOW(fd,0) = 0x245;
WFIFOB(fd,2) = flag;
WFIFOB(fd,2) = result;
WFIFOSET(fd,packet_len(0x245));
}
@@ -14748,7 +14746,7 @@ void clif_parse_Mail_getattach(int fd, struct map_session_data *sd)
return;
if( sd->mail.inbox.msg[i].zeny + sd->status.zeny > MAX_ZENY ) {
clif_Mail_getattachment(fd, 1);
clif_Mail_getattachment(fd, 1); //too many zeny
return;
}

View File

@@ -56,13 +56,13 @@ int mail_removezeny(struct map_session_data *sd, short flag)
}
/**
* Attempt to set item or zeny
* @param sd
* Attempt to set item or zeny to a mail
* @param sd : player attaching the content
* @param idx 0 - Zeny; >= 2 - Inventory item
* @param amount
* @param amount : amout of zeny or number of item
* @return True if item/zeny can be set, False if failed
*/
bool mail_setitem(struct map_session_data *sd, short idx, int amount) {
bool mail_setitem(struct map_session_data *sd, short idx, uint32 amount) {
if( pc_istrading(sd) )
return false;

View File

@@ -9,7 +9,7 @@
void mail_clear(struct map_session_data *sd);
int mail_removeitem(struct map_session_data *sd, short flag);
int mail_removezeny(struct map_session_data *sd, short flag);
bool mail_setitem(struct map_session_data *sd, short idx, int amount);
bool mail_setitem(struct map_session_data *sd, short idx, uint32 amount);
bool mail_setattachment(struct map_session_data *sd, struct mail_message *msg);
void mail_getattachment(struct map_session_data* sd, int zeny, struct item* item);
int mail_openmail(struct map_session_data *sd);

View File

@@ -1677,7 +1677,7 @@ void map_addiddb(struct block_list *bl)
{
TBL_PC* sd = (TBL_PC*)bl;
idb_put(pc_db,sd->bl.id,sd);
idb_put(charid_db,sd->status.char_id,sd);
uidb_put(charid_db,sd->status.char_id,sd);
}
else if( bl->type == BL_MOB )
{
@@ -1705,7 +1705,7 @@ void map_deliddb(struct block_list *bl)
{
TBL_PC* sd = (TBL_PC*)bl;
idb_remove(pc_db,sd->bl.id);
idb_remove(charid_db,sd->status.char_id);
uidb_remove(charid_db,sd->status.char_id);
}
else if( bl->type == BL_MOB )
{
@@ -1932,7 +1932,7 @@ const char* map_charid2nick(int charid)
/// Returns the struct map_session_data of the charid or NULL if the char is not online.
struct map_session_data* map_charid2sd(int charid)
{
return (struct map_session_data*)idb_get(charid_db, charid);
return (struct map_session_data*)uidb_get(charid_db, charid);
}
/*==========================================
@@ -4383,7 +4383,7 @@ int do_init(int argc, char *argv[])
bossid_db = idb_alloc(DB_OPT_BASE); // Used for Convex Mirror quick MVP search
map_db = uidb_alloc(DB_OPT_BASE);
nick_db = idb_alloc(DB_OPT_BASE);
charid_db = idb_alloc(DB_OPT_BASE);
charid_db = uidb_alloc(DB_OPT_BASE);
regen_db = idb_alloc(DB_OPT_BASE); // efficient status_natural_heal processing
iwall_db = strdb_alloc(DB_OPT_RELEASE_DATA,2*NAME_LENGTH+2+1); // [Zephyrus] Invisible Walls