diff --git a/indra/newview/fsareasearch.cpp b/indra/newview/fsareasearch.cpp
index 8f2d113217..8fc1699282 100644
--- a/indra/newview/fsareasearch.cpp
+++ b/indra/newview/fsareasearch.cpp
@@ -81,6 +81,13 @@ const F32 MIN_DISTANCE_MOVED = 1.0f;
// timeout to resend object properties request again
const F32 REQUEST_TIMEOUT = 30.0f;
+std::string RLVa_hideNameIfRestricted(std::string const &name)
+{
+ if (!gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
+ return name;
+ else
+ return RlvStrings::getAnonym(name);
+}
F32 calculateObjectDistance(LLVector3d agent_pos, LLViewerObject* object)
{
@@ -907,10 +914,13 @@ void FSAreaSearch::matchObject(FSObjectProperties& details, LLViewerObject* obje
std::string object_description = details.description;
details.name_requested = false;
- getNameFromUUID(details.ownership_id, true, owner_name, details.group_owned, details.name_requested);
- getNameFromUUID(details.creator_id, false, creator_name, false, details.name_requested);
- getNameFromUUID(details.last_owner_id, false, last_owner_name, false, details.name_requested);
- getNameFromUUID(details.group_id, false, group_name, true, details.name_requested);
+ getNameFromUUID(details.ownership_id, owner_name, details.group_owned, details.name_requested);
+ getNameFromUUID(details.creator_id, creator_name, false, details.name_requested);
+ getNameFromUUID(details.last_owner_id, last_owner_name, false, details.name_requested);
+ getNameFromUUID(details.group_id, group_name, true, details.name_requested);
+
+ owner_name = RLVa_hideNameIfRestricted(owner_name);
+ last_owner_name = RLVa_hideNameIfRestricted(last_owner_name);
if (mRegexSearch)
{
@@ -1042,7 +1052,7 @@ void FSAreaSearch::matchObject(FSObjectProperties& details, LLViewerObject* obje
cell_params.column = "owner";
cell_params.value = owner_name;
- row_params.columns.add(cell_params);
+ row_params.columns.add(cell_params);
cell_params.column = "group";
cell_params.value = group_name;
@@ -1105,7 +1115,7 @@ void FSAreaSearch::updateObjectCosts(const LLUUID& object_id, F32 object_cost, F
}
}
-void FSAreaSearch::getNameFromUUID(const LLUUID& id, bool needs_rlva_check, std::string& name, bool group, bool& name_requested)
+void FSAreaSearch::getNameFromUUID(const LLUUID& id, std::string& name, bool group, bool& name_requested)
{
static const std::string unknown_name = LLTrans::getString("AvatarNameWaiting");
@@ -1127,46 +1137,28 @@ void FSAreaSearch::getNameFromUUID(const LLUUID& id, bool needs_rlva_check, std:
else
{
LLAvatarName av_name;
- if (LLAvatarNameCache::get(id, &av_name))
- {
- if (!needs_rlva_check || !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
- {
- name = av_name.getCompleteName();
- }
- else
- {
- name = RlvStrings::getAnonym(av_name);
- }
- }
- else
+ if (!LLAvatarNameCache::get(id, &av_name))
{
name = unknown_name;
if (std::find(mNamesRequested.begin(), mNamesRequested.end(), id) == mNamesRequested.end())
{
mNamesRequested.push_back(id);
- boost::signals2::connection cb_connection = LLAvatarNameCache::get(id, boost::bind(&FSAreaSearch::avatarNameCacheCallback, this, _1, _2, needs_rlva_check));
+ boost::signals2::connection cb_connection = LLAvatarNameCache::get(id, boost::bind(&FSAreaSearch::avatarNameCacheCallback, this, _1, _2));
mNameCacheConnections.insert(std::make_pair(id, cb_connection)); // mNamesRequested will do the dupe check
}
name_requested = true;
}
+ else
+ name = av_name.getCompleteName();
}
}
-void FSAreaSearch::avatarNameCacheCallback(const LLUUID& id, const LLAvatarName& av_name, bool needs_rlva_check)
+void FSAreaSearch::avatarNameCacheCallback(const LLUUID& id, const LLAvatarName& av_name)
{
- std::string name;
- if (!needs_rlva_check || !gRlvHandler.hasBehaviour(RLV_BHVR_SHOWNAMES))
- {
- name = av_name.getCompleteName();
- }
- else
- {
- name = RlvStrings::getAnonym(av_name);
- }
- callbackLoadFullName(id, name);
+ callbackLoadFullName(id, av_name.getCompleteName());
}
-void FSAreaSearch::callbackLoadFullName(const LLUUID& id, const std::string& full_name)
+void FSAreaSearch::callbackLoadFullName(const LLUUID& id, const std::string& full_name )
{
auto iter = mNameCacheConnections.find(id);
if (iter != mNameCacheConnections.end())
@@ -1193,7 +1185,7 @@ void FSAreaSearch::callbackLoadFullName(const LLUUID& id, const std::string& ful
}
}
- mPanelList->updateName(id, full_name);
+ mPanelList->updateName(id, full_name);
}
void FSAreaSearch::updateCounterText()
@@ -1613,7 +1605,7 @@ void FSPanelAreaSearchList::updateName(const LLUUID& id, const std::string& name
if (owner_column && (id == details.owner_id))
{
LLScrollListText* owner_text = (LLScrollListText*)item->getColumn(owner_column->mIndex);
- owner_text->setText(name);
+ owner_text->setText(RLVa_hideNameIfRestricted(name));
mResultList->setNeedsSort();
}
@@ -1627,7 +1619,7 @@ void FSPanelAreaSearchList::updateName(const LLUUID& id, const std::string& name
if (last_owner_column && (id == details.last_owner_id))
{
LLScrollListText* last_owner_text = (LLScrollListText*)item->getColumn(last_owner_column->mIndex);
- last_owner_text->setText(name);
+ last_owner_text->setText(RLVa_hideNameIfRestricted(name));
mResultList->setNeedsSort();
}
}
diff --git a/indra/newview/fsareasearch.h b/indra/newview/fsareasearch.h
index 00c8e36444..9ffdcb4499 100644
--- a/indra/newview/fsareasearch.h
+++ b/indra/newview/fsareasearch.h
@@ -114,7 +114,7 @@ public:
virtual void draw();
virtual void onOpen(const LLSD& key);
- void avatarNameCacheCallback(const LLUUID& id, const LLAvatarName& av_name, bool needs_rlva_check);
+ void avatarNameCacheCallback(const LLUUID& id, const LLAvatarName& av_name);
void callbackLoadFullName(const LLUUID& id, const std::string& full_name);
void processObjectProperties(LLMessageSystem* msg);
void updateObjectCosts(const LLUUID& object_id, F32 object_cost, F32 link_cost, F32 physics_cost, F32 link_physics_cost);
@@ -172,7 +172,7 @@ public:
private:
void requestObjectProperties(const std::vector< U32 >& request_list, bool select, LLViewerRegion* regionp);
void matchObject(FSObjectProperties& details, LLViewerObject* objectp);
- void getNameFromUUID(const LLUUID& id, bool needs_rvla_check, std::string& name, bool group, bool& name_requested);
+ void getNameFromUUID(const LLUUID& id, std::string& name, bool group, bool& name_requested);
void updateCounterText();
bool regexTest(std::string text);
diff --git a/indra/newview/fslslpreproc.cpp b/indra/newview/fslslpreproc.cpp
index b2e815df0a..12f46fa2eb 100644
--- a/indra/newview/fslslpreproc.cpp
+++ b/indra/newview/fslslpreproc.cpp
@@ -1540,6 +1540,22 @@ void FSLSLPreprocessor::start_process()
}
}
}
+ else
+ {
+ // FIRE-31718: Preprocessor crashes viewer on recursive #include
+
+ // Truncate the resulting preprocessed script to something the text field can handle without
+ // freezing for so long the viewer disconnects. The usual script source code limit is 64kB so
+ // let's play it safe and allow twice as much here. The script is most likely already unusable
+ // at this point due to the preprocessor bailing out with an error earlier, so a truncated
+ // version doesn't hurt more than it already did.
+ if (output.size() > 128 * 1024)
+ {
+ output.resize(128 * 1024);
+ display_error(LLTrans::getString("fs_preprocessor_truncated"));
+ }
+ }
+
if (!errored)
{
if (preprocessor_enabled && use_compression)
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index 1bb601594d..25351fe5be 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -12097,7 +12097,7 @@ void LLVOAvatar::calculateUpdateRenderComplexity()
// place in the code. For now, this is a good spot as the complexity calculation
// gets updated when rigging data arrives, so we can reliably identify rigged
// attachments where the skinning information took a while to load.
- if (attached_object->isHUDAttachment() && attached_object->mCheckRigOnHUD)
+ if (attached_object->isHUDAttachment() && attached_object->mCheckRigOnHUD && !attached_object->isTempAttachment())
{
// check if the root object is rigged
bool is_rigged = attached_object->isRiggedMesh();
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index eb7e2b539c..ed1376612d 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -7038,6 +7038,9 @@ Ihre aktuelle Position: [AVATAR_POS]
Fehler beim Cachen der eingebundenen Datei „[FILENAME]“.
+
+ Achtung: Präprozessor-Ausgabe wurde aufgrund exzessiver Textlänge gekürzt. Das Skript wird wahrscheinlich nicht funktionieren.
+
Vor [SECONDS] Sekunden
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 722bc66f90..4ecb7e2744 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -3153,6 +3153,7 @@ Your current position: [AVATAR_POS]
Caching completed for '[FILENAME]'
Error: script named '[FILENAME]' isn't safe to copy to the filesystem. This include will fail.
Error caching included file '[FILENAME]'
+ Warning: Preprocessor output truncated due to excessive script text size. This script will most likely not work.
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index bcb9e148b9..95f2764cca 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -6824,6 +6824,78 @@ Votre position actuelle : [AVATAR_POS]
Détection de la directive compile-as-Mono outrepassant les préférences.
+
+
+ Optimisation des fonctions définies par l'utilisateur et des variables globales non référencées.
+
+
+ Expression régulière non valide : '[WHAT]' ; optimisation LSL ignorée.
+
+
+ Exception détectée : '[WHAT]' ; optimisation LSL sautée.
+
+
+ Exception inattendue dans l'optimiseur LSL ; non appliquée.
+
+
+
+ Compression du texte du script en supprimant les espaces inutiles.
+
+
+ Expression régulière non valide : '[WHAT]' ; la compression LSL est ignorée.
+
+
+ Exception interceptée : '[WHAT]' ; la compression LSL est ignorée.
+
+
+ Exception inattendue dans le compresseur LSL ; non appliquée.
+
+
+
+ Appliquer la conversion de liste paresseuse.
+
+
+ Pas une expression régulière valide : '[WHAT]' ; Le convertisseur de liste paresseux a été ignoré.
+
+
+ Exception interceptée : '[WHAT]' ; le convertisseur de liste paresseux a été ignoré.
+
+
+ Exception inattendue dans le convertisseur de liste paresseux ; non appliquée.
+
+
+
+ Application de la conversion des instructions de commutation.
+
+
+ Expression régulière non valide : '[WHAT]' ; Le convertisseur d'instruction de commutation a été ignoré.
+
+
+ Exception interceptée : '[WHAT]' ; Le convertisseur d'instruction de commutation a été ignoré.
+
+
+ Exception inattendue dans le convertisseur d'instruction de commutation ; non appliquée.
+
+
+
+ Mise en cache du fichier inclus : '[FILENAME]'.
+
+
+ Le fichier inclus '[FILENAME]' a changé, remise en cache.
+
+
+ La mise en cache est terminée pour '[FILENAME]'.
+
+
+ Erreur : le script nommé '[FILENAME]' n'est pas fiable pour être copié dans le système de fichiers. Cet include échouera.
+
+
+ Erreur de mise en cache du fichier inclus '[FILENAME]'.
+
+
+ Avertissement : La sortie du préprocesseur a été tronquée en raison de la taille excessive du texte du script. Ce script ne fonctionnera probablement pas.
+
+
diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml
index 5e6b5eabed..a29a537079 100644
--- a/indra/newview/skins/default/xui/pl/strings.xml
+++ b/indra/newview/skins/default/xui/pl/strings.xml
@@ -6329,6 +6329,9 @@ Twoja aktualna pozycja: [AVATAR_POS]
Błąd podczas buforowania pliku '[FILENAME]'
+
+ Uwaga: Dane wyjściowe preprocesora zostały skrócone z powodu zbyt dużego rozmiaru tekstu skryptu - prawdopodobnie nie zadziała.
+
[SECONDS] sekund temu
diff --git a/indra/newview/skins/default/xui/ru/strings.xml b/indra/newview/skins/default/xui/ru/strings.xml
index 4d13964120..a760d0a492 100644
--- a/indra/newview/skins/default/xui/ru/strings.xml
+++ b/indra/newview/skins/default/xui/ru/strings.xml
@@ -6626,6 +6626,9 @@ ID объекта: [INSPECTING_KEY]
Ошибка кэширования подключенного файла '[FILENAME]'
+
+ Предупреждение: Выходные данные препроцессора усечены из-за чрезмерного размера текста скрипта. Этот скрипт, скорее всего, не будет работать.
+
[SECONDS] секунд назад