From 7690d56228fdf1f634046f53a489ab2b93099a83 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Thu, 8 Jan 2015 19:51:00 -0600 Subject: Fix cross-device editing failures This resolves Bug 2215 --- src/libr-bfd.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/libr-bfd.c b/src/libr-bfd.c index c4bc8b1..629a466 100644 --- a/src/libr-bfd.c +++ b/src/libr-bfd.c @@ -1,6 +1,7 @@ /* * * Copyright (c) 2008-2011 Erich Hoover + * Copyright (c) 2015 Timothy Pearson * * libr libbfd Backend - Add resources into ELF binaries using libbfd * @@ -320,23 +321,36 @@ int safe_rename(const char *old, const char *new) { char buffer[1024]; FILE *in, *out; - int read; + size_t read; + int status_in; + int status_out; in = fopen(old, "r"); - if(!in) + if(!in) { return -1; + } out = fopen(new, "w"); - if(!out) + if(!out) { + fclose(in); return -1; - while(!feof(in) && !ferror(in)) - { + } + while(!feof(in) && !ferror(in)) { read = fread(buffer, 1, sizeof(buffer), in); - fwrite(buffer, read, 1, out); + if (read > 0) { + fwrite(buffer, 1, read, out); + } + if (ferror(in) || ferror(out)) { + fclose(in); + fclose(out); + remove(new); + return -1; + } } + status_in = ferror(in); + status_out = ferror(out); fclose(in); fclose(out); - if(ferror(in)) - { + if(status_in || status_out) { remove(new); return -1; } -- cgit v1.2.3