home · contact · privacy
Server: Remove memory leak in save_world().
[plomrogue] / src / server / io.c
index e4a40d0ccc13685d076080a82d467bbd8c920d99..761655cf9877206e30f9c0636676038f195810fd 100644 (file)
@@ -72,7 +72,7 @@ static void write_key_value(FILE * file, char * key, uint32_t value)
     try_fwrite(key, strlen(key), 1, file, f_name);
     try_fputc(' ', file, f_name);
     char * line = try_malloc(11, f_name);
-    exit_trouble(-1 == sprintf(line, "%u", value), f_name, "sprintf()");
+    exit_trouble(-1 == sprintf(line, "%u", value), f_name, s[S_FCN_SPRINTF]);
     try_fwrite(line, strlen(line), 1, file, f_name);
     free(line);
     try_fputc('\n', file, f_name);
@@ -183,7 +183,7 @@ static void update_worldstate_file()
     uint16_t size = strlen(s[S_PATH_WORLDSTATE])+strlen(s[S_PATH_SUFFIX_TMP])+1;
     char * path_tmp = try_malloc(size, f_name);
     int test=sprintf(path_tmp,"%s%s",s[S_PATH_WORLDSTATE],s[S_PATH_SUFFIX_TMP]);
-    exit_trouble(test < 0, f_name, "sprintf()");
+    exit_trouble(test < 0, f_name, s[S_FCN_SPRINTF]);
     FILE * file = try_fopen(path_tmp, "w", f_name);
     struct Thing * player = get_player();
     write_value_as_line(world.turn, file);
@@ -211,7 +211,7 @@ static void write_value_as_line(uint32_t value, FILE * file)
 {
     char * f_name = "write_value_as_line()";
     char write_buf[12];     /* Holds 10 digits of uint32_t maximum + \n + \0. */
-    exit_trouble(sprintf(write_buf, "%u\n", value) < 0, f_name, "sprintf()");
+    exit_trouble(sprintf(write_buf, "%u\n",value) < 0, f_name,s[S_FCN_SPRINTF]);
     try_fwrite(write_buf, strlen(write_buf), 1, file, f_name);
 }
 
@@ -331,8 +331,11 @@ extern char * io_round()
 extern void save_world()
 {
     char * f_name = "save_world()";
-    char * path = s[S_PATH_SAVE];
-    FILE * file = try_fopen(path, "w", f_name);
+    uint16_t size = strlen(s[S_PATH_SAVE]) + strlen(s[S_PATH_SUFFIX_TMP]) + 1;
+    char * path_tmp = try_malloc(size, f_name);
+    int test=sprintf(path_tmp,"%s%s",s[S_PATH_SAVE], s[S_PATH_SUFFIX_TMP]);
+    exit_trouble(test < 0, f_name, s[S_FCN_SPRINTF]);
+    FILE * file = try_fopen(path_tmp, "w", f_name);
     write_key_value(file, s[S_CMD_DO_FOV], 0);
     try_fputc('\n', file, f_name);
     write_key_value(file, s[S_CMD_SEED_MAP], world.seed_map);
@@ -345,5 +348,6 @@ extern void save_world()
         write_thing(file, t);
     }
     write_key_value(file, s[S_CMD_DO_FOV], 1);
-    try_fclose(file, f_name);
+    try_fclose_unlink_rename(file, path_tmp, s[S_PATH_SAVE], f_name);
+    free(path_tmp);
 }