summaryrefslogtreecommitdiff
path: root/indra/lscript/lscript_byteconvert.h
diff options
context:
space:
mode:
Diffstat (limited to 'indra/lscript/lscript_byteconvert.h')
-rw-r--r--indra/lscript/lscript_byteconvert.h41
1 files changed, 20 insertions, 21 deletions
diff --git a/indra/lscript/lscript_byteconvert.h b/indra/lscript/lscript_byteconvert.h
index d0a5d574d0..e8b727b737 100644
--- a/indra/lscript/lscript_byteconvert.h
+++ b/indra/lscript/lscript_byteconvert.h
@@ -166,8 +166,15 @@ inline void bytestream_int2float(U8 *stream, S32 &offset)
inline bool bytestream2char(char *buffer, const U8 *stream, S32 &offset, S32 buffsize)
{
S32 source_len = strlen( (const char *)stream+offset );
- strncpy( buffer, (const char *)stream+offset, buffsize-1 );
- buffer[buffsize-1] = 0;
+ S32 copy_len = buffsize - 1;
+ if( copy_len > source_len )
+ {
+ copy_len = source_len;
+ }
+
+ // strncpy without \0 padding overhead
+ memcpy( buffer, stream+offset, copy_len );
+ buffer[copy_len] = 0;
offset += source_len + 1; // advance past source string, include terminating '\0'
@@ -1073,28 +1080,20 @@ inline void safe_instruction_float2bytestream(U8 *stream, S32 &offset, F32 value
inline void safe_instruction_bytestream2char(char *buffer, U8 *stream, S32 &offset, S32 buffsize)
{
- bool safe;
- while ( (safe = safe_instruction_check_address(stream, offset, 1))
- && buffsize--
- &&(*buffer++ = *(stream + offset++)))
- ;
+ // This varies from the old method. Previously, we would copy up until we got an error,
+ // then halt the script via safe_isntruction_check_address. Now we don't bother
+ // copying a thing if there's an error.
- // Return if it ended in a null (success) or if script error handling is taking over
- if( !safe || (0 == *(buffer-1)) )
+ if( safe_instruction_check_address(stream, offset, strlen( (const char *)stream + offset ) + 1 ) )
{
- return; // Yep. Success.
+ // Takes the same parms as this function. Won't overread, per above check.
+ bytestream2char( buffer, stream, offset, buffsize );
+ }
+ else
+ {
+ // Truncate - no point in copying
+ *buffer = 0;
}
-
- // Defensive mode. We copied at least one char and ran out of space before
- // null termination. Add the terminator...
- *(buffer-1) = 0;
-
- // ...and advance offset past the end of the data as if we copied the rest. If we
- // violate the safety check, script error handling will protect us. No need to
- // keep advancing.
- while( safe_instruction_check_address(stream, offset, 1)
- && *( stream + offset++ ) )
- ;
}
inline void safe_instruction_bytestream_count_char(U8 *stream, S32 &offset)