[Scummvm-cvs-logs] SF.net SVN: scummvm:[52298] scummvm/trunk/engines/sci/engine/kfile.cpp

thebluegr at users.sourceforge.net thebluegr at users.sourceforge.net
Mon Aug 23 14:56:42 CEST 2010


Revision: 52298
          http://scummvm.svn.sourceforge.net/scummvm/?rev=52298&view=rev
Author:   thebluegr
Date:     2010-08-23 12:56:41 +0000 (Mon, 23 Aug 2010)

Log Message:
-----------
SCI: Check for EOF and errors when reading from a file. Fixes bug #3049360 - "SCI: Bug in file read/write operations"

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/kfile.cpp

Modified: scummvm/trunk/engines/sci/engine/kfile.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kfile.cpp	2010-08-23 10:18:06 UTC (rev 52297)
+++ scummvm/trunk/engines/sci/engine/kfile.cpp	2010-08-23 12:56:41 UTC (rev 52298)
@@ -218,18 +218,22 @@
 	return s->r_acc;
 }
 
-static void fgets_wrapper(EngineState *s, char *dest, int maxsize, int handle) {
+static bool fgets_wrapper(EngineState *s, char *dest, int maxsize, int handle) {
 	FileHandle *f = getFileFromHandle(s, handle);
 	if (!f)
-		return;
+		return false;
 
 	if (!f->_in) {
 		error("fgets_wrapper: Trying to read from file '%s' opened for writing", f->_name.c_str());
-		return;
+		return false;
 	}
 	if (maxsize > 1) {
 		memset(dest, 0, maxsize);
 		f->_in->readLine(dest, maxsize);
+
+		if (f->_in->eos() || f->_in->err())
+			return false;
+
 		// The returned string must not have an ending LF
 		int strSize = strlen(dest);
 		if (strSize > 0) {
@@ -238,9 +242,14 @@
 		}
 	} else {
 		*dest = f->_in->readByte();
+
+		if (f->_in->eos() || f->_in->err())
+			return false;
 	}
 
 	debugC(2, kDebugLevelFile, "  -> FGets'ed \"%s\"", dest);
+
+	return true;
 }
 
 reg_t kFGets(EngineState *s, int argc, reg_t *argv) {
@@ -249,7 +258,9 @@
 	int handle = argv[2].toUint16();
 
 	debugC(2, kDebugLevelFile, "kFGets(%d, %d)", handle, maxsize);
-	fgets_wrapper(s, buf, maxsize, handle);
+	if (!fgets_wrapper(s, buf, maxsize, handle))
+		*buf = 0;
+
 	s->_segMan->memcpy(argv[0], (const byte*)buf, maxsize);
 	return argv[0];
 }
@@ -773,6 +784,12 @@
 	FileHandle *f = getFileFromHandle(s, handle);
 	if (f) {
 		bytesRead = f->_in->read(buf, size);
+
+		if (f->_in->eos() || f->_in->err()) {
+			*buf = 0;
+			bytesRead = 0;
+		}
+
 		s->_segMan->memcpy(argv[1], (const byte*)buf, size);
 	}
 
@@ -841,7 +858,9 @@
 	int handle = argv[2].toUint16();
 	debugC(2, kDebugLevelFile, "kFileIO(readString): %d, %d", handle, size);
 
-	fgets_wrapper(s, buf, size, handle);
+	if (!fgets_wrapper(s, buf, size, handle))
+		*buf = 0;
+
 	s->_segMan->memcpy(argv[0], (const byte*)buf, size);
 	delete[] buf;
 	return argv[0];


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list