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