[Scummvm-git-logs] scummvm master -> 8e829371c9d12fc121e9edbd05d40a2f03166cf1

sev- sev at scummvm.org
Fri Dec 8 08:56:02 CET 2017


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
8e829371c9 SKY: Fix unaligned pointer dereferences


Commit: 8e829371c9d12fc121e9edbd05d40a2f03166cf1
    https://github.com/scummvm/scummvm/commit/8e829371c9d12fc121e9edbd05d40a2f03166cf1
Author: Colin Snover (github.com at zetafleet.com)
Date: 2017-12-08T07:55:56Z

Commit Message:
SKY: Fix unaligned pointer dereferences

Dereferencing an unaligned pointer will cause a memory fault on
at least older ARM and SPARC architectures, and is warned about
starting in Clang 4.

Changed paths:
    engines/sky/compact.cpp
    engines/sky/compact.h
    engines/sky/logic.cpp


diff --git a/engines/sky/compact.cpp b/engines/sky/compact.cpp
index ab244c1..13ea300 100644
--- a/engines/sky/compact.cpp
+++ b/engines/sky/compact.cpp
@@ -311,24 +311,47 @@ const char *SkyCompact::nameForType(uint16 type) {
 		return _typeNames[type];
 }
 
-uint16 *SkyCompact::getSub(Compact *cpt, uint16 mode) {
+uint16 SkyCompact::getSub(Compact *cpt, uint16 mode) {
 	switch (mode) {
 	case 0:
-		return &(cpt->baseSub);
+		return cpt->baseSub;
 	case 2:
-		return &(cpt->baseSub_off);
+		return cpt->baseSub_off;
 	case 4:
-		return &(cpt->actionSub);
+		return cpt->actionSub;
 	case 6:
-		return &(cpt->actionSub_off);
+		return cpt->actionSub_off;
 	case 8:
-		return &(cpt->getToSub);
+		return cpt->getToSub;
 	case 10:
-		return &(cpt->getToSub_off);
+		return cpt->getToSub_off;
 	case 12:
-		return &(cpt->extraSub);
+		return cpt->extraSub;
 	case 14:
-		return &(cpt->extraSub_off);
+		return cpt->extraSub_off;
+	default:
+		error("Invalid Mode (%d)", mode);
+	}
+}
+
+void SkyCompact::setSub(Compact *cpt, uint16 mode, uint16 value) {
+	switch (mode) {
+	case 0:
+		cpt->baseSub = value;
+	case 2:
+		cpt->baseSub_off = value;
+	case 4:
+		cpt->actionSub = value;
+	case 6:
+		cpt->actionSub_off = value;
+	case 8:
+		cpt->getToSub = value;
+	case 10:
+		cpt->getToSub_off = value;
+	case 12:
+		cpt->extraSub = value;
+	case 14:
+		cpt->extraSub_off = value;
 	default:
 		error("Invalid Mode (%d)", mode);
 	}
diff --git a/engines/sky/compact.h b/engines/sky/compact.h
index 86db0ba..57ccb7f 100644
--- a/engines/sky/compact.h
+++ b/engines/sky/compact.h
@@ -62,7 +62,8 @@ public:
 	~SkyCompact();
 	Compact *fetchCpt(uint16 cptId);
 	Compact *fetchCptInfo(uint16 cptId, uint16 *elems = NULL, uint16 *type = NULL, char *name = NULL);
-	static uint16 *getSub(Compact *cpt, uint16 mode);
+	static uint16 getSub(Compact *cpt, uint16 mode);
+	static void setSub(Compact *cpt, uint16 mode, uint16 value);
 	static MegaSet *getMegaSet(Compact *cpt);
 	uint16 *getGrafixPtr(Compact *cpt);
 	uint16 *getTurnTable(Compact *cpt, uint16 dir);
diff --git a/engines/sky/logic.cpp b/engines/sky/logic.cpp
index c96d74e..8833b45 100644
--- a/engines/sky/logic.cpp
+++ b/engines/sky/logic.cpp
@@ -182,12 +182,13 @@ void Logic::logicScript() {
 
 	for (;;) {
 		uint16 mode = _compact->mode; // get pointer to current script
-		uint16 *scriptNo = SkyCompact::getSub(_compact, mode);
-		uint16 *offset   = SkyCompact::getSub(_compact, mode + 2);
+		uint16 scriptNo = SkyCompact::getSub(_compact, mode);
+		uint16 offset   = SkyCompact::getSub(_compact, mode + 2);
 
-		*offset = script(*scriptNo, *offset);
+		offset = script(scriptNo, offset);
+		SkyCompact::setSub(_compact, mode + 2, offset);
 
-		if (!*offset) // script finished
+		if (!offset) // script finished
 			_compact->mode -= 4;
 		else if (_compact->mode == mode)
 			return;
@@ -294,7 +295,7 @@ void Logic::arAnim() {
 				// tell it it is waiting for us
 				cpt->waitingFor = (uint16)(_scriptVariables[CUR_ID] & 0xffff);
 				// restart current script
-				*SkyCompact::getSub(_compact, _compact->mode + 2) = 0;
+				SkyCompact::setSub(_compact, _compact->mode + 2, 0);
 				_compact->logic = L_SCRIPT;
 				logicScript();
 				return;
@@ -337,7 +338,7 @@ void Logic::arAnim() {
 
 	// changed so restart the current script
 	// *not suitable for base initiated ARing
-	*SkyCompact::getSub(_compact, _compact->mode + 2) = 0;
+	SkyCompact::setSub(_compact, _compact->mode + 2, 0);
 
 	_compact->logic = L_SCRIPT;
 	logicScript();
@@ -414,8 +415,8 @@ void Logic::arTurn() {
 void Logic::alt() {
 	/// change the current script
 	_compact->logic = L_SCRIPT;
-	*SkyCompact::getSub(_compact, _compact->mode) = _compact->alt;
-	*SkyCompact::getSub(_compact, _compact->mode + 2) = 0;
+	SkyCompact::setSub(_compact, _compact->mode, _compact->alt);
+	SkyCompact::setSub(_compact, _compact->mode + 2, 0);
 	logicScript();
 }
 
@@ -633,7 +634,7 @@ void Logic::stopped() {
 	// we are free, continue processing the script
 
 	// restart script one level below
-	*SkyCompact::getSub(_compact, _compact->mode - 2) = 0;
+	SkyCompact::setSub(_compact, _compact->mode - 2, 0);
 	_compact->waitingFor = 0xffff;
 
 	_compact->logic = L_SCRIPT;
@@ -782,11 +783,8 @@ void Logic::runGetOff() {
 void Logic::stopAndWait() {
 	_compact->mode += 4;
 
-	uint16 *scriptNo = SkyCompact::getSub(_compact, _compact->mode);
-	uint16 *offset   = SkyCompact::getSub(_compact, _compact->mode + 2);
-
-	*scriptNo = _compact->stopScript;
-	*offset   = 0;
+	SkyCompact::setSub(_compact, _compact->mode, _compact->stopScript);
+	SkyCompact::setSub(_compact, _compact->mode + 2, 0);
 
 	_compact->logic = L_SCRIPT;
 	logicScript();
@@ -1457,24 +1455,24 @@ bool Logic::fnInteract(uint32 targetId, uint32 b, uint32 c) {
 	_compact->logic = L_SCRIPT;
 	Compact *cpt = _skyCompact->fetchCpt(targetId);
 
-	*SkyCompact::getSub(_compact, _compact->mode) = cpt->actionScript;
-	*SkyCompact::getSub(_compact, _compact->mode + 2) = 0;
+	SkyCompact::setSub(_compact, _compact->mode, cpt->actionScript);
+	SkyCompact::setSub(_compact, _compact->mode + 2, 0);
 
 	return false;
 }
 
 bool Logic::fnStartSub(uint32 scr, uint32 b, uint32 c) {
 	_compact->mode += 4;
-	*SkyCompact::getSub(_compact, _compact->mode) = (uint16)(scr & 0xffff);
-	*SkyCompact::getSub(_compact, _compact->mode + 2) = (uint16)(scr >> 16);
+	SkyCompact::setSub(_compact, _compact->mode, scr & 0xffff);
+	SkyCompact::setSub(_compact, _compact->mode + 2, scr >> 16);
 	return false;
 }
 
 bool Logic::fnTheyStartSub(uint32 mega, uint32 scr, uint32 c) {
 	Compact *cpt = _skyCompact->fetchCpt(mega);
 	cpt->mode += 4;
-	*SkyCompact::getSub(cpt, cpt->mode) = (uint16)(scr & 0xffff);
-	*SkyCompact::getSub(cpt, cpt->mode + 2) = (uint16)(scr >> 16);
+	SkyCompact::setSub(cpt, cpt->mode, scr & 0xffff);
+	SkyCompact::setSub(cpt, cpt->mode + 2, scr >> 16);
 	return true;
 }
 
@@ -1558,8 +1556,8 @@ bool Logic::fnGetTo(uint32 targetPlaceId, uint32 mode, uint32 c) {
 		getToTable += 2;
 
 	// get new script
-	*SkyCompact::getSub(_compact, _compact->mode) = *(getToTable + 1);
-	*SkyCompact::getSub(_compact, _compact->mode + 2) = 0;
+	SkyCompact::setSub(_compact, _compact->mode, *(getToTable + 1));
+	SkyCompact::setSub(_compact, _compact->mode + 2, 0);
 
 	return false; // drop out of script
 }





More information about the Scummvm-git-logs mailing list