summaryrefslogtreecommitdiff
path: root/indra/lscript/lscript_byteconvert.h
diff options
context:
space:
mode:
authorJosh Bell <josh@lindenlab.com>2008-03-07 17:26:51 +0000
committerJosh Bell <josh@lindenlab.com>2008-03-07 17:26:51 +0000
commit31f7f6c0018ecbbc55986035e935f5e42a33ff16 (patch)
treea1df38c525b5f47eb7b592518342478fe0239b37 /indra/lscript/lscript_byteconvert.h
parentdc27e10bdd158e0f57b3e07a5946cb8978b916e8 (diff)
svn merge -r 80990:81720 svn+ssh://svn.lindenlab.com/svn/linden/branches/Branch_1-19-1-Server --> release
Reg-api merge is the bulk of the diff, it's actually not so bad. Change summary: * Fixed a bogus HTTP/curl warning and cleaned up one line of code for clarity * extra '.' in FQDN names/extra . in the non-FQDN case, which is a syntax error * DEV-11542 Joining two parcels destroys search relevance of a store. * Fixed bug preventing users who turn off email notification from getting offline messages at login * Updated version numbers * New reg-api (w00t!) * DEV-11427 / DEV-11399 - LSL slowdown from strncpy buffer-clearing overhead * DEV-11359 Hide music URL should be on by default * Update to r89 of eventlet * QAR-347 "SEC-28 - It is possible to rez any object, whether you own it or not." * QAR-336 Additional logging to track teleport failures * DEV-11397 - use the slave db for read queries for crons * Fix to turn off PEAR debug logging * Copied code from eventlet.coros to make an Updater that won't die so easily. (multiagent-chat) * Various chicanery with dir-find query * Emergency fix for bad FORCE INDEX on user table when actually searching on the user_last_name table * DEV-11124 : Modify backbone service proxy so that we know which web-ds host a dataservice is actually called * Fixes for DEV-5883 : Test improved-instant-message
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)