From 09611e0284a559eebcbe2e3236afe2f6dbf82ed1 Mon Sep 17 00:00:00 2001 From: Yuri Kunde Schlesner Date: Wed, 3 Feb 2016 00:25:54 -0800 Subject: [PATCH] Fix crash when getting or setting struct params in CAM:U --- libctru/source/services/cam.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/libctru/source/services/cam.c b/libctru/source/services/cam.c index 6425cda..996d544 100644 --- a/libctru/source/services/cam.c +++ b/libctru/source/services/cam.c @@ -6,6 +6,7 @@ #include <3ds/types.h> #include <3ds/result.h> #include <3ds/ipc.h> +#include Handle camHandle; static int camRefCount; @@ -534,7 +535,7 @@ Result CAMU_GetStereoCameraCalibrationData(CAMU_StereoCameraCalibrationData* dat cmdbuf[0] = IPC_MakeHeader(0x2B,0,0); // 0x2B0000 if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; - *data = *(CAMU_StereoCameraCalibrationData*) cmdbuf[2]; + memcpy(data, &cmdbuf[2], sizeof(*data)); return cmdbuf[1]; } @@ -542,7 +543,7 @@ Result CAMU_SetStereoCameraCalibrationData(CAMU_StereoCameraCalibrationData data Result ret = 0; u32* cmdbuf = getThreadCommandBuffer(); cmdbuf[0] = IPC_MakeHeader(0x2C,16,0); // 0x2C0400 - *(CAMU_StereoCameraCalibrationData*) cmdbuf[1] = data; + memcpy(&cmdbuf[1], &data, sizeof(data)); if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; return cmdbuf[1]; @@ -600,7 +601,7 @@ Result CAMU_SetImageQualityCalibrationData(CAMU_ImageQualityCalibrationData data Result ret = 0; u32* cmdbuf = getThreadCommandBuffer(); cmdbuf[0] = IPC_MakeHeader(0x31,6,0); // 0x310180 - *(CAMU_ImageQualityCalibrationData*) cmdbuf[1] = data; + memcpy(&cmdbuf[1], &data, sizeof(data)); if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; return cmdbuf[1]; @@ -612,7 +613,7 @@ Result CAMU_GetImageQualityCalibrationData(CAMU_ImageQualityCalibrationData* dat cmdbuf[0] = IPC_MakeHeader(0x32,0,0); // 0x320000 if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; - *data = *(CAMU_ImageQualityCalibrationData*) cmdbuf[2]; + memcpy(data, &cmdbuf[2], sizeof(*data)); return cmdbuf[1]; } @@ -620,7 +621,7 @@ Result CAMU_SetPackageParameterWithoutContext(CAMU_PackageParameterCameraSelect Result ret = 0; u32* cmdbuf = getThreadCommandBuffer(); cmdbuf[0] = IPC_MakeHeader(0x33,11,0); // 0x3302C0 - *(CAMU_PackageParameterCameraSelect*) cmdbuf[1] = param; + memcpy(&cmdbuf[1], ¶m, sizeof(param)); if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; return cmdbuf[1]; @@ -630,7 +631,7 @@ Result CAMU_SetPackageParameterWithContext(CAMU_PackageParameterContext param) { Result ret = 0; u32* cmdbuf = getThreadCommandBuffer(); cmdbuf[0] = IPC_MakeHeader(0x34,5,0); // 0x340140 - *(CAMU_PackageParameterContext*) cmdbuf[1] = param; + memcpy(&cmdbuf[1], ¶m, sizeof(param)); if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; return cmdbuf[1]; @@ -640,7 +641,7 @@ Result CAMU_SetPackageParameterWithContextDetail(CAMU_PackageParameterContextDet Result ret = 0; u32* cmdbuf = getThreadCommandBuffer(); cmdbuf[0] = IPC_MakeHeader(0x35,7,0); // 0x3501C0 - *(CAMU_PackageParameterContextDetail*) cmdbuf[1] = param; + memcpy(&cmdbuf[1], ¶m, sizeof(param)); if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; return cmdbuf[1];