tags 147832 + patch bye Hi,
I offer the attached patch to fix this bug. It uses a temporary file and overwrite the servlist_.conf file only if fclose returns without errors. I've intentionally ignored the file permissions issue mentioned above. HTH -- Walter Franzini http://aegis.stepbuild.org/
Index: xchat-2.8.8/src/common/servlist.c =================================================================== --- xchat-2.8.8.orig/src/common/servlist.c 2012-08-20 15:34:54.000000000 +0200 +++ xchat-2.8.8/src/common/servlist.c 2012-08-20 15:59:53.607555834 +0200 @@ -1077,17 +1077,24 @@ ircserver *serv; GSList *list; GSList *hlist; + char *servlist = "servlist_.conf"; + char *new_servlist; + #ifndef WIN32 int first = FALSE; - snprintf (buf, sizeof (buf), "%s/servlist_.conf", get_xdir_fs ()); + snprintf (buf, sizeof (buf), "%s/servlist_.conf.new", get_xdir_fs ()); if (access (buf, F_OK) != 0) first = TRUE; #endif - fp = xchat_fopen_file ("servlist_.conf", "w", 0); + new_servlist = malloc (strlen(servlist) + 5); + strcpy (new_servlist, servlist); + strcat (new_servlist, ".new"); + + fp = xchat_fopen_file (new_servlist, "w", 0); if (!fp) - return FALSE; + goto failure; #ifndef WIN32 if (first) @@ -1140,17 +1147,25 @@ hlist = hlist->next; } - if (fprintf (fp, "\n") < 1) - { - fclose (fp); - return FALSE; - } + fprintf (fp, "\n"); list = list->next; } - fclose (fp); - return TRUE; + if (0 == fclose (fp)) + { +#ifdef WIN32 + unlink (servlist); /* win32 can't rename to an existing file */ +#endif + xchat_rename_file (new_servlist, servlist, 0); + + free (new_servlist); + return TRUE; + } + +failure: + free(new_servlist); + return FALSE; } static void