kitgit

tirbofish/dropbear · commit

2c8c840f755bd7d53291b9c21e2b7d99afa1e998

fix: scene load error Unverified

Thribhu K <4tkbytes@pm.me> · 2026-01-18 13:26

view full diff

diff --git a/crates/eucalyptus-core/src/scene/scripting.rs b/crates/eucalyptus-core/src/scene/scripting.rs
index bf22c06..7a91e7c 100644
--- a/crates/eucalyptus-core/src/scene/scripting.rs
+++ b/crates/eucalyptus-core/src/scene/scripting.rs
@@ -288,10 +288,11 @@ pub mod jni {
         mut env: JNIEnv,
         _: JClass,
         command_buffer_ptr: jlong,
+        scene_loader_handle: jlong,
         scene_id: jlong,
     ) {
         let command_buffer = convert_ptr!(command_buffer_ptr, CommandBufferPtr => crossbeam_channel::Sender<CommandBuffer>);
-        let scene_loader = convert_ptr!(scene_id as SceneLoaderPtr => parking_lot::Mutex<crate::scene::loading::SceneLoader>);
+        let scene_loader = convert_ptr!(scene_loader_handle, SceneLoaderPtr => parking_lot::Mutex<crate::scene::loading::SceneLoader>);
 
         if let Err(e) = super::shared::switch_to_scene_async(command_buffer, scene_loader, scene_id as u64) {
             eprintln!("Failed to switch scene async: {}", e);
diff --git a/crates/eucalyptus-core/src/utils.rs b/crates/eucalyptus-core/src/utils.rs
index 8a5e054..9a8dab0 100644
--- a/crates/eucalyptus-core/src/utils.rs
+++ b/crates/eucalyptus-core/src/utils.rs
@@ -355,6 +355,19 @@ macro_rules! convert_ptr {
             return $crate::ffi_error_return!("{}", message);
         }
 
+        let addr = ptr as usize;
+        let align = std::mem::align_of::<$target_ty>();
+        if addr % align != 0 {
+            let message = format!(
+                "[{}] [ERROR] {} pointer is misaligned: addr=0x{:x}, align=0x{:x}",
+                std::any::type_name::<$target_ty>(),
+                stringify!($ptr),
+                addr,
+                align
+            );
+            return $crate::ffi_error_return!("{}", message);
+        }
+
         unsafe { &mut *(ptr as *mut $target_ty) }
     }};
 
@@ -368,6 +381,19 @@ macro_rules! convert_ptr {
             );
             return $crate::ffi_error_return!("{}", message);
         }
+
+        let addr = ptr as usize;
+        let align = std::mem::align_of::<$target_ty>();
+        if addr % align != 0 {
+            let message = format!(
+                "[{}] [ERROR] {} pointer is misaligned: addr=0x{:x}, align=0x{:x}",
+                std::any::type_name::<$target_ty>(),
+                stringify!($ptr),
+                addr,
+                align
+            );
+            return $crate::ffi_error_return!("{}", message);
+        }
         unsafe { &mut *ptr }
     }};
 
@@ -381,6 +407,19 @@ macro_rules! convert_ptr {
             );
             return $crate::ffi_error_return!("{}", message);
         }
+
+        let addr = ptr as usize;
+        let align = std::mem::align_of::<$target_ty>();
+        if addr % align != 0 {
+            let message = format!(
+                "[{}] [ERROR] {} pointer is misaligned: addr=0x{:x}, align=0x{:x}",
+                std::any::type_name::<$target_ty>(),
+                stringify!($ptr),
+                addr,
+                align
+            );
+            return $crate::ffi_error_return!("{}", message);
+        }
         unsafe { &*(ptr as *const $target_ty) }
     }};
 
@@ -394,6 +433,19 @@ macro_rules! convert_ptr {
             );
             return $crate::ffi_error_return!("{}", message);
         }
+
+        let addr = ptr as usize;
+        let align = std::mem::align_of::<$target_ty>();
+        if addr % align != 0 {
+            let message = format!(
+                "[{}] [ERROR] {} pointer is misaligned: addr=0x{:x}, align=0x{:x}",
+                std::any::type_name::<$target_ty>(),
+                stringify!($ptr),
+                addr,
+                align
+            );
+            return $crate::ffi_error_return!("{}", message);
+        }
         unsafe { &*ptr }
     }};
 }
diff --git a/scripting/jvmMain/java/com/dropbear/scene/SceneLoadHandleNative.java b/scripting/jvmMain/java/com/dropbear/scene/SceneLoadHandleNative.java
index 28f72df..a68320d 100644
--- a/scripting/jvmMain/java/com/dropbear/scene/SceneLoadHandleNative.java
+++ b/scripting/jvmMain/java/com/dropbear/scene/SceneLoadHandleNative.java
@@ -9,7 +9,7 @@ public class SceneLoadHandleNative {
     }
 
     public static native String getSceneLoadHandleSceneName(long sceneLoaderHandle, long sceneId);
-    public static native void switchToSceneAsync(long commandBufferPtr, long sceneId);
+    public static native void switchToSceneAsync(long commandBufferPtr, long sceneLoaderHandle, long sceneId);
     public static native Progress getSceneLoadProgress(long sceneLoaderHandle, long sceneId);
     public static native int getSceneLoadStatus(long sceneLoaderHandle, long sceneId);
 }
diff --git a/scripting/jvmMain/kotlin/com/dropbear/scene/SceneLoadHandle.jvm.kt b/scripting/jvmMain/kotlin/com/dropbear/scene/SceneLoadHandle.jvm.kt
index 15373f3..7f64d9e 100644
--- a/scripting/jvmMain/kotlin/com/dropbear/scene/SceneLoadHandle.jvm.kt
+++ b/scripting/jvmMain/kotlin/com/dropbear/scene/SceneLoadHandle.jvm.kt
@@ -8,7 +8,11 @@ internal actual fun SceneLoadHandle.getSceneLoadHandleSceneName(id: Long): Strin
 }
 
 internal actual fun SceneLoadHandle.switchToSceneAsync() {
-    return SceneLoadHandleNative.switchToSceneAsync(DropbearEngine.native.commandBufferHandle, this.id)
+    return SceneLoadHandleNative.switchToSceneAsync(
+        DropbearEngine.native.commandBufferHandle,
+        DropbearEngine.native.sceneLoaderHandle,
+        this.id
+    )
 }
 
 internal actual fun SceneLoadHandle.getSceneLoadProgress(): Progress {