From 7720c4aefa95ee9df6e5d464c187efa7141f1302 Mon Sep 17 00:00:00 2001
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Date: Fri, 4 Sep 2020 20:09:28 +0300
Subject: android: jpeg: exif: Use reentrant localtime_r()
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

The std::localtime() function isn't thread-safe, and we have no
guarantee whether other threads in the camera service may or may not
call it. Replace it with localtime_r(). This requires switching from
ctime to time.h, as there is no std::localtime_r() function.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Umang Jain <email@uajain.com>
Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
---
 src/android/jpeg/exif.cpp | 6 ++++--
 src/android/jpeg/exif.h   | 2 +-
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/src/android/jpeg/exif.cpp b/src/android/jpeg/exif.cpp
index 1ced5534..c0dbfcc2 100644
--- a/src/android/jpeg/exif.cpp
+++ b/src/android/jpeg/exif.cpp
@@ -186,9 +186,11 @@ void Exif::setSize(const Size &size)
 
 void Exif::setTimestamp(time_t timestamp)
 {
+	struct tm tm;
+	localtime_r(&timestamp, &tm);
+
 	char str[20];
-	std::strftime(str, sizeof(str), "%Y:%m:%d %H:%M:%S",
-		      std::localtime(&timestamp));
+	strftime(str, sizeof(str), "%Y:%m:%d %H:%M:%S", &tm);
 	std::string ts(str);
 
 	setString(EXIF_IFD_0, EXIF_TAG_DATE_TIME, EXIF_FORMAT_ASCII, ts);
diff --git a/src/android/jpeg/exif.h b/src/android/jpeg/exif.h
index 622de4cf..f04cefce 100644
--- a/src/android/jpeg/exif.h
+++ b/src/android/jpeg/exif.h
@@ -7,8 +7,8 @@
 #ifndef __ANDROID_JPEG_EXIF_H__
 #define __ANDROID_JPEG_EXIF_H__
 
-#include <ctime>
 #include <string>
+#include <time.h>
 
 #include <libexif/exif-data.h>
 
-- 
cgit v1.2.1