Use timegm() instead of mktime() to generate UNIX-timestamp

The broken down time-representation tm generated earlier is in UTC,
and mktime() assumes that it's in local time instead, leading to
the problem that quark might not send a NOT_MODIFIED in a different
timezone.

timegm() instead correctly interprets the broken down
time-representation tm as UTC and returns the proper timestamp.
It might not be portable like mktime(), but it's complicated to
emulate it otherwise.

Thanks to Jeremy Bobbin <jer@jer.cx> for reporting the bug and
providing this fix, which is why I've added him to the LICENSE.
Thanks also to Hiltjo for his input.

Signed-off-by: Laslo Hunhold <dev@frign.de>
This commit is contained in:
Laslo Hunhold 2020-07-23 16:48:34 +02:00
parent a55df3915d
commit 660b308617
No known key found for this signature in database
GPG key ID: 69576BD24CFCB980
2 changed files with 2 additions and 1 deletions

View file

@ -12,6 +12,7 @@ Copyright 2018 Dominik Schmidt <domischmidt@swissonline.ch>
Copyright 2018 Aaron Burrow <burrows@charstarstar.com>
Copyright 2020 Nihal Jere <nihal@nihaljere.xyz>
Copyright 2020 Rainer Holzner <rholzner@web.de>
Copyright 2020 Jeremy Bobbin <jer@jer.cx>
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted, provided that the above

2
http.c
View file

@ -531,7 +531,7 @@ http_send_response(int fd, struct request *r)
}
/* compare with last modification date of the file */
if (difftime(st.st_mtim.tv_sec, mktime(&tm)) <= 0) {
if (difftime(st.st_mtim.tv_sec, timegm(&tm)) <= 0) {
if (dprintf(fd,
"HTTP/1.1 %d %s\r\n"
"Date: %s\r\n"