From 0260a8af927744786530080da612406af05321ae Mon Sep 17 00:00:00 2001 From: Sergey Kosukhin <sergey.kosukhin@mpimet.mpg.de> Date: Fri, 14 Feb 2025 12:53:52 +0100 Subject: [PATCH] Avoid an out-of-bounds read in the uniq example --- examples/uniq.f90 | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/examples/uniq.f90 b/examples/uniq.f90 index 02444ca..e599c98 100644 --- a/examples/uniq.f90 +++ b/examples/uniq.f90 @@ -201,22 +201,40 @@ CONTAINS j = 1 k = 1 + ! Handle the first element (we cannot put this into the loop below because + ! the compiler might not perform the short-circuit evaluation): + IF (i <= na .AND. j <= nb) THEN + diff = 86400000_i8*(InputArray1(i)%day - InputArray2(j)%day) + InputArray1(i)%ms - InputArray2(j)%ms + IF (diff < 0_i8) THEN + OutputArray(k) = InputArray1(i) + i = i + 1 + ELSE IF (diff > 0_i8) THEN + OutputArray(k) = InputArray2(j) + j = j + 1 + ELSE + OutputArray(k) = InputArray1(i) + i = i + 1 + j = j + 1 + END IF + k = k + 1 + END IF + DO WHILE (i <= na .AND. j <= nb) diff = 86400000_i8*(InputArray1(i)%day - InputArray2(j)%day) + InputArray1(i)%ms - InputArray2(j)%ms IF (diff < 0_i8) THEN - IF (k == 1 .OR. ((InputArray1(i)%day /= OutputArray(k - 1)%day) .OR. (InputArray1(i)%ms /= OutputArray(k - 1)%ms))) THEN + IF ((InputArray1(i)%day /= OutputArray(k - 1)%day) .OR. (InputArray1(i)%ms /= OutputArray(k - 1)%ms)) THEN OutputArray(k) = InputArray1(i) k = k + 1 END IF i = i + 1 ELSE IF (diff > 0_i8) THEN - IF (k == 1 .OR. ((InputArray2(j)%day /= OutputArray(k - 1)%day) .OR. (InputArray2(j)%ms /= OutputArray(k - 1)%ms))) THEN + IF ((InputArray2(j)%day /= OutputArray(k - 1)%day) .OR. (InputArray2(j)%ms /= OutputArray(k - 1)%ms)) THEN OutputArray(k) = InputArray2(j) k = k + 1 END IF j = j + 1 ELSE - IF (k == 1 .OR. ((InputArray1(i)%day /= OutputArray(k - 1)%day) .OR. (InputArray1(i)%ms /= OutputArray(k - 1)%ms))) THEN + IF ((InputArray1(i)%day /= OutputArray(k - 1)%day) .OR. (InputArray1(i)%ms /= OutputArray(k - 1)%ms)) THEN OutputArray(k) = InputArray1(i) k = k + 1 END IF @@ -245,9 +263,9 @@ CONTAINS END IF END DO - ! do i = 1, k-1 - ! write (0,*) OutputArray(i) - ! enddo + ! DO i = 1, k - 1 + ! WRITE (0, *) OutputArray(i) + ! END DO nsize_OA = k - 1 -- GitLab