From fd191a4920b15e168d4c8f4ad9c57ebc698a8ffc Mon Sep 17 00:00:00 2001 From: Walter van Niftrik Date: Tue, 26 May 2009 23:34:57 +0000 Subject: SCI: Changed signatures of StrLen and StrCpy to allow NULL pointers. This is needed for a game bug in KQ6CD. svn-id: r40930 --- engines/sci/engine/kernel.cpp | 7 +++++-- engines/sci/engine/kstring.cpp | 8 +++++++- 2 files changed, 12 insertions(+), 3 deletions(-) (limited to 'engines') 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)); } -- cgit v1.2.3