changeset 88:1c616f54d688

Irccd: more security and performance in Irccd.File.read
author David Demelier <markand@malikania.fr>
date Thu, 07 Apr 2016 13:21:54 +0200
parents 8e9aa5d79c82
children 339808b0c007
files lib/irccd/js-file.cpp
diffstat 1 files changed, 14 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/lib/irccd/js-file.cpp	Thu Apr 07 13:20:58 2016 +0200
+++ b/lib/irccd/js-file.cpp	Thu Apr 07 13:21:54 2016 +0200
@@ -16,7 +16,9 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#include <algorithm>
 #include <array>
+#include <iterator>
 #include <vector>
 
 #include <irccd/sysconfig.h>
@@ -231,20 +233,26 @@
 			std::array<char, 128> buffer;
 			std::size_t nread;
 
-			while ((nread = std::fread(&buffer[0], sizeof (buffer[0]), buffer.size(), file->handle())) > 0) {
-				data += std::string(buffer.data(), nread);
+			while (!std::feof(file->handle())) {
+				nread = std::fread(&buffer[0], sizeof (buffer[0]), buffer.size(), file->handle());
+
+				if (std::ferror(file->handle()))
+					duk::raise(ctx, SystemError());
+
+				std::copy(buffer.begin(), buffer.begin() + nread, std::back_inserter(data));
 				total += nread;
 			}
 		} else {
 			data.resize((std::size_t)amount);
 			total = std::fread(&data[0], sizeof (data[0]), (std::size_t)amount, file->handle());
+
+			if (std::ferror(file->handle()))
+				duk::raise(ctx, SystemError());
+
 			data.resize(total);
 		}
 
-		if (std::ferror(file->handle()))
-			duk::raise(ctx, SystemError());
-
-		duk::push(ctx, std::string(data.data(), total));
+		duk::push(ctx, data);
 	} catch (const std::exception &) {
 		duk::raise(ctx, SystemError());
 	}