aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorWalter van Niftrik2009-05-26 23:34:57 +0000
committerWalter van Niftrik2009-05-26 23:34:57 +0000
commitfd191a4920b15e168d4c8f4ad9c57ebc698a8ffc (patch)
tree25badf3c0ad92902d5ad70c57043c9913f8244cd /engines
parentda96ab639e5177cc27d701c60e9a918a3683d64f (diff)
downloadscummvm-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')
-rw-r--r--engines/sci/engine/kernel.cpp7
-rw-r--r--engines/sci/engine/kstring.cpp8
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));
}