Re: git: 4456846a1a0d - main - bin/date: Upgrade calculations
Date: Tue, 04 Jul 2023 04:00:34 UTC
On Mon, Jul 3, 2023, 9:34 PM Pedro Giffuni <pfg@freebsd.org> wrote:
> Hmm ...
>
> Dragonfly has no armv7 or i386, so they didn't get it too wrong.
> I guess the int64_t would be a quick fix or another option, which I was
> consideirng, was to look at unsigning it but taking care of the edge cases
> ... I was too lazy for that.
>
> Please go ahead and do the quick fix ;)
>
What makes you say it's a quick fix? If the calculations need 64 bits,
int64_t is the proper data type. How is that analysis wrong?
Also, it's tradition that you should fix it...
Warner
> Pedro.
>
> On Monday, July 3, 2023 at 10:12:13 PM GMT-5, Warner Losh <imp@bsdimp.com>
> wrote:
>
>
> This is a nope on armv7 and i386. So it has no effect there. DF got it
> wrong. These should likely be int64_t to avoid the overflow. No?
>
> Warner
>
> On Mon, Jul 3, 2023, 9:08 PM Pedro F. Giffuni <pfg@freebsd.org> wrote:
>
> The branch main has been updated by pfg:
>
> URL:
> https://cgit.FreeBSD.org/src/commit/?id=4456846a1a0d8cb6d0e6bae89f1134fa0a1af5cf
>
> commit 4456846a1a0d8cb6d0e6bae89f1134fa0a1af5cf
> Author: Pedro F. Giffuni <pfg@FreeBSD.org>
> AuthorDate: 2023-07-03 02:32:10 +0000
> Commit: Pedro F. Giffuni <pfg@FreeBSD.org>
> CommitDate: 2023-07-04 03:08:01 +0000
>
> bin/date: Upgrade calculations
>
> Use long instead of int for numerous calculations, fixing a number of
> date calculation overflow issues.
>
> Obtained from: DragonflyBSD
> Git log: 4238ce6f0c6df33ce677ae298b245c62cd60fb43 (only partial)
> ---
> bin/date/vary.c | 20 ++++++++++----------
> 1 file changed, 10 insertions(+), 10 deletions(-)
>
> diff --git a/bin/date/vary.c b/bin/date/vary.c
> index 5f0123110ee3..6f3c59950ecf 100644
> --- a/bin/date/vary.c
> +++ b/bin/date/vary.c
> @@ -34,7 +34,7 @@ __FBSDID("$FreeBSD$");
> #include "vary.h"
>
> struct trans {
> - int val;
> + long val;
> const char *str;
> };
>
> @@ -52,7 +52,7 @@ static struct trans trans_wday[] = {
> };
>
> static char digits[] = "0123456789";
> -static int adjhour(struct tm *, char, int, int);
> +static int adjhour(struct tm *, char, long, int);
>
> static int
> domktime(struct tm *t, char type)
> @@ -125,7 +125,7 @@ daysinmonth(const struct tm *t)
>
>
> static int
> -adjyear(struct tm *t, char type, int val, int mk)
> +adjyear(struct tm *t, char type, long val, int mk)
> {
> switch (type) {
> case '+':
> @@ -146,7 +146,7 @@ adjyear(struct tm *t, char type, int val, int mk)
> }
>
> static int
> -adjmon(struct tm *t, char type, int val, int istext, int mk)
> +adjmon(struct tm *t, char type, long val, int istext, int mk)
> {
> int lmdays;
>
> @@ -206,7 +206,7 @@ adjmon(struct tm *t, char type, int val, int istext,
> int mk)
> }
>
> static int
> -adjday(struct tm *t, char type, int val, int mk)
> +adjday(struct tm *t, char type, long val, int mk)
> {
> int lmdays;
>
> @@ -250,7 +250,7 @@ adjday(struct tm *t, char type, int val, int mk)
> }
>
> static int
> -adjwday(struct tm *t, char type, int val, int istext, int mk)
> +adjwday(struct tm *t, char type, long val, int istext, int mk)
> {
> if (val < 0)
> return 0;
> @@ -286,7 +286,7 @@ adjwday(struct tm *t, char type, int val, int istext,
> int mk)
> }
>
> static int
> -adjhour(struct tm *t, char type, int val, int mk)
> +adjhour(struct tm *t, char type, long val, int mk)
> {
> if (val < 0)
> return 0;
> @@ -331,7 +331,7 @@ adjhour(struct tm *t, char type, int val, int mk)
> }
>
> static int
> -adjmin(struct tm *t, char type, int val, int mk)
> +adjmin(struct tm *t, char type, long val, int mk)
> {
> if (val < 0)
> return 0;
> @@ -372,7 +372,7 @@ adjmin(struct tm *t, char type, int val, int mk)
> }
>
> static int
> -adjsec(struct tm *t, char type, int val, int mk)
> +adjsec(struct tm *t, char type, long val, int mk)
> {
> if (val < 0)
> return 0;
> @@ -419,7 +419,7 @@ vary_apply(const struct vary *v, struct tm *t)
> char which;
> char *arg;
> size_t len;
> - int val;
> + long val;
>
> for (; v; v = v->next) {
> type = *v->arg;
>
>