]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Use the POSIX locale to generate the HTTP Date header
authorRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 16 Apr 2026 10:37:56 +0000 (12:37 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 16 Apr 2026 10:50:31 +0000 (12:50 +0200)
Signed-off-by: Remi Gacogne <remi.gacogne@powerdns.com>
pdns/dnsdistdist/dnsdist-nghttp2-in.cc

index c94dd59b87f17ea57f781c47aac1b63d7c411cc7..b625c1e14c5178f2f8a24dfa8508ec2a2b4b300a 100644 (file)
@@ -278,13 +278,23 @@ static void addDateHeader(PacketBuffer& out)
   timebuf_t date_header{};
   struct tm tmval{};
   time_t timestamp = time(nullptr);
-  // we do not call setlocale(), and according to https://en.cppreference.com/w/cpp/locale/setlocale.html:
-  // "During program startup, the equivalent of std::setlocale(LC_ALL, "C"); is executed before any user code is run.""
-  size_t date_header_written = strftime(date_header.data(), date_header.size(), dateformat.data(), gmtime_r(&timestamp, &tmval));
+  // apparently someone might be crazy enough to change the locale using Lua (why?)
+  // so we have to do extra work just in case
+  auto posixLocale = newlocale(LC_ALL_MASK, "POSIX", nullptr);
+  if (!posixLocale) {
+    return;
+  }
+  try {
+    size_t date_header_written = strftime_l(date_header.data(), date_header.size(), dateformat.data(), gmtime_r(&timestamp, &tmval), posixLocale);
 
-  if (date_header_written > 0 && date_header_written <= date_header.size()) {
-    out.insert(out.end(), date_header.begin(), date_header.begin() + date_header_written);
+    if (date_header_written > 0 && date_header_written <= date_header.size()) {
+      out.insert(out.end(), date_header.begin(), date_header.begin() + date_header_written);
+    }
+  }
+  catch (...) {
   }
+
+  freelocale(posixLocale);
 }
 
 bool IncomingHTTP2Connection::checkALPN()