kernel: Use correct type for semaphore numbers.

It must be unsigned short, otherwise in some places we would use
negative offsets and wind up out-of-bounds.

Fixes #18586.
This commit is contained in:
Augustin Cavalier
2023-09-21 22:28:55 -04:00
parent 959d9cd069
commit 55b2baf2f6
+9 -9
View File
@@ -227,7 +227,7 @@ public:
delete[] fSemaphores; delete[] fSemaphores;
} }
void ClearUndo(unsigned short semaphoreNumber) void ClearUndo(ushort semaphoreNumber)
{ {
Team *team = thread_get_current_thread()->team; Team *team = thread_get_current_thread()->team;
UndoList::Iterator iterator = fUndoList.GetIterator(); UndoList::Iterator iterator = fUndoList.GetIterator();
@@ -337,7 +337,7 @@ public:
// Record the sem_undo operation into our private fUndoList and // Record the sem_undo operation into our private fUndoList and
// the team undo_list. The only limit here is the memory needed // the team undo_list. The only limit here is the memory needed
// for creating a new sem_undo structure. // for creating a new sem_undo structure.
int RecordUndo(short semaphoreNumber, short value) int RecordUndo(ushort semaphoreNumber, short value)
{ {
// Look if there is already a record from the team caller // Look if there is already a record from the team caller
// for the same semaphore set // for the same semaphore set
@@ -411,7 +411,7 @@ public:
return B_OK; return B_OK;
} }
void RevertUndo(short semaphoreNumber, short value) void RevertUndo(ushort semaphoreNumber, short value)
{ {
// This can be called only when RecordUndo fails. // This can be called only when RecordUndo fails.
Team *team = thread_get_current_thread()->team; Team *team = thread_get_current_thread()->team;
@@ -1064,12 +1064,12 @@ _user_xsi_semop(int semaphoreID, struct sembuf *ops, size_t numOps)
status_t result = 0; status_t result = 0;
while (notDone) { while (notDone) {
XsiSemaphore *semaphore = NULL; XsiSemaphore *semaphore = NULL;
const short numberOfSemaphores = semaphoreSet->NumberOfSemaphores(); const ushort numberOfSemaphores = semaphoreSet->NumberOfSemaphores();
bool goToSleep = false; bool goToSleep = false;
uint32 i = 0; uint32 i = 0;
for (; i < numOps; i++) { for (; i < numOps; i++) {
short semaphoreNumber = operations[i].sem_num; ushort semaphoreNumber = operations[i].sem_num;
if (semaphoreNumber >= numberOfSemaphores) { if (semaphoreNumber >= numberOfSemaphores) {
TRACE(("xsi_semop: %" B_PRIu32 " invalid semaphore number" TRACE(("xsi_semop: %" B_PRIu32 " invalid semaphore number"
"\n", i)); "\n", i));
@@ -1110,7 +1110,7 @@ _user_xsi_semop(int semaphoreID, struct sembuf *ops, size_t numOps)
if (goToSleep || result != 0) { if (goToSleep || result != 0) {
// Undo all previously done operations // Undo all previously done operations
for (uint32 j = 0; j < i; j++) { for (uint32 j = 0; j < i; j++) {
short semaphoreNumber = operations[j].sem_num; ushort semaphoreNumber = operations[j].sem_num;
semaphore = semaphoreSet->Semaphore(semaphoreNumber); semaphore = semaphoreSet->Semaphore(semaphoreNumber);
short operation = operations[j].sem_op; short operation = operations[j].sem_op;
if (operation != 0) if (operation != 0)
@@ -1170,7 +1170,7 @@ _user_xsi_semop(int semaphoreID, struct sembuf *ops, size_t numOps)
if ((operations[i].sem_flg & SEM_UNDO) == 0) if ((operations[i].sem_flg & SEM_UNDO) == 0)
continue; continue;
short semaphoreNumber = operations[i].sem_num; ushort semaphoreNumber = operations[i].sem_num;
XsiSemaphore *semaphore = semaphoreSet->Semaphore(semaphoreNumber); XsiSemaphore *semaphore = semaphoreSet->Semaphore(semaphoreNumber);
short operation = operations[i].sem_op; short operation = operations[i].sem_op;
@@ -1179,7 +1179,7 @@ _user_xsi_semop(int semaphoreID, struct sembuf *ops, size_t numOps)
// Undo everything! // Undo everything!
// Start with semaphore operations // Start with semaphore operations
for (uint32 j = 0; j < numOps; j++) { for (uint32 j = 0; j < numOps; j++) {
short semaphoreNumber = operations[j].sem_num; ushort semaphoreNumber = operations[j].sem_num;
semaphore = semaphoreSet->Semaphore(semaphoreNumber); semaphore = semaphoreSet->Semaphore(semaphoreNumber);
short operation = operations[j].sem_op; short operation = operations[j].sem_op;
if (operation != 0) if (operation != 0)
@@ -1201,7 +1201,7 @@ _user_xsi_semop(int semaphoreID, struct sembuf *ops, size_t numOps)
// We did it. Set the pid of all semaphores used // We did it. Set the pid of all semaphores used
if (result == 0) { if (result == 0) {
for (uint32 i = 0; i < numOps; i++) { for (uint32 i = 0; i < numOps; i++) {
short semaphoreNumber = operations[i].sem_num; ushort semaphoreNumber = operations[i].sem_num;
XsiSemaphore *semaphore = semaphoreSet->Semaphore(semaphoreNumber); XsiSemaphore *semaphore = semaphoreSet->Semaphore(semaphoreNumber);
semaphore->SetPid(getpid()); semaphore->SetPid(getpid());
} }