From c8f507561cb9c98138595ea6309e3a29828f6d12 Mon Sep 17 00:00:00 2001 From: Scott Ehlert Date: Sat, 14 Apr 2007 04:19:58 +0000 Subject: [PATCH] Empty strings can now properly be passed via PushString and StringToLocal --HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40701 --- core/vm/sp_vm_basecontext.cpp | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/core/vm/sp_vm_basecontext.cpp b/core/vm/sp_vm_basecontext.cpp index 9b2eab0d..823f094f 100644 --- a/core/vm/sp_vm_basecontext.cpp +++ b/core/vm/sp_vm_basecontext.cpp @@ -693,26 +693,27 @@ int BaseContext::PushString(cell_t *local_addr, char **phys_addr, const char *st return SP_ERROR_NONE; } -int BaseContext::StringToLocal(cell_t local_addr, size_t chars, const char *source) +int BaseContext::StringToLocal(cell_t local_addr, size_t bytes, const char *source) { char *dest; - int len; + size_t len; if (((local_addr >= ctx->hp) && (local_addr < ctx->sp)) || (local_addr < 0) || ((ucell_t)local_addr >= ctx->mem_size)) { return SP_ERROR_INVALID_ADDRESS; } + if (bytes == 0) + { + return SP_ERROR_NONE; + } + len = strlen(source); dest = (char *)(ctx->memory + local_addr); - if ((size_t)len >= chars) + if ((size_t)len >= bytes) { - len = chars - 1; - } - if (len <= 0) - { - return SP_ERROR_NONE; + len = bytes - 1; } memcpy(dest, source, len); @@ -762,13 +763,18 @@ inline int __CheckValidChar(char *c) int BaseContext::StringToLocalUTF8(cell_t local_addr, size_t maxbytes, const char *source, size_t *wrtnbytes) { char *dest; - int len; + size_t len; bool needtocheck = false; if (((local_addr >= ctx->hp) && (local_addr < ctx->sp)) || (local_addr < 0) || ((ucell_t)local_addr >= ctx->mem_size)) { return SP_ERROR_INVALID_ADDRESS; } + + if (maxbytes == 0) + { + return SP_ERROR_NONE; + } len = strlen(source); dest = (char *)(ctx->memory + local_addr); @@ -778,10 +784,6 @@ int BaseContext::StringToLocalUTF8(cell_t local_addr, size_t maxbytes, const cha len = maxbytes - 1; needtocheck = true; } - if (len <= 0) - { - return SP_ERROR_NONE; - } memcpy(dest, source, len); if ((dest[len-1] & 1<<7) && needtocheck)