applied

On 2/28/18 10:42 AM, Fabian Grünbichler wrote:
> the timegm(gmtime()) and timelocal(localtime(()) constructs are
> problematic in the following case: - $last is such that $year gets set
> to a two-digit value (e.g., the referred to timestamp is somewhere in
> the range of 1900-1999) - the current date is such that the value of
> $year gets interpreted wrongly (e.g., anything other than 1950).
> 
> the exact breakage depends on the actual current date AND value of
> $last, since localtime/gmtime will interpret two-digit years as (perldoc
> Time::Local):
>     [...] shorthand for years in the rolling "current century," defined
>     as 50 years on either side of the current year. Thus, today, in
>     1999, 0 would refer to 2000, and 45 to 2045, but 55 would refer to
>     1955.  Twenty years from now, 55 would instead refer to 2055.
> 
> fix it by adding 1900 to force 4-digit $year values, as the localtime
> documentation suggests.
> 
> Signed-off-by: Fabian Grünbichler <f.gruenbich...@proxmox.com>
> ---
>  src/PVE/CalendarEvent.pm | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/src/PVE/CalendarEvent.pm b/src/PVE/CalendarEvent.pm
> index 77b6008..3c08eb0 100644
> --- a/src/PVE/CalendarEvent.pm
> +++ b/src/PVE/CalendarEvent.pm
> @@ -177,9 +177,13 @@ sub compute_next_event {
>  
>       if ($utc) {
>           (undef, $min, $hour, $mday, $mon, $year, $wday) = gmtime($last);
> +         # gmtime and timegm interpret two-digit years differently
> +         $year += 1900;
>           $startofday = timegm(0, 0, 0, $mday, $mon, $year);
>       } else {
>           (undef, $min, $hour, $mday, $mon, $year, $wday) = localtime($last);
> +         # localtime and timelocal interpret two-digit years differently
> +         $year += 1900;
>           $startofday = timelocal(0, 0, 0, $mday, $mon, $year);
>       }
>  
> 



_______________________________________________
pve-devel mailing list
pve-devel@pve.proxmox.com
https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel

Reply via email to