summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-Trunk.txt3
-rw-r--r--src/map/itemdb.c50
-rw-r--r--src/map/map.c2
-rw-r--r--src/map/script.c40
-rw-r--r--src/map/script.h3
5 files changed, 50 insertions, 48 deletions
diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index cab099369..977bd8f47 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -4,6 +4,9 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK. ALL UNTESTED BUGFIXES/FEATURES GO
IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
2007/10/10
+ * Fixed itemdb_read_sqldb blowing up the server with segmentation faults.
+ * Added an option for parse_script to ignore the checks for the set of
+ brackets around the script. [FlavioJS]
* Removed 'into_abyss' effect on traps; tests show that it works ONLY
for Gemstones (tho' iRO website claims otherwise) - bugreport:171
- corrected code that was exploiting the flag as an 'expired' trap flag
diff --git a/src/map/itemdb.c b/src/map/itemdb.c
index e110bf488..70a056292 100644
--- a/src/map/itemdb.c
+++ b/src/map/itemdb.c
@@ -696,7 +696,7 @@ static int itemdb_gendercheck(struct item_data *id)
/*==========================================
* processes one itemdb entry
*------------------------------------------*/
-static bool itemdb_parse_dbrow(const char** str, const char* source, int line)
+static bool itemdb_parse_dbrow(char** str, const char* source, int line, int scriptopt)
{
/*
+----+--------------+---------------+------+-----------+------------+--------+--------+---------+-------+-------+------------+-------------+---------------+-----------------+--------------+-------------+------------+------+--------+--------------+----------------+
@@ -785,11 +785,11 @@ static bool itemdb_parse_dbrow(const char** str, const char* source, int line)
}
if (*str[19])
- id->script = parse_script(str[19], source, line, 0);
+ id->script = parse_script(str[19], source, line, scriptopt);
if (*str[20])
- id->equip_script = parse_script(str[20], source, line, 0);
+ id->equip_script = parse_script(str[20], source, line, scriptopt);
if (*str[21])
- id->unequip_script = parse_script(str[21], source, line, 0);
+ id->unequip_script = parse_script(str[21], source, line, scriptopt);
return true;
}
@@ -891,7 +891,7 @@ static int itemdb_readdb(void)
str[21] = p;
- if (!itemdb_parse_dbrow(str, path, lines))
+ if (!itemdb_parse_dbrow(str, path, lines, 0))
continue;
count++;
@@ -917,49 +917,31 @@ static int itemdb_read_sqldb(void)
for( fi = 0; fi < ARRAYLENGTH(item_db_name); ++fi )
{
uint32 lines = 0, count = 0;
-
+
// retrieve all rows from the item database
if( SQL_ERROR == Sql_Query(mmysql_handle, "SELECT * FROM `%s`", item_db_name[fi]) )
{
Sql_ShowDebug(mmysql_handle);
continue;
}
-
+
// process rows one by one
while( SQL_SUCCESS == Sql_NextRow(mmysql_handle) )
- {
- // wrap the result into a TXT-compatible format
- char line[1024];
+ {// wrap the result into a TXT-compatible format
char* str[22];
- char* p;
int i;
-
- lines++;
- for (i = 0, p = line; i < 22; i++)
- {
- char* data;
- size_t len;
- Sql_GetData(mmysql_handle, i, &data, &len);
-
- if (data == NULL)
- p[0] = '\0';
- else if (i >= 19 && data[0] != '{') {
- sprintf(p, "{ %s }", data); len+= 4;
- } else
- strcpy(p, data);
- str[i] = p;
- p+= len + 1;
- }
-
- if (!itemdb_parse_dbrow(str, item_db_name[fi], lines))
+ ++lines;
+ for( i = 0; i < 22; ++i )
+ Sql_GetData(mmysql_handle, i, &str[i], NULL);
+
+ if (!itemdb_parse_dbrow(str, item_db_name[fi], lines, 0))
continue;
-
- count++;
+ ++count;
}
-
+
// free the query result
Sql_FreeResult(mmysql_handle);
-
+
ShowStatus("Done reading '"CL_WHITE"%lu"CL_RESET"' entries in '"CL_WHITE"%s"CL_RESET"'.\n", count, item_db_name[fi]);
}
diff --git a/src/map/map.c b/src/map/map.c
index b18b93753..1c2cd193e 100644
--- a/src/map/map.c
+++ b/src/map/map.c
@@ -2607,7 +2607,7 @@ int map_readgat (struct map_data* m)
int map_readallmaps (void)
{
int i;
- FILE* fp;
+ FILE* fp=NULL;
int maps_removed = 0;
if( enable_grf )
diff --git a/src/map/script.c b/src/map/script.c
index d229b95ef..1fa0f3150 100644
--- a/src/map/script.c
+++ b/src/map/script.c
@@ -1898,6 +1898,9 @@ struct script_code* parse_script(const char *src,const char *file,int line,int o
struct script_code *code;
static int first=1;
+ if( src == NULL )
+ return NULL;// empty script
+
memset(&syntax,0,sizeof(syntax));
if(first){
add_buildin_func();
@@ -1948,21 +1951,34 @@ struct script_code* parse_script(const char *src,const char *file,int line,int o
parse_syntax_for_flag=0;
p=src;
p=skip_space(p);
- if(*p!='{'){
- disp_error_message("not found '{'",p);
+ if( options&SCRIPT_IGNORE_EXTERNAL_BRACKETS )
+ {// does not require brackets around the script
+ if( *p == '\0' )
+ {// empty script
+ aFree( script_buf );
+ script_pos = 0;
+ script_size = 0;
+ script_buf = NULL;
+ return NULL;
+ }
}
- p++;
- p = skip_space(p);
- if (p && *p == '}') {
- // an empty function, just return
- aFree( script_buf );
- script_pos = 0;
- script_size = 0;
- script_buf = NULL;
- return NULL;
+ else
+ {// requires brackets around the script
+ if( *p != '{' )
+ disp_error_message("not found '{'",p);
+ p = skip_space(++p);
+ if( *p == '}' )
+ {// empty script
+ aFree( script_buf );
+ script_pos = 0;
+ script_size = 0;
+ script_buf = NULL;
+ return NULL;
+ }
}
- while (p && *p && (*p!='}' || syntax.curly_count != 0)) {
+ while (*p && (*p != '}' || syntax.curly_count != 0) )
+ {
p=skip_space(p);
// labelだけ特殊処理
tmpp=skip_space(skip_word(p));
diff --git a/src/map/script.h b/src/map/script.h
index 2260724a5..9783eeb3b 100644
--- a/src/map/script.h
+++ b/src/map/script.h
@@ -62,7 +62,8 @@ struct script_state {
};
enum script_parse_options {
- SCRIPT_USE_LABEL_DB = 0x1
+ SCRIPT_USE_LABEL_DB = 0x1,// records labels in scriptlabel_db
+ SCRIPT_IGNORE_EXTERNAL_BRACKETS = 0x2// ignores the check for {} brackets around the script
};
struct script_code* parse_script(const char* src,const char* file,int line,int options);