--- xastir-1.9.2/src/util.c.bak 2007-08-14 19:41:10.000000000 +0300 +++ xastir-1.9.2/src/util.c 2008-03-09 22:46:14.253943194 +0200 @@ -3500,31 +3500,37 @@ time_t file_time(char *fn) { // our fault. int copy_file(char *infilename, char *outfilename) { FILE *infile, *outfile; - char *buffer; + char buffer[4096]; size_t numread = 0; - - if ((infile = fopen(infilename,"rb")) > (FILE *)0) { - - if ((outfile = fopen(outfilename,"wb")) > (FILE *)0) { - buffer = (char *)malloc(1024); - - while (!feof(infile)) { - numread = fread(buffer, 1, 1024, infile); - fwrite(buffer, 1, numread, outfile); - } - free(buffer); - fflush(outfile); - fclose(outfile); - } - else { + if ((infile = fopen(infilename,"rb")) != NULL) { + if ((outfile = fopen(outfilename,"wb")) != NULL) { + while (!feof(infile) && !ferror(infile) && !ferror(outfile)) { + numread = fread(buffer, 1, sizeof(buffer), infile); + if ((numread > 0) && fwrite(buffer, 1, numread, outfile) != numread) { + fprintf(stderr,"Error writing to %s: %s\n", + outfilename, strerror(errno)); + return 1; + } + } + if (fflush(outfile) == EOF) { + fprintf(stderr,"Error writing to %s: %s\n", + outfilename, strerror(errno)); + fclose(outfile); + return 1; + } + if (fclose(outfile) == EOF) { + fprintf(stderr,"Error writing to %s: %s\n", + outfilename, strerror(errno)); + return 1; + } + } else { fprintf(stderr,"Error opening destination file %s for writing", outfilename); fclose(infile); return(1); } fclose(infile); - } - else { + } else { fprintf(stderr,"Error opening source file %s for reading", infilename); return(1); }