summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
Diffstat (limited to 'indra')
-rw-r--r--indra/llcommon/llevent.cpp10
-rw-r--r--indra/llcommon/llevent.h1
-rw-r--r--indra/llcommon/llsd.cpp4
-rw-r--r--indra/llcommon/llstring.cpp1
-rw-r--r--indra/llmath/lloctree.h11
-rw-r--r--indra/llmessage/message.cpp14
-rw-r--r--indra/llrender/llfontgl.cpp2
-rw-r--r--indra/llui/llfloater.cpp63
-rw-r--r--indra/llui/llscrolllistctrl.cpp2
-rw-r--r--indra/llvfs/llvfs.cpp92
-rw-r--r--indra/llwindow/llmousehandler.h2
-rw-r--r--indra/llxml/llxmlnode.cpp4
-rw-r--r--indra/lscript/lscript_execute/lscript_execute.cpp72
-rw-r--r--indra/lscript/lscript_library/lscript_alloc.cpp51
-rw-r--r--indra/lscript/lscript_library/lscript_library.cpp2
-rw-r--r--indra/newview/llcurrencyuimanager.cpp16
-rw-r--r--indra/newview/llfloateravatartextures.cpp4
-rw-r--r--indra/newview/llfloaterbuyland.cpp27
-rw-r--r--indra/newview/llfloaterfriends.cpp3
-rw-r--r--indra/newview/llfloatergodtools.cpp2
-rw-r--r--indra/newview/llfloaterregioninfo.cpp2
-rw-r--r--indra/newview/llfloatertopobjects.cpp2
-rw-r--r--indra/newview/llpanelclassified.cpp2
-rw-r--r--indra/newview/llpanelgroupgeneral.cpp2
-rw-r--r--indra/newview/llpanelgroupnotices.cpp2
-rw-r--r--indra/newview/llpanelpick.cpp2
-rw-r--r--indra/newview/llselectmgr.cpp10
-rw-r--r--indra/newview/lltexturectrl.cpp3
-rw-r--r--indra/newview/lltooldraganddrop.cpp1
-rw-r--r--indra/newview/llviewermenu.cpp8
-rw-r--r--indra/newview/llviewermessage.cpp14
-rw-r--r--indra/newview/llviewerparcelmgr.cpp7
-rw-r--r--indra/newview/llvoavatar.cpp23
-rw-r--r--indra/test/llhttpclient_tut.cpp2
-rw-r--r--indra/test/llpipeutil.cpp2
-rw-r--r--indra/test/llsd_new_tut.cpp1
-rw-r--r--indra/test/lltut.cpp1
37 files changed, 275 insertions, 192 deletions
diff --git a/indra/llcommon/llevent.cpp b/indra/llcommon/llevent.cpp
index 6e6fce6ec3..368159ee54 100644
--- a/indra/llcommon/llevent.cpp
+++ b/indra/llcommon/llevent.cpp
@@ -167,16 +167,14 @@ void LLSimpleDispatcher::addListener(LLEventListener* listener, LLSD filter, con
void LLSimpleDispatcher::removeListener(LLEventListener* listener)
{
- std::vector<LLListenerEntry>::iterator itor;
- for (itor=mListeners.begin(); itor!=mListeners.end();)
+ std::vector<LLListenerEntry>::iterator itor = mListeners.begin();
+ std::vector<LLListenerEntry>::iterator end = mListeners.end();
+ for (; itor != end; ++itor)
{
if ((*itor).listener == listener)
{
mListeners.erase(itor);
- }
- else
- {
- ++itor;
+ break;
}
}
listener->handleDetach(mParent);
diff --git a/indra/llcommon/llevent.h b/indra/llcommon/llevent.h
index 4a619ba16f..283f40f923 100644
--- a/indra/llcommon/llevent.h
+++ b/indra/llcommon/llevent.h
@@ -109,6 +109,7 @@ public:
// Adds a listener to this dispatcher, with a given user data
// that will be passed to the listener when an event is fired.
+ // Duplicate pointers are removed on addtion.
void addListener(LLEventListener *listener, LLSD filter, const LLSD& userdata);
// Removes a listener from this dispatcher
diff --git a/indra/llcommon/llsd.cpp b/indra/llcommon/llsd.cpp
index aa4cba99d1..e5f366c4a4 100644
--- a/indra/llcommon/llsd.cpp
+++ b/indra/llcommon/llsd.cpp
@@ -10,6 +10,8 @@
#include <sstream>
#include <math.h>
+
+#include "llerror.h"
#include "../llmath/llmath.h"
#include "llformat.h"
@@ -234,7 +236,7 @@ namespace {
public:
ImplUUID(const LLSD::UUID& v) : Base(v) { }
- virtual LLSD::String asString() const{ return mValue.getString(); }
+ virtual LLSD::String asString() const{ return mValue.asString(); }
virtual LLSD::UUID asUUID() const { return mValue; }
};
diff --git a/indra/llcommon/llstring.cpp b/indra/llcommon/llstring.cpp
index 50fd881ad7..767a72dfe9 100644
--- a/indra/llcommon/llstring.cpp
+++ b/indra/llcommon/llstring.cpp
@@ -176,6 +176,7 @@ llutf16string utf8str_to_utf16str ( const LLString& utf8str )
LLWString utf16str_to_wstring(const llutf16string &utf16str, S32 len)
{
LLWString wout;
+ if((len <= 0) || utf16str.empty()) return wout;
S32 i = 0;
// craziness to make gcc happy (llutf16string.c_str() is tweaked on linux):
diff --git a/indra/llmath/lloctree.h b/indra/llmath/lloctree.h
index 69ff43452c..bea21e22c6 100644
--- a/indra/llmath/lloctree.h
+++ b/indra/llmath/lloctree.h
@@ -170,17 +170,10 @@ public:
static void pushCenter(LLVector3d &center, LLVector3d &size, T* data)
{
- LLVector3 pos(data->getPositionGroup());
- F64 p[] =
- {
- (F64) pos.mV[0],
- (F64) pos.mV[1],
- (F64) pos.mV[2]
- };
-
+ LLVector3d pos(data->getPositionGroup());
for (U32 i = 0; i < 3; i++)
{
- if (p[i] > center.mdV[i])
+ if (pos.mdV[i] > center.mdV[i])
{
center.mdV[i] += size.mdV[i];
}
diff --git a/indra/llmessage/message.cpp b/indra/llmessage/message.cpp
index 9e1a0ee12c..ec2f0cd20a 100644
--- a/indra/llmessage/message.cpp
+++ b/indra/llmessage/message.cpp
@@ -5536,13 +5536,21 @@ void LLMessageSystem::getUUID(const char *block, const char *var, LLUUID &u, S32
getDataFast(gMessageStringTable.getString(block), gMessageStringTable.getString(var), u.mData, sizeof(u.mData), blocknum);
}
-bool LLMessageSystem::generateDigestForNumberAndUUIDs(char* digest, const U32 number, const LLUUID &id1, const LLUUID &id2) const
+bool LLMessageSystem::generateDigestForNumberAndUUIDs(
+ char* digest,
+ const U32 number,
+ const LLUUID& id1,
+ const LLUUID& id2) const
{
+ // *NOTE: This method is needlessly inefficient. Instead of
+ // calling LLUUID::asString, it should just call
+ // LLUUID::toString().
+
const char *colon = ":";
char tbuf[16]; /* Flawfinder: ignore */
LLMD5 d;
- LLString id1string = id1.getString();
- LLString id2string = id2.getString();
+ std::string id1string = id1.asString();
+ std::string id2string = id2.asString();
std::string shared_secret = get_shared_secret();
unsigned char * secret = (unsigned char*)shared_secret.c_str();
unsigned char * id1str = (unsigned char*)id1string.c_str();
diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp
index 05163c0782..7c0289b580 100644
--- a/indra/llrender/llfontgl.cpp
+++ b/indra/llrender/llfontgl.cpp
@@ -1311,7 +1311,7 @@ LLString LLFontGL::nameFromFont(const LLFontGL* fontp)
{
if (fontp == sSansSerifHuge)
{
- return LLString("SansSerifHude");
+ return LLString("SansSerifHuge");
}
else if (fontp == sSansSerifSmall)
{
diff --git a/indra/llui/llfloater.cpp b/indra/llui/llfloater.cpp
index f6eb1e8bf8..5d4711ef10 100644
--- a/indra/llui/llfloater.cpp
+++ b/indra/llui/llfloater.cpp
@@ -765,8 +765,6 @@ void LLFloater::setMinimized(BOOL minimize)
if (minimize)
{
- mMinimized = TRUE;
-
mPreviousRect = mRect;
reshape( MINIMIZED_WIDTH, LLFLOATER_HEADER_SIZE, TRUE);
@@ -812,6 +810,8 @@ void LLFloater::setMinimized(BOOL minimize)
++dependent_it;
}
+ mMinimized = TRUE;
+
// Lose keyboard focus when minimized
releaseFocus();
}
@@ -2000,23 +2000,52 @@ void LLFloaterView::focusFrontFloater()
void LLFloaterView::getMinimizePosition(S32 *left, S32 *bottom)
{
- // count the number of minimized children
- S32 count = 0;
- for ( child_list_const_iter_t child_it = getChildList()->begin(); child_it != getChildList()->end(); ++child_it)
- {
- LLView* viewp = *child_it;
- LLFloater *floater = (LLFloater *)viewp;
- if (floater->isMinimized())
- {
- count++;
- }
+ S32 col = 0;
+ LLRect snap_rect_local = getSnapRect();
+ snap_rect_local.translate(-mRect.mLeft, -mRect.mBottom);
+ for(S32 row = snap_rect_local.mBottom;
+ row < snap_rect_local.getHeight() - LLFLOATER_HEADER_SIZE;
+ row += LLFLOATER_HEADER_SIZE ) //loop rows
+ {
+ for(col = snap_rect_local.mLeft;
+ col < snap_rect_local.getWidth() - MINIMIZED_WIDTH;
+ col += MINIMIZED_WIDTH)
+ {
+ bool foundGap = TRUE;
+ for(child_list_const_iter_t child_it = getChildList()->begin();
+ child_it != getChildList()->end();
+ ++child_it) //loop floaters
+ {
+ // Examine minimized children.
+ LLFloater* floater = (LLFloater*)((LLView*)*child_it);
+ if(floater->isMinimized())
+ {
+ LLRect r = floater->getRect();
+ if((r.mBottom < (row + LLFLOATER_HEADER_SIZE))
+ && (r.mBottom > (row - LLFLOATER_HEADER_SIZE))
+ && (r.mLeft < (col + MINIMIZED_WIDTH))
+ && (r.mLeft > (col - MINIMIZED_WIDTH)))
+ {
+ // needs the check for off grid. can't drag,
+ // but window resize makes them off
+ foundGap = FALSE;
+ break;
+ }
+ }
+ } //done floaters
+ if(foundGap)
+ {
+ *left = col;
+ *bottom = row;
+ return; //done
+ }
+ } //done this col
}
- // space over for that many and up if necessary
- S32 tiles_per_row = mRect.getWidth() / MINIMIZED_WIDTH;
-
- *left = (count % tiles_per_row) * MINIMIZED_WIDTH;
- *bottom = (count / tiles_per_row) * LLFLOATER_HEADER_SIZE;
+ // crude - stack'em all at 0,0 when screen is full of minimized
+ // floaters.
+ *left = snap_rect_local.mLeft;
+ *bottom = snap_rect_local.mBottom;
}
diff --git a/indra/llui/llscrolllistctrl.cpp b/indra/llui/llscrolllistctrl.cpp
index d263c25c72..2b7cbe5cef 100644
--- a/indra/llui/llscrolllistctrl.cpp
+++ b/indra/llui/llscrolllistctrl.cpp
@@ -76,7 +76,7 @@ protected:
// LLScrollListIcon
//
LLScrollListIcon::LLScrollListIcon(LLImageGL* icon, S32 width, LLUUID image_id) :
-mIcon(icon), mImageUUID(image_id.getString())
+mIcon(icon), mImageUUID(image_id.asString())
{
if (width)
{
diff --git a/indra/llvfs/llvfs.cpp b/indra/llvfs/llvfs.cpp
index f907fcab45..592f74dd02 100644
--- a/indra/llvfs/llvfs.cpp
+++ b/indra/llvfs/llvfs.cpp
@@ -44,12 +44,11 @@ public:
mLength = size;
}
- static BOOL insertFirstLL(LLVFSBlock *first, LLVFSBlock *second)
+ static bool locationSortPredicate(
+ const LLVFSBlock* lhs,
+ const LLVFSBlock* rhs)
{
- return first->mLocation != second->mLocation
- ? first->mLocation < second->mLocation
- : first->mLength < second->mLength;
-
+ return lhs->mLocation < rhs->mLocation;
}
public:
@@ -362,9 +361,8 @@ LLVFS::LLVFS(const char *index_filename, const char *data_filename, const BOOL r
U8 *tmp_ptr = buffer;
- LLLinkedList<LLVFSBlock> files_by_loc;
- files_by_loc.setInsertBefore(LLVFSBlock::insertFirstLL);
-
+ std::vector<LLVFSFileBlock*> files_by_loc;
+
while (tmp_ptr < buffer + fbuf.st_size)
{
LLVFSFileBlock *block = new LLVFSFileBlock();
@@ -384,7 +382,7 @@ LLVFS::LLVFS(const char *index_filename, const char *data_filename, const BOOL r
block->mFileType < LLAssetType::AT_COUNT)
{
mFileBlocks.insert(fileblock_map::value_type(*block, block));
- files_by_loc.addDataSorted(block);
+ files_by_loc.push_back(block);
}
else
if (block->mLength && block->mSize > 0)
@@ -420,22 +418,40 @@ LLVFS::LLVFS(const char *index_filename, const char *data_filename, const BOOL r
tmp_ptr += block->SERIAL_SIZE;
}
delete[] buffer;
-
- // discover all the free blocks
- LLVFSFileBlock *last_file_block = (LLVFSFileBlock*)files_by_loc.getFirstData();
-
- if (last_file_block)
+
+ std::sort(
+ files_by_loc.begin(),
+ files_by_loc.end(),
+ LLVFSFileBlock::locationSortPredicate);
+
+ // There are 3 cases that have to be considered.
+ // 1. No blocks
+ // 2. One block.
+ // 3. Two or more blocks.
+ if (!files_by_loc.empty())
{
- // check for empty space at the beginning
+ // cur walks through the list.
+ std::vector<LLVFSFileBlock*>::iterator cur = files_by_loc.begin();
+ std::vector<LLVFSFileBlock*>::iterator end = files_by_loc.end();
+ LLVFSFileBlock* last_file_block = *cur;
+
+ // Check to see if there is an empty space before the first file.
if (last_file_block->mLocation > 0)
{
- LLVFSBlock *block = new LLVFSBlock(0, last_file_block->mLocation);
- addFreeBlock(block);
+ // If so, create a free block.
+ addFreeBlock(new LLVFSBlock(0, last_file_block->mLocation));
}
-
- LLVFSFileBlock *cur_file_block;
- while ((cur_file_block = (LLVFSFileBlock*)files_by_loc.getNextData()))
+
+ // Walk through the 2nd+ block. If there is a free space
+ // between cur_file_block and last_file_block, add it to
+ // the free space collection. This block will not need to
+ // run in the case there is only one entry in the VFS.
+ ++cur;
+ while( cur != end )
{
+ LLVFSFileBlock* cur_file_block = *cur;
+
+ // Dupe check on the block
if (cur_file_block->mLocation == last_file_block->mLocation
&& cur_file_block->mLength == last_file_block->mLength)
{
@@ -452,21 +468,29 @@ LLVFS::LLVFS(const char *index_filename, const char *data_filename, const BOOL r
if (cur_file_block->mLength > 0)
{
// convert to hole
- LLVFSBlock* block = new LLVFSBlock(cur_file_block->mLocation,
- cur_file_block->mLength);
- addFreeBlock(block);
+ addFreeBlock(
+ new LLVFSBlock(
+ cur_file_block->mLocation,
+ cur_file_block->mLength));
}
lockData(); // needed for sync()
sync(cur_file_block, TRUE); // remove first on disk
sync(last_file_block, TRUE); // remove last on disk
unlockData(); // needed for sync()
last_file_block = cur_file_block;
+ ++cur;
continue;
}
- U32 loc = last_file_block->mLocation + last_file_block->mLength;
+ // Figure out where the last block ended.
+ U32 loc = last_file_block->mLocation+last_file_block->mLength;
+
+ // Figure out how much space there is between where
+ // the last block ended and this block begins.
S32 length = cur_file_block->mLocation - loc;
+ // Check for more errors... Seeing if the current
+ // entry and the last entry make sense together.
if (length < 0 || loc < 0 || loc > data_size)
{
// Invalid VFS
@@ -488,27 +512,25 @@ LLVFS::LLVFS(const char *index_filename, const char *data_filename, const BOOL r
return;
}
+ // we don't want to add empty blocks to the list...
if (length > 0)
{
- LLVFSBlock *block = new LLVFSBlock(loc, length);
- addFreeBlock(block);
+ addFreeBlock(new LLVFSBlock(loc, length));
}
-
last_file_block = cur_file_block;
+ ++cur;
}
// also note any empty space at the end
U32 loc = last_file_block->mLocation + last_file_block->mLength;
if (loc < data_size)
{
- LLVFSBlock *block = new LLVFSBlock(loc, data_size - loc);
- addFreeBlock(block);
+ addFreeBlock(new LLVFSBlock(loc, data_size - loc));
}
}
- else
+ else // There where no blocks in the file.
{
- LLVFSBlock *first_block = new LLVFSBlock(0, data_size);
- addFreeBlock(first_block);
+ addFreeBlock(new LLVFSBlock(0, data_size));
}
}
else
@@ -1241,6 +1263,7 @@ void LLVFS::eraseBlockLength(LLVFSBlock *block)
S32 length = block->mLength;
blocks_length_map_t::iterator iter = mFreeBlocksByLength.lower_bound(length);
blocks_length_map_t::iterator end = mFreeBlocksByLength.end();
+ bool found_block = false;
while(iter != end)
{
LLVFSBlock *tblock = iter->second;
@@ -1248,11 +1271,12 @@ void LLVFS::eraseBlockLength(LLVFSBlock *block)
if (tblock == block)
{
mFreeBlocksByLength.erase(iter);
+ found_block = true;
break;
}
++iter;
}
- if (iter == end)
+ if(!found_block)
{
llwarns << "eraseBlock could not find block" << llendl;
}
@@ -2044,7 +2068,7 @@ void LLVFS::dumpFiles()
lockData();
LLString extension = get_extension(type);
- LLString filename = id.getString() + extension;
+ LLString filename = id.asString() + extension;
llinfos << " Writing " << filename << llendl;
apr_file_t* file = ll_apr_file_open(filename, LL_APR_WB);
ll_apr_file_write(file, buffer, size);
diff --git a/indra/llwindow/llmousehandler.h b/indra/llwindow/llmousehandler.h
index cdde2ce0e0..e59b5845b0 100644
--- a/indra/llwindow/llmousehandler.h
+++ b/indra/llwindow/llmousehandler.h
@@ -9,6 +9,8 @@
#ifndef LL_MOUSEHANDLER_H
#define LL_MOUSEHANDLER_H
+#include "llstring.h"
+
// Abstract interface.
// Intended for use via multiple inheritance.
// A class may have as many interfaces as it likes, but never needs to inherit one more than once.
diff --git a/indra/llxml/llxmlnode.cpp b/indra/llxml/llxmlnode.cpp
index 0789ec6842..131fb7bb3c 100644
--- a/indra/llxml/llxmlnode.cpp
+++ b/indra/llxml/llxmlnode.cpp
@@ -2275,7 +2275,7 @@ void LLXMLNode::setUUIDValue(U32 length, const LLUUID *array)
LLString new_value;
for (U32 pos=0; pos<length; ++pos)
{
- new_value.append(array[pos].getString());
+ new_value.append(array[pos].asString());
if (pos < length-1) new_value.append(" ");
}
@@ -2877,7 +2877,7 @@ BOOL LLXMLNode::performUnitTest(LLString &error_buffer)
}
if (node_uuid_checksum != uuid_checksum)
{
- error_buffer.append(llformat("ERROR Node %s: UUID checksum mismatch: read %s / calc %s.\n", mName->mString, node_uuid_checksum.getString().c_str(), uuid_checksum.getString().c_str()));
+ error_buffer.append(llformat("ERROR Node %s: UUID checksum mismatch: read %s / calc %s.\n", mName->mString, node_uuid_checksum.asString().c_str(), uuid_checksum.asString().c_str()));
return FALSE;
}
}
diff --git a/indra/lscript/lscript_execute/lscript_execute.cpp b/indra/lscript/lscript_execute/lscript_execute.cpp
index 1cbcdc2c58..e56bfd337c 100644
--- a/indra/lscript/lscript_execute/lscript_execute.cpp
+++ b/indra/lscript/lscript_execute/lscript_execute.cpp
@@ -2577,6 +2577,7 @@ BOOL run_jump(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)
offset += arg;
return FALSE;
}
+
BOOL run_jumpif(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)
{
if (b_print)
@@ -2629,8 +2630,10 @@ BOOL run_jumpif(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)
else if (type == LST_STRING)
{
S32 base_address = lscript_pop_int(buffer);
- // this bit of nastiness is to get around that code paths to local variables can result in lack of initialization
- // and function clean up of ref counts isn't based on scope (a mistake, I know)
+ // this bit of nastiness is to get around that code paths to
+ // local variables can result in lack of initialization and
+ // function clean up of ref counts isn't based on scope (a
+ // mistake, I know)
S32 address = base_address + get_register(buffer, LREG_HR) - 1;
if (address)
{
@@ -2655,8 +2658,10 @@ BOOL run_jumpif(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)
else if (type == LST_KEY)
{
S32 base_address = lscript_pop_int(buffer);
- // this bit of nastiness is to get around that code paths to local variables can result in lack of initialization
- // and function clean up of ref counts isn't based on scope (a mistake, I know)
+ // this bit of nastiness is to get around that code paths to
+ // local variables can result in lack of initialization and
+ // function clean up of ref counts isn't based on scope (a
+ // mistake, I know)
S32 address = base_address + get_register(buffer, LREG_HR) - 1;
if (address)
{
@@ -2672,26 +2677,34 @@ BOOL run_jumpif(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)
if (strlen(sdata)) /*Flawfinder: ignore*/
{
LLUUID id;
- id.set(sdata);
- if (id != LLUUID::null)
+ if (id.set(sdata) && id.notNull())
offset += arg;
}
delete [] sdata;
}
lsa_decrease_ref_count(buffer, base_address);
}
- else if (type == LST_LIST)
+ }
+ else if (type == LST_LIST)
+ {
+ S32 base_address = lscript_pop_int(buffer);
+ S32 address = base_address + get_register(buffer, LREG_HR) - 1;
+ if (address)
{
- S32 address = lscript_pop_int(buffer);
- LLScriptLibData *list = lsa_get_data(buffer, address, TRUE);
- if (list->getListLength())
+ if (safe_heap_check_address(buffer, address + SIZEOF_SCRIPT_ALLOC_ENTRY, 1))
{
- offset += arg;
+ LLScriptLibData *list = lsa_get_list_ptr(buffer, base_address, TRUE);
+ if (list && list->getListLength())
+ {
+ offset += arg;
+ }
+ delete list;
}
}
}
return FALSE;
}
+
BOOL run_jumpnif(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)
{
if (b_print)
@@ -2744,8 +2757,10 @@ BOOL run_jumpnif(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)
else if (type == LST_STRING)
{
S32 base_address = lscript_pop_int(buffer);
- // this bit of nastiness is to get around that code paths to local variables can result in lack of initialization
- // and function clean up of ref counts isn't based on scope (a mistake, I know)
+ // this bit of nastiness is to get around that code paths to
+ // local variables can result in lack of initialization and
+ // function clean up of ref counts isn't based on scope (a
+ // mistake, I know)
S32 address = base_address + get_register(buffer, LREG_HR) - 1;
if (address)
{
@@ -2770,8 +2785,10 @@ BOOL run_jumpnif(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)
else if (type == LST_KEY)
{
S32 base_address = lscript_pop_int(buffer);
- // this bit of nastiness is to get around that code paths to local variables can result in lack of initialization
- // and function clean up of ref counts isn't based on scope (a mistake, I know)
+ // this bit of nastiness is to get around that code paths to
+ // local variables can result in lack of initialization and
+ // function clean up of ref counts isn't based on scope (a
+ // mistake, I know)
S32 address = base_address + get_register(buffer, LREG_HR) - 1;
if (address)
{
@@ -2787,8 +2804,7 @@ BOOL run_jumpnif(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)
if (strlen(sdata)) /*Flawfinder: ignore*/
{
LLUUID id;
- id.set(sdata);
- if (id == LLUUID::null)
+ if (!id.set(sdata) || id.isNull())
offset += arg;
}
else
@@ -2799,13 +2815,25 @@ BOOL run_jumpnif(U8 *buffer, S32 &offset, BOOL b_print, const LLUUID &id)
}
lsa_decrease_ref_count(buffer, base_address);
}
- else if (type == LST_LIST)
+ }
+ else if (type == LST_LIST)
+ {
+ S32 base_address = lscript_pop_int(buffer);
+ // this bit of nastiness is to get around that code paths to
+ // local variables can result in lack of initialization and
+ // function clean up of ref counts isn't based on scope (a
+ // mistake, I know)
+ S32 address = base_address + get_register(buffer, LREG_HR) - 1;
+ if (address)
{
- S32 address = lscript_pop_int(buffer);
- LLScriptLibData *list = lsa_get_data(buffer, address, TRUE);
- if (!list->getListLength())
+ if (safe_heap_check_address(buffer, address + SIZEOF_SCRIPT_ALLOC_ENTRY, 1))
{
- offset += arg;
+ LLScriptLibData *list = lsa_get_list_ptr(buffer, base_address, TRUE);
+ if (!list || !list->getListLength())
+ {
+ offset += arg;
+ }
+ delete list;
}
}
}
diff --git a/indra/lscript/lscript_library/lscript_alloc.cpp b/indra/lscript/lscript_library/lscript_alloc.cpp
index f26fef6d77..d98af1ddf3 100644
--- a/indra/lscript/lscript_library/lscript_alloc.cpp
+++ b/indra/lscript/lscript_library/lscript_alloc.cpp
@@ -982,58 +982,9 @@ S32 lsa_cmp_lists(U8 *buffer, S32 offset1, S32 offset2)
S32 length1 = list1->getListLength();
S32 length2 = list2->getListLength();
-
- if (length1 != length2)
- {
- return length1 - length2;
- }
-
- LLScriptLibData *runner1 = list1;
- LLScriptLibData *runner2 = list2;
-
- S32 count = 0;
-
- while (runner1)
- {
- if (runner1->mType != runner2->mType)
- return count;
-
- switch(runner1->mType)
- {
- case LST_INTEGER:
- if (runner1->mInteger != runner2->mInteger)
- return count;
- break;
- case LST_FLOATINGPOINT:
- if (runner1->mFP != runner2->mFP)
- return count;
- break;
- case LST_KEY:
- if (strcmp(runner1->mKey, runner2->mKey))
- return count;
- break;
- case LST_STRING:
- if (strcmp(runner1->mString, runner2->mString))
- return count;
- break;
- case LST_VECTOR:
- if (runner1->mVec != runner2->mVec)
- return count;
- case LST_QUATERNION:
- if (runner1->mQuat != runner2->mQuat)
- return count;
- break;
- default:
- break;
- }
-
- runner1 = runner1->mListp;
- runner2 = runner2->mListp;
- }
-
delete list1;
delete list2;
- return 0;
+ return length1 - length2;
}
diff --git a/indra/lscript/lscript_library/lscript_library.cpp b/indra/lscript/lscript_library/lscript_library.cpp
index eef3621d47..c0472926df 100644
--- a/indra/lscript/lscript_library/lscript_library.cpp
+++ b/indra/lscript/lscript_library/lscript_library.cpp
@@ -100,7 +100,7 @@ void LLScriptLibrary::init()
addFunction(new LLScriptLibraryFunction(10.f, 0.2f, dummy_func, "llSetTexture", NULL, "si", "llSetTexture(string texture, integer face)\nsets the texture of face"));
addFunction(new LLScriptLibraryFunction(10.f, 0.2f, dummy_func, "llScaleTexture", NULL, "ffi", "llScaleTexture(float scales, float scalet, integer face)\nsets the texture s, t scales for the chosen face"));
addFunction(new LLScriptLibraryFunction(10.f, 0.2f, dummy_func, "llOffsetTexture", NULL, "ffi", "llOffsetTexture(float offsets, float offsett, integer face)\nsets the texture s, t offsets for the chosen face"));
- addFunction(new LLScriptLibraryFunction(10.f, 0.2f, dummy_func, "llRotateTexture", NULL, "fi", "llOffsetTexture(float rotation, integer face)\nsets the texture rotation for the chosen face"));
+ addFunction(new LLScriptLibraryFunction(10.f, 0.2f, dummy_func, "llRotateTexture", NULL, "fi", "llRotateTexture(float rotation, integer face)\nsets the texture rotation for the chosen face"));
addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "llGetTexture", "s", "i", "string llGetTexture(integer face)\ngets the texture of face (if it's a texture in the object inventory, otherwise the key in a string)"));
addFunction(new LLScriptLibraryFunction(10.f, 0.2f, dummy_func, "llSetPos", NULL, "v", "llSetPos(vector pos)\nsets the position (if the script isn't physical)"));
addFunction(new LLScriptLibraryFunction(10.f, 0.f, dummy_func, "llGetPos", "v", NULL, "vector llGetPos()\ngets the position (if the script isn't physical)"));
diff --git a/indra/newview/llcurrencyuimanager.cpp b/indra/newview/llcurrencyuimanager.cpp
index ffea2928c2..96c7f70929 100644
--- a/indra/newview/llcurrencyuimanager.cpp
+++ b/indra/newview/llcurrencyuimanager.cpp
@@ -125,10 +125,10 @@ void LLCurrencyUIManager::Impl::updateCurrencyInfo()
}
LLXMLRPCValue keywordArgs = LLXMLRPCValue::createStruct();
- keywordArgs.appendString("agentId",
- gAgent.getID().getString());
- keywordArgs.appendString("secureSessionId",
- gAgent.getSecureSessionID().getString());
+ keywordArgs.appendString("agentId", gAgent.getID().asString());
+ keywordArgs.appendString(
+ "secureSessionId",
+ gAgent.getSecureSessionID().asString());
keywordArgs.appendInt("currencyBuy", mUserCurrencyBuy);
LLXMLRPCValue params = LLXMLRPCValue::createArray();
@@ -172,10 +172,10 @@ void LLCurrencyUIManager::Impl::startCurrencyBuy(const std::string& password)
mCurrencyChanged = false;
LLXMLRPCValue keywordArgs = LLXMLRPCValue::createStruct();
- keywordArgs.appendString("agentId",
- gAgent.getID().getString());
- keywordArgs.appendString("secureSessionId",
- gAgent.getSecureSessionID().getString());
+ keywordArgs.appendString("agentId", gAgent.getID().asString());
+ keywordArgs.appendString(
+ "secureSessionId",
+ gAgent.getSecureSessionID().asString());
keywordArgs.appendInt("currencyBuy", mUserCurrencyBuy);
keywordArgs.appendInt("estimatedCost", mSiteCurrencyEstimatedCost);
keywordArgs.appendString("confirm", mSiteConfirm);
diff --git a/indra/newview/llfloateravatartextures.cpp b/indra/newview/llfloateravatartextures.cpp
index 76e096f0a3..293bf61a0d 100644
--- a/indra/newview/llfloateravatartextures.cpp
+++ b/indra/newview/llfloateravatartextures.cpp
@@ -91,7 +91,7 @@ static void update_texture_ctrl(LLVOAvatar* avatarp,
else
{
ctrl->setImageAssetID(id);
- ctrl->setToolTip(id.getString());
+ ctrl->setToolTip(id.asString());
}
}
@@ -156,7 +156,7 @@ void LLFloaterAvatarTextures::refresh()
}
else
{
- setTitle(mTitle + ": INVALID AVATAR (" + mID.getString() + ")");
+ setTitle(mTitle + ": INVALID AVATAR (" + mID.asString() + ")");
}
#endif
}
diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp
index 189c60132e..c3b2ae70e7 100644
--- a/indra/newview/llfloaterbuyland.cpp
+++ b/indra/newview/llfloaterbuyland.cpp
@@ -406,7 +406,18 @@ void LLFloaterBuyLandUI::updateParcelInfo()
mParcelBillableArea =
llround(mRegion->getBillableFactor() * mParcelActualArea);
- mParcelSupportedObjects = mParcel->getMaxPrimCapacity();
+ mParcelSupportedObjects = llround(
+ mParcel->getMaxPrimCapacity() * mParcel->getParcelPrimBonus());
+ // Can't have more than region max tasks, regardless of parcel
+ // object bonus factor.
+ LLViewerRegion* region = gParcelMgr->getSelectionRegion();
+ if(region)
+ {
+ S32 max_tasks_per_region = (S32)region->getMaxTasks();
+ mParcelSupportedObjects = llmin(
+ mParcelSupportedObjects, max_tasks_per_region);
+ }
+
mParcelSoldWithObjects = mParcel->getSellWithObjects();
LLVector3 center = mParcel->getCenterpoint();
@@ -665,9 +676,10 @@ void LLFloaterBuyLandUI::updateWebSiteInfo()
#endif
LLXMLRPCValue keywordArgs = LLXMLRPCValue::createStruct();
- keywordArgs.appendString("agentId", gAgent.getID().getString());
- keywordArgs.appendString("secureSessionId",
- gAgent.getSecureSessionID().getString());
+ keywordArgs.appendString("agentId", gAgent.getID().asString());
+ keywordArgs.appendString(
+ "secureSessionId",
+ gAgent.getSecureSessionID().asString());
keywordArgs.appendInt("billableArea", mPreflightAskBillableArea);
keywordArgs.appendInt("currencyBuy", mPreflightAskCurrencyBuy);
@@ -752,9 +764,10 @@ void LLFloaterBuyLandUI::runWebSitePrep(const std::string& password)
}
LLXMLRPCValue keywordArgs = LLXMLRPCValue::createStruct();
- keywordArgs.appendString("agentId", gAgent.getID().getString());
- keywordArgs.appendString("secureSessionId",
- gAgent.getSecureSessionID().getString());
+ keywordArgs.appendString("agentId", gAgent.getID().asString());
+ keywordArgs.appendString(
+ "secureSessionId",
+ gAgent.getSecureSessionID().asString());
keywordArgs.appendString("levelId", newLevel);
keywordArgs.appendInt("billableArea",
mIsForGroup ? 0 : mParcelBillableArea);
diff --git a/indra/newview/llfloaterfriends.cpp b/indra/newview/llfloaterfriends.cpp
index a910e1a12a..6f31cbb3a0 100644
--- a/indra/newview/llfloaterfriends.cpp
+++ b/indra/newview/llfloaterfriends.cpp
@@ -518,8 +518,7 @@ void LLFloaterFriends::requestFriendship(const LLUUID& target_id, const LLString
{
// HACK: folder id stored as "message"
LLUUID calling_card_folder_id = gInventory.findCategoryUUIDForType(LLAssetType::AT_CALLINGCARD);
- std::string message = calling_card_folder_id.getString();
-
+ std::string message = calling_card_folder_id.asString();
send_improved_im(target_id,
target_name.c_str(),
message.c_str(),
diff --git a/indra/newview/llfloatergodtools.cpp b/indra/newview/llfloatergodtools.cpp
index 45cf356a52..7096f5dbf6 100644
--- a/indra/newview/llfloatergodtools.cpp
+++ b/indra/newview/llfloatergodtools.cpp
@@ -971,7 +971,7 @@ void LLPanelGridTools::flushMapVisibilityCachesConfirm(S32 option, void* data)
msg->addString("Method", "refreshmapvisibility");
msg->addUUID("Invoice", LLUUID::null);
msg->nextBlock("ParamList");
- msg->addString("Parameter", gAgent.getID().getString());
+ msg->addString("Parameter", gAgent.getID().asString());
gAgent.sendReliableMessage();
}
diff --git a/indra/newview/llfloaterregioninfo.cpp b/indra/newview/llfloaterregioninfo.cpp
index 55b3ee185b..2857339db3 100644
--- a/indra/newview/llfloaterregioninfo.cpp
+++ b/indra/newview/llfloaterregioninfo.cpp
@@ -2627,7 +2627,7 @@ void LLPanelEstateCovenant::sendChangeCovenantID(const LLUUID &asset_id)
msg->addUUID("Invoice", LLFloaterRegionInfo::getLastInvoice());
msg->nextBlock("ParamList");
- msg->addString("Parameter", getCovenantID().getString().c_str());
+ msg->addString("Parameter", getCovenantID().asString());
gAgent.sendReliableMessage();
}
}
diff --git a/indra/newview/llfloatertopobjects.cpp b/indra/newview/llfloatertopobjects.cpp
index 8e24864880..90490f6f9b 100644
--- a/indra/newview/llfloatertopobjects.cpp
+++ b/indra/newview/llfloatertopobjects.cpp
@@ -231,7 +231,7 @@ void LLFloaterTopObjects::updateSelectionInfo()
LLUUID object_id = list->getCurrentID();
if (object_id.isNull()) return;
- LLString object_id_string = object_id.getString();
+ std::string object_id_string = object_id.asString();
childSetValue("id_editor", LLSD(object_id_string));
childSetValue("object_name_editor", list->getFirstSelected()->getColumn(1)->getText());
diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp
index 74600a262a..3cd4082829 100644
--- a/indra/newview/llpanelclassified.cpp
+++ b/indra/newview/llpanelclassified.cpp
@@ -785,7 +785,7 @@ void LLPanelClassified::sendClassifiedClickMessage(const char* type)
// You're allowed to click on your own ads to reassure yourself
// that the system is working.
std::vector<std::string> strings;
- strings.push_back(mClassifiedID.getString());
+ strings.push_back(mClassifiedID.asString());
strings.push_back(type);
LLUUID no_invoice;
send_generic_message("classifiedclick", strings, no_invoice);
diff --git a/indra/newview/llpanelgroupgeneral.cpp b/indra/newview/llpanelgroupgeneral.cpp
index 06a7598918..10db68d448 100644
--- a/indra/newview/llpanelgroupgeneral.cpp
+++ b/indra/newview/llpanelgroupgeneral.cpp
@@ -433,7 +433,7 @@ bool LLPanelGroupGeneral::apply(LLString& mesg)
if (!gdatap)
{
mesg = "No group data found for group ";
- mesg.append(mGroupID.getString());
+ mesg.append(mGroupID.asString());
return false;
}
diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp
index 1cef8153b8..9f2d9cf909 100644
--- a/indra/newview/llpanelgroupnotices.cpp
+++ b/indra/newview/llpanelgroupnotices.cpp
@@ -503,7 +503,7 @@ void LLPanelGroupNotices::onSelectNotice(LLUICtrl* ctrl, void* data)
msg->addUUID("GroupNoticeID",item->getUUID());
gAgent.sendReliableMessage();
- lldebugs << "Item " << item->getUUID().getString().c_str() << " selected." << llendl;
+ lldebugs << "Item " << item->getUUID() << " selected." << llendl;
}
void LLPanelGroupNotices::showNotice(const char* subject,
diff --git a/indra/newview/llpanelpick.cpp b/indra/newview/llpanelpick.cpp
index 6c5dcc1f45..ab2a298a06 100644
--- a/indra/newview/llpanelpick.cpp
+++ b/indra/newview/llpanelpick.cpp
@@ -488,7 +488,7 @@ void LLPanelPick::onCommitAny(LLUICtrl* ctrl, void* data)
else
{*/
LLTabContainerVertical* tab = (LLTabContainerVertical*)self->getParent();
- tab->setCurrentTabName(self->mNameEditor->getText());
+ if(tab) tab->setCurrentTabName(self->mNameEditor->getText());
//}
}
}
diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp
index 50f6d115bd..3ae4ba9107 100644
--- a/indra/newview/llselectmgr.cpp
+++ b/indra/newview/llselectmgr.cpp
@@ -6343,13 +6343,17 @@ void LLSelectNodeList::addNodeAtEnd(LLSelectNode *nodep)
void LLSelectNodeList::removeNode(LLSelectNode *nodep)
{
- std::list<LLSelectNode*>::iterator iter;
- for (iter = begin(); iter != end(); ++iter)
+ std::list<LLSelectNode*>::iterator iter = begin();
+ while(iter != end())
{
if ((*iter) == nodep)
{
mSelectNodeMap.erase(nodep->getObject());
- erase(iter++);
+ iter = erase(iter);
+ }
+ else
+ {
+ ++iter;
}
}
}
diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp
index be33de3cca..5eae8c2ff1 100644
--- a/indra/newview/lltexturectrl.cpp
+++ b/indra/newview/lltexturectrl.cpp
@@ -319,7 +319,8 @@ void LLFloaterTexturePicker::updateImageStats()
}
if (gAgent.isGodlike())
{
- LLString tstring = "Pick: " + mTexturep->getID().getString();
+ LLString tstring = "Pick: ";
+ tstring.append(mTexturep->getID().asString());
setTitle(tstring);
}
}
diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp
index ea1284117d..94b549b8e6 100644
--- a/indra/newview/lltooldraganddrop.cpp
+++ b/indra/newview/lltooldraganddrop.cpp
@@ -582,6 +582,7 @@ LLToolDragAndDrop::LLToolDragAndDrop()
LLTool("draganddrop", NULL),
mDragStartX(0),
mDragStartY(0),
+ mSource(SOURCE_AGENT),
mCursor(UI_CURSOR_NO),
mLastAccept(ACCEPT_NO),
mDrop(FALSE),
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index 49578b186d..838bf68f3d 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -2124,7 +2124,7 @@ class LLAvatarDebug : public view_listener_t
}
llinfos << "Dumping temporary asset data to simulator logs for avatar " << avatar->getID() << llendl;
std::vector<std::string> strings;
- strings.push_back( avatar->getID().getString() );
+ strings.push_back(avatar->getID().asString());
LLUUID invoice;
send_generic_message("dumptempassetdata", strings, invoice);
LLFloaterAvatarTextures::show( avatar->getID() );
@@ -7431,7 +7431,7 @@ void handle_selected_texture_info(void*)
std::string image_id_string;
if (gAgent.isGodlike())
{
- image_id_string = image_id.getString() + " ";
+ image_id_string = image_id.asString() + " ";
}
msg = llformat("%s%dx%d %s on face ",
image_id_string.c_str(),
@@ -8246,7 +8246,9 @@ BOOL LLViewerMenuHolderGL::hideMenus()
if (handled)
{
gSelectMgr->deselectTransient();
- if (!gFloaterTools->getVisible() && !LLFloaterLand::floaterVisible())
+ if(!gFloaterTools->getVisible()
+ && !LLFloaterLand::floaterVisible()
+ && !LLFloaterBuyLand::isOpen())
{
gParcelMgr->deselectLand();
}
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 71e3b5dded..f402fc320b 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -1621,7 +1621,17 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
}
break;
case IM_BUSY_AUTO_RESPONSE:
- gIMView->addMessage(session_id, from_id, name, message);
+ // fix for JIRA issue VWR-20 submitted 13-JAN-2007 - Paul Churchill
+ if (is_muted)
+ {
+ lldebugs << "Ignoring busy response from " << from_id << llendl;
+ return;
+ }
+ else
+ {
+ // original code resumes
+ gIMView->addMessage(session_id, from_id, name, message);
+ }
break;
case IM_LURE_USER:
@@ -1722,7 +1732,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
LLAvatarTracker::formFriendship(from_id);
std::vector<std::string> strings;
- strings.push_back( from_id.getString() );
+ strings.push_back(from_id.asString());
send_generic_message("requestonlinenotification", strings);
args["[NAME]"] = name;
diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp
index a31708a621..81576bd5fc 100644
--- a/indra/newview/llviewerparcelmgr.cpp
+++ b/indra/newview/llviewerparcelmgr.cpp
@@ -698,9 +698,10 @@ BOOL LLViewerParcelMgr::agentCanBuild() const
{
if (mAgentParcel)
{
- return gAgent.isGodlike()
- || (mAgentParcel->getOwnerID() == gAgent.getID())
- || (mAgentParcel->getAllowModify());
+ return (gAgent.isGodlike()
+ || (mAgentParcel->allowModifyBy(
+ gAgent.getID(),
+ gAgent.getGroupID())));
}
else
{
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index efcd36af0a..b21df05afe 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -2988,14 +2988,24 @@ void LLVOAvatar::updateCharacter(LLAgent &agent)
{
if (motionp->getMinPixelArea() < getPixelArea())
{
- char output[256]; /* Flawfinder: ignore */
+ char output[MAX_STRING]; /* Flawfinder: ignore */
if (motionp->getName().empty())
{
- snprintf(output, sizeof(output), "%s - %d", motionp->getID().getString().c_str(), (U32)motionp->getPriority()); /* Flawfinder: ignore */
+ snprintf( /* Flawfinder: ignore */
+ output,
+ MAX_STRING,
+ "%s - %d",
+ motionp->getID().asString().c_str(),
+ (U32)motionp->getPriority());
}
else
{
- snprintf(output, sizeof(output), "%s - %d", motionp->getName().c_str(), (U32)motionp->getPriority()); /* Flawfinder: ignore */
+ snprintf( /* Flawfinder: ignore */
+ output,
+ MAX_STRING,
+ "%s - %d",
+ motionp->getName().c_str(),
+ (U32)motionp->getPriority());
}
addDebugText(output);
}
@@ -3948,9 +3958,10 @@ void LLVOAvatar::updateTextures(LLAgent &agent)
&& imagep->getID() != IMG_DEFAULT_AVATAR
&& !imagep->getTargetHost().isOk())
{
- llwarns << "LLVOAvatar::updateTextures No host for texture " << imagep->getID()
- << " for avatar " << (mIsSelf ? "<myself>" : getID().getString())
- << " on host " << getRegion()->getHost() << llendl;
+ llwarns << "LLVOAvatar::updateTextures No host for texture "
+ << imagep->getID() << " for avatar "
+ << (mIsSelf ? "<myself>" : getID().asString().c_str())
+ << " on host " << getRegion()->getHost() << llendl;
}
switch( i )
diff --git a/indra/test/llhttpclient_tut.cpp b/indra/test/llhttpclient_tut.cpp
index 40cde1fd6c..43ef6f4438 100644
--- a/indra/test/llhttpclient_tut.cpp
+++ b/indra/test/llhttpclient_tut.cpp
@@ -13,8 +13,8 @@
*/
#include <tut/tut.h>
+#include "linden_common.h"
#include "lltut.h"
-
#include "llhttpclient.h"
#include "llformat.h"
#include "llpipeutil.h"
diff --git a/indra/test/llpipeutil.cpp b/indra/test/llpipeutil.cpp
index f4b1b28c1d..773a967681 100644
--- a/indra/test/llpipeutil.cpp
+++ b/indra/test/llpipeutil.cpp
@@ -7,6 +7,8 @@
* $License$
*/
+
+#include "linden_common.h"
#include "llpipeutil.h"
#include <stdlib.h>
diff --git a/indra/test/llsd_new_tut.cpp b/indra/test/llsd_new_tut.cpp
index 6a38a1a8ea..2354698239 100644
--- a/indra/test/llsd_new_tut.cpp
+++ b/indra/test/llsd_new_tut.cpp
@@ -9,6 +9,7 @@
#include <math.h>
#include <tut/tut.h>
+#include "linden_common.h"
#include "lltut.h"
#include "llsd.h"
diff --git a/indra/test/lltut.cpp b/indra/test/lltut.cpp
index 592d61137d..5a6ccabec2 100644
--- a/indra/test/lltut.cpp
+++ b/indra/test/lltut.cpp
@@ -8,6 +8,7 @@
* $License$
*/
+#include "linden_common.h"
#include "lltut.h"
#include "llformat.h"