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] секунд назад