Blob Blame History Raw
From 39f27126609c9c80dea1ab3d95240f4de6c240f9 Mon Sep 17 00:00:00 2001
From: Hans de Goede <hdegoede@redhat.com>
Date: Mon, 14 Feb 2011 12:22:07 +0100
Subject: [PATCH 2/2] Fix -Wunused-result compiler warnings

Fedora uses -Wunused-result when building packages, combined with the -Werror
from the makefile, this causes compile errors in various places because
of not properly error checking various file io actions. This patch fixes this.
---
 src/CConfig.cpp     |   29 ++++++++++++++++++++---------
 src/CEngine.cpp     |   22 ++++++++++++++++------
 src/CPak.cpp        |   18 +++++++++++++++---
 src/CReplayData.cpp |   17 +++++++++++++++--
 src/headers.h       |    1 +
 src/init.cpp        |   18 +++++++++++++++---
 src/loadSave.cpp    |   36 ++++++++++++++++++++++++++----------
 src/pak.cpp         |   33 +++++++++++++++++++++++++++++----
 8 files changed, 137 insertions(+), 37 deletions(-)

diff --git a/src/CConfig.cpp b/src/CConfig.cpp
index ef997bd..5121c7f 100644
--- a/src/CConfig.cpp
+++ b/src/CConfig.cpp
@@ -113,6 +113,7 @@ bool Config::loadJoystickConfig()
 
 bool Config::saveJoystickConfig()
 {
+	bool ret = true;
 	char filename[PATH_MAX];
 	snprintf(filename, sizeof filename, "%sjoystick.cfg", engine->userHomeDirectory);
 	
@@ -122,15 +123,19 @@ bool Config::saveJoystickConfig()
 	
 	if (!fp)
 	{
-		debug(("WARNING: Couldn't save joystick config\n"));
+		debug(("WARNING: Couldn't save joystick config: %s\n", strerror(errno)));
 		return false;
 	}
-		
-	fwrite(&joystick, sizeof(Joystick), 1, fp);
-		
+
+	if (fwrite(&joystick, sizeof(Joystick), 1, fp) != 1)
+	{
+		debug(("WARNING: Couldn't save joystick config: %s\n", strerror(errno)));
+		ret = false;
+	}
+
 	fclose(fp);
 	
-	return true;
+	return ret;
 }
 
 bool Config::loadKeyConfig()
@@ -163,6 +168,7 @@ bool Config::loadKeyConfig()
 
 bool Config::saveKeyConfig()
 {
+	bool ret = true;
 	char filename[PATH_MAX];
 	snprintf(filename, sizeof filename, "%skeyboard.cfg", engine->userHomeDirectory);
 	
@@ -172,14 +178,19 @@ bool Config::saveKeyConfig()
 	
 	if (!fp)
 	{
+		debug(("WARNING: Couldn't save keyboard config: %s\n", strerror(errno)));
 		return false;
 	}
-		
-	fwrite(&keyboard, sizeof(keyboard), 1, fp);
-		
+
+	if (fwrite(&keyboard, sizeof(keyboard), 1, fp) != 1)
+	{
+		debug(("WARNING: Couldn't save keyboard config: %s\n", strerror(errno)));
+		ret = false;
+	}
+
 	fclose(fp);
 	
-	return true;
+	return ret;
 }
 
 void Config::restoreKeyDefaults()
diff --git a/src/CEngine.cpp b/src/CEngine.cpp
index 7017039..a0deaaf 100644
--- a/src/CEngine.cpp
+++ b/src/CEngine.cpp
@@ -330,6 +330,8 @@ since SDL currently provides no means to load music directly from memory
 */
 bool Engine::unpack(const char *filename, int fileType)
 {
+	bool ret = true;
+
 	if (fileType == PAK_DATA)
 	{
 		delete[] dataBuffer;
@@ -396,17 +398,23 @@ bool Engine::unpack(const char *filename, int fileType)
 			return false;
 		}
 
-		fwrite(binaryBuffer, 1, pak.getUncompressedSize(), fp);
+		if (fwrite(binaryBuffer, 1, pak.getUncompressedSize(), fp) != pak.getUncompressedSize())
+		{
+			printf("Fatal Error: could not write to %s: %s", tempPath, strerror(errno));
+			ret = false;
+		}
 		fclose(fp);
 	}
 
-	debug(("unpack() : Loaded %s (%d)\n", filename, pak.getUncompressedSize()));
+	debug(("unpack() : Loaded %s (%d), ret: %d\n", filename, pak.getUncompressedSize(), (int)ret));
 
-	return true;
+	return ret;
 }
 
 bool Engine::loadData(const char *filename)
 {
+	bool ret = true;
+
 	delete[] dataBuffer;
 	dataBuffer = NULL;
 	
@@ -427,14 +435,16 @@ bool Engine::loadData(const char *filename)
 
 	dataBuffer = new unsigned char[fSize + 1];
 
-	fread(dataBuffer, 1, fSize, fp);
+	if (fread(dataBuffer, 1, fSize, fp) != (size_t)fSize)
+		ret = false;
+
 	dataBuffer[fSize] = 0;
 
 	fclose(fp);
 
-	debug(("loadData() : Loaded %s (%d)\n", filename, fSize));
+	debug(("loadData() : Loaded %s (%d), ret: %d\n", filename, fSize, (int)ret));
 
-	return true;
+	return ret;
 }
 
 void Engine::reportFontFailure()
diff --git a/src/CPak.cpp b/src/CPak.cpp
index ff29cef..f630867 100644
--- a/src/CPak.cpp
+++ b/src/CPak.cpp
@@ -66,8 +66,16 @@ void Pak::setPakFile(const char *pakFilename)
 	}
 
 	fseek(pak, (-sizeof(Uint32)) * 2, SEEK_END);
-	fread(&listPos, sizeof(Uint32), 1, pak);
-	fread(&numberOfFiles, sizeof(Uint32), 1, pak);
+	if (fread(&listPos, sizeof(Uint32), 1, pak) != 1)
+	{
+		fclose(pak);
+		showPakErrorAndExit();
+	}
+	if (fread(&numberOfFiles, sizeof(Uint32), 1, pak) != 1)
+	{
+		fclose(pak);
+		showPakErrorAndExit();
+	}
 	
 	debug(("Pak : File list resides at %d\n", (int)listPos));
 	debug(("Pak : Number of files are %d\n", (int)numberOfFiles));
@@ -130,7 +138,11 @@ bool Pak::unpack(const char *filename, unsigned char **buffer)
 	input = new unsigned char[(int)(currentFile->cSize * 1.01) + 12];
 	*buffer = new unsigned char[currentFile->fSize + 1];
 
-	fread(input, 1, currentFile->cSize, pak);
+	if (fread(input, 1, currentFile->cSize, pak) != currentFile->cSize)
+	{
+		fclose(pak);
+		showPakErrorAndExit();
+	}
 	
 	uLongf fSize = (uLongf)currentFile->fSize;
 	
diff --git a/src/CReplayData.cpp b/src/CReplayData.cpp
index 6af8492..51c1834 100644
--- a/src/CReplayData.cpp
+++ b/src/CReplayData.cpp
@@ -22,7 +22,12 @@ ReplayData::~ReplayData()
 	{
 		save();
 		rewind(fp);
-		fwrite(&header, sizeof(ReplayDataHeader), 1, fp);
+		int size = fwrite(&header, sizeof(ReplayDataHeader), 1, fp);
+		if (size != 1)
+		{
+			printf("Error saving replay data: %s\n", strerror(errno));
+			exit(1);
+		}
 	}
 	
 	if (replayMode != REPLAY_MODE::NONE)
@@ -98,7 +103,15 @@ void ReplayData::setMode(REPLAY_MODE::TYPE replayMode)
 		
 		swapHeaderEndians();
 		
-		fwrite(&header, sizeof(ReplayDataHeader), 1, fp);
+		int size = fwrite(&header, sizeof(ReplayDataHeader), 1, fp);
+		if (size != 1)
+		{
+			printf("Error writing replay data header: %s\n", strerror(errno));
+			replayMode = REPLAY_MODE::NONE;
+			fclose(fp);
+			fp = NULL;
+			return;
+		}
 		
 		reset();
 	}
diff --git a/src/headers.h b/src/headers.h
index be31931..d679809 100644
--- a/src/headers.h
+++ b/src/headers.h
@@ -18,6 +18,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 */
 
+#include <errno.h>
 #include <stdlib.h>
 #include <string.h>
 #include <math.h>
diff --git a/src/init.cpp b/src/init.cpp
index 46ac381..b12cba6 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -144,7 +144,10 @@ bool loadConfig()
 		return true;
 	}
 
-	fscanf(fp, "%10f %10d", &version, &release);
+	if (fscanf(fp, "%10f %10d", &version, &release) != 2)
+	{
+		rtn = true;
+	}
 
 	debug(("Version = %.2f - Expected %.2f\n", version, VERSION));
 	debug(("Release = %d - Expected %d\n", release, RELEASE));
@@ -154,7 +157,10 @@ bool loadConfig()
 		rtn = true;
 	}
 
-	fscanf(fp, "%10d %10d %10d %10d %10d %10d %10d", &engine.fullScreen, &game.musicVol, &game.soundVol, &game.output, &game.brightness, &engine.extremeAvailable, &game.gore);
+	if (fscanf(fp, "%10d %10d %10d %10d %10d %10d %10d", &engine.fullScreen, &game.musicVol, &game.soundVol, &game.output, &game.brightness, &engine.extremeAvailable, &game.gore) != 7)
+	{
+		rtn = true;
+	}
 
 	fclose(fp);
 
@@ -223,7 +229,13 @@ int initMedalService(void *data)
 		return 0;
 	}
 	
-	fscanf(fp, "%19s", privateKey);
+	if (fscanf(fp, "%19s", privateKey) != 1)
+	{
+		graphics.showMedalMessage(-1, "Medal Key file corrupt - Online functions disabled");
+		SDL_mutexV(medalServer.lock);
+		fclose(fp);
+		return 0;
+	}
 	
 	fclose(fp);
 		
diff --git a/src/loadSave.cpp b/src/loadSave.cpp
index 73f5384..9489f5e 100644
--- a/src/loadSave.cpp
+++ b/src/loadSave.cpp
@@ -122,8 +122,11 @@ bool loadGame(int slot)
 	
 	while (true)
 	{
-		fgets(line, 1024, fp);
-		
+		if (!fgets(line, 1024, fp)) {
+			fclose(fp);
+			graphics.showErrorAndExit("Unexpected end of file reading save data", "");
+		}
+
 		sscanf(line, "%*c %[^\"] %*c %*c %[^\"] %*c %d %d", string[0], string[1], &param[0], &param[1]);
 		
 		data = new Data();
@@ -160,8 +163,11 @@ bool loadGame(int slot)
 	
 	while (true)
 	{
-		fgets(line, 1024, fp);
-		
+		if (!fgets(line, 1024, fp)) {
+			fclose(fp);
+			graphics.showErrorAndExit("Unexpected end of file reading save data", "");
+		}
+
 		sscanf(line, "%[^\n\r]", string[0]);
 		strlcpy(stageName, string[0], sizeof stageName);
 		
@@ -169,8 +175,11 @@ bool loadGame(int slot)
 		{
 			break;
 		}
-		
-		fgets(line, 1024, fp);
+
+		if (!fgets(line, 1024, fp)) {
+			fclose(fp);
+			graphics.showErrorAndExit("Unexpected end of file reading save data", "");
+		}
 		sscanf(line, "%d", &numberOfLines);
 		
 		debug(("Read %s with %d lines.\n", stageName, numberOfLines));
@@ -180,9 +189,12 @@ bool loadGame(int slot)
 		for (int i = 0 ; i < numberOfLines ; i++)
 		{
 			persistData = new PersistData();
-			
-			fgets(line, 1024, fp);
-			
+
+			if (!fgets(line, 1024, fp)) {
+				fclose(fp);
+				graphics.showErrorAndExit("Unexpected end of file reading save data", "");
+			}
+
 			strlcpy(persistData->data, line, sizeof persistData->data);
 			
 			//debug(("Read %d: %s", i, persistData->data));
@@ -346,7 +358,11 @@ void saveGame()
 		graphics.showErrorAndExit("File write error whilst saving game", "");
 	}
 
-	fwrite(&game, sizeof(Game), 1, fp);
+	if (fwrite(&game, sizeof(Game), 1, fp) != 1)
+	{
+		fclose(fp);
+		graphics.showErrorAndExit("File write error whilst saving game", strerror(errno));
+	}
 	
 	fclose(fp);
 	
diff --git a/src/pak.cpp b/src/pak.cpp
index d70fe57..226afe4 100644
--- a/src/pak.cpp
+++ b/src/pak.cpp
@@ -154,7 +154,12 @@ void recurseDirectory(const char *dirName)
 				
 				fileData[files].set(filename, fSize, cSize, ftell(pak));
 
-				fwrite(output, 1, cSize, pak);
+				if (fwrite(output, 1, cSize, pak) != cSize)
+				{
+					fprintf(stderr, "Error writing to pakfile: %s\n", strerror(errno));
+					fclose(pak);
+					exit(1);
+				}
 
 				files++;
 				
@@ -183,6 +188,11 @@ int main(int argc, char *argv[])
 	}
 
 	pak = fopen(argv[argc - 1], "wb");
+	if (!pak)
+	{
+		fprintf(stderr, "Error opening %s: %s\n", argv[argc - 1], strerror(errno));
+		return 1;
+	}
 	
 	for (int i = 1 ; i < (argc - 1) ; i++)
 	{
@@ -211,13 +221,28 @@ int main(int argc, char *argv[])
 			break;
 		}
 
-		fwrite(&fileData[i], sizeof(FileData), 1, pak);
+		if (fwrite(&fileData[i], sizeof(FileData), 1, pak) != 1)
+		{
+			fprintf(stderr, "Error writing to %s: %s\n", argv[argc - 1], strerror(errno));
+			fclose(pak);
+			return 1;
+		}
 	}
 	
 	unsigned int numberOfFiles = totalFiles;
 
-	fwrite(&pos, sizeof(unsigned int), 1, pak);
-	fwrite(&numberOfFiles, sizeof(unsigned int), 1, pak);
+	if (fwrite(&pos, sizeof(unsigned int), 1, pak) != 1)
+	{
+		fprintf(stderr, "Error writing to %s: %s\n", argv[argc - 1], strerror(errno));
+		fclose(pak);
+		return 1;
+	}
+	if (fwrite(&numberOfFiles, sizeof(unsigned int), 1, pak) != 1)
+	{
+		fprintf(stderr, "Error writing to %s: %s\n", argv[argc - 1], strerror(errno));
+		fclose(pak);
+		return 1;
+	}
 
 	fclose(pak);
 
-- 
1.7.3.2