aboutsummaryrefslogtreecommitdiffstats
path: root/builtin.c
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2015-04-16 18:04:29 +0300
committerArnold D. Robbins <arnold@skeeve.com>2015-04-16 18:04:29 +0300
commit559a3395fcb32cdee8a6cdf482656c0b78628f8a (patch)
treeb35e78654b23efd0c21a6da68b102626cf2e9bd0 /builtin.c
parent613c6ddd082a0b241a59260927929cc65ae61f9b (diff)
parentaaa85643b352f867cfe7198f313b4481ad1f544d (diff)
downloadegawk-559a3395fcb32cdee8a6cdf482656c0b78628f8a.tar.gz
egawk-559a3395fcb32cdee8a6cdf482656c0b78628f8a.tar.bz2
egawk-559a3395fcb32cdee8a6cdf482656c0b78628f8a.zip
Merge branch 'master' into feature/wasted-byte
Diffstat (limited to 'builtin.c')
-rw-r--r--builtin.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/builtin.c b/builtin.c
index e5753ade..0b857950 100644
--- a/builtin.c
+++ b/builtin.c
@@ -1872,7 +1872,7 @@ do_strftime(int nargs)
NODE *t1, *t2, *t3, *ret;
struct tm *tm;
time_t fclock;
- long clock_val;
+ double clock_val;
char *bufp;
size_t buflen, bufsize;
char buf[BUFSIZ];
@@ -1881,6 +1881,8 @@ do_strftime(int nargs)
int do_gmt;
NODE *val = NULL;
NODE *sub = NULL;
+ static const time_t time_t_min = TYPE_MINIMUM(time_t);
+ static const time_t time_t_max = TYPE_MAXIMUM(time_t);
/* set defaults first */
format = def_strftime_format; /* traditional date format */
@@ -1920,7 +1922,7 @@ do_strftime(int nargs)
if (do_lint && (t2->flags & (NUMCUR|NUMBER)) == 0)
lintwarn(_("strftime: received non-numeric second argument"));
(void) force_number(t2);
- clock_val = get_number_si(t2);
+ clock_val = get_number_d(t2);
fclock = (time_t) clock_val;
/*
* 4/2015: Protect against negative value being assigned
@@ -1928,6 +1930,11 @@ do_strftime(int nargs)
*/
if (clock_val < 0 && fclock > 0)
fatal(_("strftime: second argument less than 0 or too big for time_t"));
+
+ /* And check that the value is in range */
+ if (clock_val < time_t_min || clock_val > time_t_max)
+ fatal(_("strftime: second argument out of range for time_t"));
+
DEREF(t2);
}
@@ -1951,6 +1958,9 @@ do_strftime(int nargs)
else
tm = localtime(& fclock);
+ if (tm == NULL)
+ return make_string("", 0);
+
bufp = buf;
bufsize = sizeof(buf);
for (;;) {
@@ -3158,10 +3168,10 @@ call_sub(const char *name, int nargs)
PUSH(rhs);
nargs++;
}
- PUSH(rhs);
+ else
+ PUSH(rhs);
}
-
unref(zero);
result = do_sub(nargs, flags);
if (flags != GENSUB)