diff --git a/Core/HLE/sceKernelEventFlag.cpp b/Core/HLE/sceKernelEventFlag.cpp index 20d9be09bd..c1a9de550f 100644 --- a/Core/HLE/sceKernelEventFlag.cpp +++ b/Core/HLE/sceKernelEventFlag.cpp @@ -103,17 +103,37 @@ int sceKernelCreateEventFlag(const char *name, u32 flag_attr, u32 flag_initPatte if (!eventFlagInitComplete) __KernelEventFlagInit(); + if (!name) + { + WARN_LOG(HLE, "%08x=sceKernelCreateEventFlag(): invalid name", SCE_KERNEL_ERROR_ERROR); + return SCE_KERNEL_ERROR_ERROR; + } + + // These attributes aren't valid. + if ((flag_attr & 0x100) != 0 || flag_attr >= 0x300) + { + WARN_LOG(HLE, "%08x=sceKernelCreateEventFlag(): invalid attr parameter: %08x", SCE_KERNEL_ERROR_ILLEGAL_ATTR, flag_attr); + return SCE_KERNEL_ERROR_ILLEGAL_ATTR; + } + EventFlag *e = new EventFlag(); SceUID id = kernelObjects.Create(e); e->nef.size = sizeof(NativeEventFlag); - strncpy(e->nef.name, name, 32); + strncpy(e->nef.name, name, 31); + e->nef.name[31] = 0; e->nef.attr = flag_attr; e->nef.initPattern = flag_initPattern; e->nef.currentPattern = e->nef.initPattern; e->nef.numWaitThreads = 0; - DEBUG_LOG(HLE,"%i=sceKernelCreateEventFlag(\"%s\", %08x, %08x, %08x)", id, e->nef.name, e->nef.attr, e->nef.currentPattern, optPtr); + DEBUG_LOG(HLE, "%i=sceKernelCreateEventFlag(\"%s\", %08x, %08x, %08x)", id, e->nef.name, e->nef.attr, e->nef.currentPattern, optPtr); + + if (optPtr != 0) + WARN_LOG(HLE, "sceKernelCreateEventFlag(%s) unsupported options parameter: %08x", name, optPtr); + if (flag_attr != 0 && flag_attr != 0x200) + WARN_LOG(HLE, "sceKernelCreateEventFlag(%s) unsupported attr parameter: %08x", name, flag_attr); + return id; } diff --git a/Core/HLE/sceKernelMutex.cpp b/Core/HLE/sceKernelMutex.cpp index 337d41e427..4f931b160c 100644 --- a/Core/HLE/sceKernelMutex.cpp +++ b/Core/HLE/sceKernelMutex.cpp @@ -187,14 +187,21 @@ int sceKernelCreateMutex(const char *name, u32 attr, int initialCount, u32 optio __KernelMutexInit(); if (!name) + { + WARN_LOG(HLE, "%08x=sceKernelCreateMutex(): invalid name", SCE_KERNEL_ERROR_ERROR); return SCE_KERNEL_ERROR_ERROR; + } + if (attr >= 0xC00) + { + WARN_LOG(HLE, "%08x=sceKernelCreateMutex(): invalid attr parameter: %08x", SCE_KERNEL_ERROR_ILLEGAL_ATTR, attr); + return SCE_KERNEL_ERROR_ILLEGAL_ATTR; + } + if (initialCount < 0) return SCE_KERNEL_ERROR_ILLEGAL_COUNT; if ((attr & PSP_MUTEX_ATTR_ALLOW_RECURSIVE) == 0 && initialCount > 1) return SCE_KERNEL_ERROR_ILLEGAL_COUNT; - DEBUG_LOG(HLE, "sceKernelCreateMutex(%s, %08x, %d, %08x)", name, attr, initialCount, optionsPtr); - Mutex *mutex = new Mutex(); SceUID id = kernelObjects.Create(mutex); @@ -210,8 +217,12 @@ int sceKernelCreateMutex(const char *name, u32 attr, int initialCount, u32 optio else __KernelMutexAcquireLock(mutex, initialCount); + DEBUG_LOG(HLE, "%i=sceKernelCreateMutex(%s, %08x, %d, %08x)", id, name, attr, initialCount, optionsPtr); + if (optionsPtr != 0) - WARN_LOG(HLE, "sceKernelCreateMutex(%s) unsupported options parameter.", name); + WARN_LOG(HLE, "sceKernelCreateMutex(%s) unsupported options parameter: %08x", name, optionsPtr); + if (attr != 0 && attr != 0x100 && attr != 0x200) + WARN_LOG(HLE, "sceKernelCreateMutex(%s) unsupported attr parameter: %08x", name, attr); return id; } @@ -486,13 +497,20 @@ int sceKernelCreateLwMutex(u32 workareaPtr, const char *name, u32 attr, int init if (!mutexInitComplete) __KernelMutexInit(); - DEBUG_LOG(HLE, "sceKernelCreateLwMutex(%08x, %s, %08x, %d, %08x)", workareaPtr, name, attr, initialCount, optionsPtr); - if (!name) + { + WARN_LOG(HLE, "%08x=sceKernelCreateLwMutex(): invalid name", SCE_KERNEL_ERROR_ERROR); return SCE_KERNEL_ERROR_ERROR; - else if (initialCount < 0) + } + if (attr >= 0x400) + { + WARN_LOG(HLE, "%08x=sceKernelCreateLwMutex(): invalid attr parameter: %08x", SCE_KERNEL_ERROR_ILLEGAL_ATTR, attr); + return SCE_KERNEL_ERROR_ILLEGAL_ATTR; + } + + if (initialCount < 0) return SCE_KERNEL_ERROR_ILLEGAL_COUNT; - else if ((attr & PSP_MUTEX_ATTR_ALLOW_RECURSIVE) == 0 && initialCount > 1) + if ((attr & PSP_MUTEX_ATTR_ALLOW_RECURSIVE) == 0 && initialCount > 1) return SCE_KERNEL_ERROR_ILLEGAL_COUNT; LwMutex *mutex = new LwMutex(); @@ -515,8 +533,12 @@ int sceKernelCreateLwMutex(u32 workareaPtr, const char *name, u32 attr, int init Memory::WriteStruct(workareaPtr, &workarea); + DEBUG_LOG(HLE, "sceKernelCreateLwMutex(%08x, %s, %08x, %d, %08x)", workareaPtr, name, attr, initialCount, optionsPtr); + if (optionsPtr != 0) - WARN_LOG(HLE, "sceKernelCreateLwMutex(%s) unsupported options parameter.", name); + WARN_LOG(HLE, "sceKernelCreateLwMutex(%s) unsupported options parameter: %08x", name, optionsPtr); + if (attr != 0 && attr != 0x100 && attr != 0x200) + WARN_LOG(HLE, "sceKernelCreateLwMutex(%s) unsupported attr parameter: %08x", name, attr); return 0; } diff --git a/Core/HLE/sceKernelSemaphore.cpp b/Core/HLE/sceKernelSemaphore.cpp index c4b103f007..0753420051 100644 --- a/Core/HLE/sceKernelSemaphore.cpp +++ b/Core/HLE/sceKernelSemaphore.cpp @@ -177,7 +177,15 @@ int sceKernelCreateSema(const char* name, u32 attr, int initVal, int maxVal, u32 __KernelSemaInit(); if (!name) + { + WARN_LOG(HLE, "%08x=sceKernelCreateSema(): invalid name", SCE_KERNEL_ERROR_ERROR); return SCE_KERNEL_ERROR_ERROR; + } + if (attr >= 0x200) + { + WARN_LOG(HLE, "%08x=sceKernelCreateSema(): invalid attr parameter: %08x", SCE_KERNEL_ERROR_ILLEGAL_ATTR, attr); + return SCE_KERNEL_ERROR_ILLEGAL_ATTR; + } Semaphore *s = new Semaphore; SceUID id = kernelObjects.Create(s); @@ -194,7 +202,9 @@ int sceKernelCreateSema(const char* name, u32 attr, int initVal, int maxVal, u32 DEBUG_LOG(HLE, "%i=sceKernelCreateSema(%s, %08x, %i, %i, %08x)", id, s->ns.name, s->ns.attr, s->ns.initCount, s->ns.maxCount, optionPtr); if (optionPtr != 0) - WARN_LOG(HLE, "sceKernelCreateSema(%s) unsupported options parameter.", name); + WARN_LOG(HLE, "sceKernelCreateSema(%s) unsupported options parameter: %08x", name, optionPtr); + if (attr != 0 && attr != 0x100) + WARN_LOG(HLE, "sceKernelCreateSema(%s) unsupported attr parameter: %08x", name, attr); return id; }