diff options
| author | Walter van Niftrik | 2009-05-26 23:34:57 +0000 | 
|---|---|---|
| committer | Walter van Niftrik | 2009-05-26 23:34:57 +0000 | 
| commit | fd191a4920b15e168d4c8f4ad9c57ebc698a8ffc (patch) | |
| tree | 25badf3c0ad92902d5ad70c57043c9913f8244cd /engines/sci | |
| parent | da96ab639e5177cc27d701c60e9a918a3683d64f (diff) | |
| download | scummvm-rg350-fd191a4920b15e168d4c8f4ad9c57ebc698a8ffc.tar.gz scummvm-rg350-fd191a4920b15e168d4c8f4ad9c57ebc698a8ffc.tar.bz2 scummvm-rg350-fd191a4920b15e168d4c8f4ad9c57ebc698a8ffc.zip  | |
SCI: Changed signatures of StrLen and StrCpy to allow NULL pointers. This is
needed for a game bug in KQ6CD.
svn-id: r40930
Diffstat (limited to 'engines/sci')
| -rw-r--r-- | engines/sci/engine/kernel.cpp | 7 | ||||
| -rw-r--r-- | engines/sci/engine/kstring.cpp | 8 | 
2 files changed, 12 insertions, 3 deletions
diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp index 7b6a9a7660..31d5dc722c 100644 --- a/engines/sci/engine/kernel.cpp +++ b/engines/sci/engine/kernel.cpp @@ -141,8 +141,8 @@ SciKernelFunction kfunct_mappers[] = {  	/*47*/	DEFUN("StrEnd", kStrEnd, "r"),  	/*48*/	DEFUN("StrCat", kStrCat, "rr"),  	/*49*/	DEFUN("StrCmp", kStrCmp, "rri*"), -	/*4a*/	DEFUN("StrLen", kStrLen, "r"), -	/*4b*/	DEFUN("StrCpy", kStrCpy, "rri*"), +	/*4a*/	DEFUN("StrLen", kStrLen, "Zr"), +	/*4b*/	DEFUN("StrCpy", kStrCpy, "rZri*"),  	/*4c*/	DEFUN("Format", kFormat, "r.*"),  	/*4d*/	DEFUN("GetFarText", kGetFarText, "iir"),  	/*4e*/	DEFUN("ReadNumber", kReadNumber, "r"), @@ -923,6 +923,9 @@ static void *_kernel_dereference_pointer(EngineState *s, reg_t pointer, int entr  	int maxsize;  	void *retval = s->seg_manager->dereference(pointer, &maxsize); +	if (!retval) +		return NULL; +  	if (pointer.offset & (align - 1)) {  		warning("Unaligned pointer read: %04x:%04x expected with %d alignment", PRINT_REG(pointer), align);  		return NULL; diff --git a/engines/sci/engine/kstring.cpp b/engines/sci/engine/kstring.cpp index 5dbacaca46..13d22cdf30 100644 --- a/engines/sci/engine/kstring.cpp +++ b/engines/sci/engine/kstring.cpp @@ -296,7 +296,8 @@ reg_t kStrCpy(EngineState *s, int funct_nr, int argc, reg_t *argv) {  	if (!src) {  		warning("Attempt to strcpy FROM invalid pointer %04x:%04x",  		          PRINT_REG(argv[1])); -		return NULL_REG; +		*dest = 0; +		return argv[1];  	}  	if (argc > 2) { @@ -632,6 +633,11 @@ reg_t kFormat(EngineState *s, int funct_nr, int argc, reg_t *argv) {  reg_t kStrLen(EngineState *s, int funct_nr, int argc, reg_t *argv) {  	char *str = kernel_dereference_char_pointer(s, argv[0], 0); +	if (!str) { +		warning("StrLen: invalid pointer %04x:%04x", PRINT_REG(argv[0])); +		return NULL_REG; +	} +  	return make_reg(0, strlen(str));  }  | 
