Skip to content

Commit

Permalink
Fix TrackCache memory crash
Browse files Browse the repository at this point in the history
  • Loading branch information
KoBeWi committed Nov 23, 2023
1 parent bb63963 commit 8f63b3e
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 7 deletions.
65 changes: 65 additions & 0 deletions scene/animation/animation_mixer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2138,3 +2138,68 @@ AnimationMixer::AnimationMixer() {

AnimationMixer::~AnimationMixer() {
}

void AnimatedValuesBackup::set_data(const HashMap<NodePath, AnimationMixer::TrackCache *> p_data) {
clear_data();

for (const KeyValue<NodePath, AnimationMixer::TrackCache *> &E : p_data) {
data.insert(E.key, get_cache_copy(E.value));
}
}

HashMap<NodePath, AnimationMixer::TrackCache *> AnimatedValuesBackup::get_data() const {
HashMap<NodePath, AnimationMixer::TrackCache *> ret;
for (const KeyValue<NodePath, AnimationMixer::TrackCache *> &E : data) {
ret.insert(E.key, get_cache_copy(E.value));
}
return ret;
}

void AnimatedValuesBackup::clear_data() {
for (KeyValue<NodePath, AnimationMixer::TrackCache *> &K : data) {
memdelete(K.value);
}
data.clear();
}

AnimationMixer::TrackCache *AnimatedValuesBackup::get_cache_copy(AnimationMixer::TrackCache *p_cache) const {
switch (p_cache->type) {

Check failure on line 2166 in scene/animation/animation_mixer.cpp

View workflow job for this annotation

GitHub Actions / 🐧 Linux / Editor w/ Mono (target=editor)

enumeration value 'TYPE_METHOD' not handled in switch [-Werror=switch]

Check failure on line 2166 in scene/animation/animation_mixer.cpp

View workflow job for this annotation

GitHub Actions / 🐧 Linux / Editor w/ Mono (target=editor)

enumeration value 'TYPE_ANIMATION' not handled in switch [-Werror=switch]

Check failure on line 2166 in scene/animation/animation_mixer.cpp

View workflow job for this annotation

GitHub Actions / 🐧 Linux / Editor with doubles and GCC sanitizers (target=editor, tests=yes, dev_build=yes, scu_build=yes, precision=double, use_asan=yes, use_ubsan=yes, linker=gold)

enumeration value 'TYPE_METHOD' not handled in switch [-Werror=switch]

Check failure on line 2166 in scene/animation/animation_mixer.cpp

View workflow job for this annotation

GitHub Actions / 🐧 Linux / Editor with doubles and GCC sanitizers (target=editor, tests=yes, dev_build=yes, scu_build=yes, precision=double, use_asan=yes, use_ubsan=yes, linker=gold)

enumeration value 'TYPE_ANIMATION' not handled in switch [-Werror=switch]

Check failure on line 2166 in scene/animation/animation_mixer.cpp

View workflow job for this annotation

GitHub Actions / 🐧 Linux / Editor with clang sanitizers (target=editor, tests=yes, dev_build=yes, use_asan=yes, use_ubsan=yes, use_llvm=yes, linker=lld)

enumeration values 'TYPE_METHOD' and 'TYPE_ANIMATION' not handled in switch [-Werror,-Wswitch]

Check failure on line 2166 in scene/animation/animation_mixer.cpp

View workflow job for this annotation

GitHub Actions / 🐧 Linux / Editor with ThreadSanitizer (target=editor, tests=yes, dev_build=yes, use_tsan=yes, use_llvm=yes, linker=lld)

enumeration values 'TYPE_METHOD' and 'TYPE_ANIMATION' not handled in switch [-Werror,-Wswitch]

Check failure on line 2166 in scene/animation/animation_mixer.cpp

View workflow job for this annotation

GitHub Actions / 🐧 Linux / Template w/ Mono (target=template_release)

enumeration value 'TYPE_METHOD' not handled in switch [-Werror=switch]

Check failure on line 2166 in scene/animation/animation_mixer.cpp

View workflow job for this annotation

GitHub Actions / 🐧 Linux / Template w/ Mono (target=template_release)

enumeration value 'TYPE_ANIMATION' not handled in switch [-Werror=switch]

Check failure on line 2166 in scene/animation/animation_mixer.cpp

View workflow job for this annotation

GitHub Actions / 🐧 Linux / Minimal template (target=template_release, everything disabled)

enumeration value 'TYPE_METHOD' not handled in switch [-Werror=switch]

Check failure on line 2166 in scene/animation/animation_mixer.cpp

View workflow job for this annotation

GitHub Actions / 🐧 Linux / Minimal template (target=template_release, everything disabled)

enumeration value 'TYPE_ANIMATION' not handled in switch [-Werror=switch]
case Animation::TYPE_VALUE: {
AnimationMixer::TrackCacheValue *src = static_cast<AnimationMixer::TrackCacheValue *>(p_cache);
AnimationMixer::TrackCacheValue *tc = memnew(AnimationMixer::TrackCacheValue);
memcpy((void *)tc, (void *)src, sizeof(AnimationMixer::TrackCacheValue));
return tc;
}

case Animation::TYPE_POSITION_3D:
case Animation::TYPE_ROTATION_3D:
case Animation::TYPE_SCALE_3D: {
AnimationMixer::TrackCacheTransform *src = static_cast<AnimationMixer::TrackCacheTransform *>(p_cache);
AnimationMixer::TrackCacheTransform *tc = memnew(AnimationMixer::TrackCacheTransform);
memcpy((void *)tc, (void *)src, sizeof(AnimationMixer::TrackCacheTransform));
return tc;
}

case Animation::TYPE_BLEND_SHAPE: {
AnimationMixer::TrackCacheBlendShape *src = static_cast<AnimationMixer::TrackCacheBlendShape *>(p_cache);
AnimationMixer::TrackCacheBlendShape *tc = memnew(AnimationMixer::TrackCacheBlendShape);
memcpy((void *)tc, (void *)src, sizeof(AnimationMixer::TrackCacheBlendShape));
return tc;
}

case Animation::TYPE_BEZIER: {
AnimationMixer::TrackCacheBezier *src = static_cast<AnimationMixer::TrackCacheBezier *>(p_cache);
AnimationMixer::TrackCacheBezier *tc = memnew(AnimationMixer::TrackCacheBezier);
memcpy((void *)tc, (void *)src, sizeof(AnimationMixer::TrackCacheBezier));
return tc;
}

case Animation::TYPE_AUDIO: {
AnimationMixer::TrackCacheAudio *src = static_cast<AnimationMixer::TrackCacheAudio *>(p_cache);
AnimationMixer::TrackCacheAudio *tc = memnew(AnimationMixer::TrackCacheAudio);
memcpy((void *)tc, (void *)src, sizeof(AnimationMixer::TrackCacheAudio));
return tc;
}
}
return nullptr;
}
13 changes: 6 additions & 7 deletions scene/animation/animation_mixer.h
Original file line number Diff line number Diff line change
Expand Up @@ -388,14 +388,13 @@ class AnimatedValuesBackup : public RefCounted {
HashMap<NodePath, AnimationMixer::TrackCache *> data;

public:
void set_data(const HashMap<NodePath, AnimationMixer::TrackCache *> p_data) { data = p_data; };
HashMap<NodePath, AnimationMixer::TrackCache *> get_data() const { return data; };
void set_data(const HashMap<NodePath, AnimationMixer::TrackCache *> p_data);
HashMap<NodePath, AnimationMixer::TrackCache *> get_data() const;
void clear_data();

~AnimatedValuesBackup() {
for (KeyValue<NodePath, AnimationMixer::TrackCache *> &K : data) {
memdelete(K.value);
}
}
AnimationMixer::TrackCache *get_cache_copy(AnimationMixer::TrackCache *p_cache) const;

~AnimatedValuesBackup() { clear_data(); }
};

VARIANT_ENUM_CAST(AnimationMixer::AnimationCallbackModeProcess);
Expand Down

0 comments on commit 8f63b3e

Please sign in to comment.