diff options
-rw-r--r-- | Changelog-SVN.txt | 4 | ||||
-rw-r--r-- | src/common/core.c | 91 | ||||
-rw-r--r-- | src/login/login.c | 1 | ||||
-rw-r--r-- | src/map/pet.c | 3 |
4 files changed, 59 insertions, 40 deletions
diff --git a/Changelog-SVN.txt b/Changelog-SVN.txt index 6b5236995..f8257d7ad 100644 --- a/Changelog-SVN.txt +++ b/Changelog-SVN.txt @@ -1,6 +1,10 @@ Date Added 03/18 + * Fixed a crash when freeing memory of pets [celest] + * Added Cygwin support to the -DDUMPSTACK option, and changed its format + to "<server type><number>.stackdump", thanks to Ser [celest] + * Removed duplicate fopen in login_log [celest] * Don't log SQL char actions if log_char is not enabled in char_athena.conf [celest] * Updated shop_exp's calculation to give more exp, thanks to tcdiem [celest] diff --git a/src/common/core.c b/src/common/core.c index 0b3d65fed..02ba004ae 100644 --- a/src/common/core.c +++ b/src/common/core.c @@ -26,6 +26,10 @@ #include "memwatch.h" #endif +char server_type[24]; +int runflag = 1; +unsigned long ticks = 0; // by MC Cameri +char pid_file[256]; static void (*term_func)(void)=NULL; /*====================================== @@ -100,42 +104,58 @@ static void sig_proc(int sn) * Dumps the stack using glibc's backtrace *----------------------------------------- */ -#ifdef CYGWIN - #define sig_dump SIG_DFL // allow cygwin's default dumper utility to handle this -#else -static void sig_dump(int sn) -{ - #ifdef DUMPSTACK - FILE *fp; +#ifndef DUMPSTACK + #define sig_dump SIG_DFL +#else + #ifdef CYGWIN + #define FOPEN_ freopen + extern void cygwin_stackdump(); + #else + #define FOPEN_(fn,m,s) fopen(fn,m) + #endif +extern const char *strsignal(int); +void sig_dump(int sn) +{ + FILE *fp; + char file[256]; + int no = 0; + + #ifndef CYGWIN void* array[20]; - char **stack; - size_t size; - int no = 0; - char tmp[256]; - - // search for a usable filename - do { - sprintf(tmp,"log/stackdump_%04d.txt", ++no); - } while((fp = fopen(tmp,"r")) && (fclose(fp), no < 9999)); - // dump the trace into the file - if ((fp = fopen (tmp,"w")) != NULL) { - - fprintf(fp,"Exception: %s\n", strsignal(sn)); - fprintf(fp,"Stack trace:\n"); - size = backtrace (array, 20); - stack = backtrace_symbols (array, size); - for (no = 0; no < size; no++) { - fprintf(fp, "%s\n", stack[no]); - } - fprintf(fp,"End of stack trace\n"); - - fclose(fp); - aFree(stack); + size_t size; + #endif + + // search for a usable filename + do { + sprintf (file, "log/%s%04d.stackdump", server_type, ++no); + } while((fp = fopen(file,"r")) && (fclose(fp), no < 9999)); + // dump the trace into the file + + if ((fp = FOPEN_(file, "w", stderr)) != NULL) { + printf ("Dumping stack... "); + fprintf(fp, "Exception: %s \n", strsignal(sn)); + fflush (fp); + + + #ifdef CYGWIN + cygwin_stackdump (); + #else + fprintf(fp, "Stack trace:\n"); + size = backtrace (array, 20); + stack = backtrace_symbols (array, size); + for (no = 0; no < size; no++) { + fprintf(fp, "%s\n", stack[no]); } + fprintf(fp,"End of stack trace\n"); + aFree(stack); #endif - //cygwin_stackdump (); - // When pass the signal to the system's default handler + + printf ("Done.\n"); + fflush(stdout); + fclose(fp); + } + // Pass the signal to the system's default handler compat_signal(sn, SIG_DFL); raise(sn); } @@ -202,11 +222,6 @@ static void display_title(void) *-------------------------------------- */ -int runflag = 1; -unsigned long ticks = 0; // by MC Cameri -char pid_file[256]; -char server_type[24]; - void pid_delete(void) { unlink(pid_file); } @@ -289,7 +304,7 @@ int main(int argc,char **argv) display_title(); -#ifndef BCHECK +#ifdef USE_MEMMGR do_init_memmgr(argv[0]); // 一番最初に実行する必要がある #endif diff --git a/src/login/login.c b/src/login/login.c index 7df8704e6..a54aca410 100644 --- a/src/login/login.c +++ b/src/login/login.c @@ -189,7 +189,6 @@ int login_log(char *fmt, ...) { if(!log_fp) log_fp = fopen(login_log_filename, "a"); - log_fp = fopen(login_log_filename, "a"); if (log_fp) { if (fmt[0] == '\0') // jump a line if no message fprintf(log_fp, RETCODE); diff --git a/src/map/pet.c b/src/map/pet.c index a8e99df6c..553f64044 100644 --- a/src/map/pet.c +++ b/src/map/pet.c @@ -610,7 +610,8 @@ int pet_remove_map(struct map_session_data *sd) pet_hungry_timer_delete(sd); clif_clearchar_area(&sd->pd->bl,0); map_delblock(&sd->pd->bl); - free(sd->pd->lootitem); + if (sd->pd->lootitem) + aFree(sd->pd->lootitem); map_deliddb(&sd->pd->bl); } return 0; |