diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2023-05-28 17:25:56 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2023-05-28 17:25:56 +0200 |
commit | b76b420b5da1aadad823faf12327b610614f5951 (patch) | |
tree | 38754bece4f1ded6b050047905e688abbe829b37 | |
parent | 9790eb73c8b7ed1a1015f58e1fe85de0508c0526 (diff) | |
download | busybox-w32-b76b420b5da1aadad823faf12327b610614f5951.tar.gz busybox-w32-b76b420b5da1aadad823faf12327b610614f5951.tar.bz2 busybox-w32-b76b420b5da1aadad823faf12327b610614f5951.zip |
awk: fix closing of non-opened file
function old new delta
setvar_ERRNO - 53 +53
.rodata 105252 105246 -6
awk_getline 639 620 -19
evaluate 3402 3377 -25
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 0/3 up/down: 53/-50) Total: 3 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | editors/awk.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/editors/awk.c b/editors/awk.c index 77e0b0aab..83a08aa95 100644 --- a/editors/awk.c +++ b/editors/awk.c | |||
@@ -1006,6 +1006,11 @@ static var *setvar_i(var *v, double value) | |||
1006 | return v; | 1006 | return v; |
1007 | } | 1007 | } |
1008 | 1008 | ||
1009 | static void setvar_ERRNO(void) | ||
1010 | { | ||
1011 | setvar_i(intvar[ERRNO], errno); | ||
1012 | } | ||
1013 | |||
1009 | static const char *getvar_s(var *v) | 1014 | static const char *getvar_s(var *v) |
1010 | { | 1015 | { |
1011 | /* if v is numeric and has no cached string, convert it to string */ | 1016 | /* if v is numeric and has no cached string, convert it to string */ |
@@ -2305,7 +2310,7 @@ static int awk_getline(rstream *rsm, var *v) | |||
2305 | if (p < pp) { | 2310 | if (p < pp) { |
2306 | p = 0; | 2311 | p = 0; |
2307 | r = 0; | 2312 | r = 0; |
2308 | setvar_i(intvar[ERRNO], errno); | 2313 | setvar_ERRNO(); |
2309 | } | 2314 | } |
2310 | b[p] = '\0'; | 2315 | b[p] = '\0'; |
2311 | } while (p > pp); | 2316 | } while (p > pp); |
@@ -3249,7 +3254,7 @@ static var *evaluate(node *op, var *res) | |||
3249 | } | 3254 | } |
3250 | 3255 | ||
3251 | if (!rsm->F) { | 3256 | if (!rsm->F) { |
3252 | setvar_i(intvar[ERRNO], errno); | 3257 | setvar_ERRNO(); |
3253 | setvar_i(res, -1); | 3258 | setvar_i(res, -1); |
3254 | break; | 3259 | break; |
3255 | } | 3260 | } |
@@ -3388,16 +3393,18 @@ static var *evaluate(node *op, var *res) | |||
3388 | */ | 3393 | */ |
3389 | if (rsm->F) | 3394 | if (rsm->F) |
3390 | err = rsm->is_pipe ? pclose(rsm->F) : fclose(rsm->F); | 3395 | err = rsm->is_pipe ? pclose(rsm->F) : fclose(rsm->F); |
3391 | //TODO: fix this case: | ||
3392 | // $ awk 'BEGIN { print close(""); print ERRNO }' | ||
3393 | // -1 | ||
3394 | // close of redirection that was never opened | ||
3395 | // (we print 0, 0) | ||
3396 | free(rsm->buffer); | 3396 | free(rsm->buffer); |
3397 | hash_remove(fdhash, L.s); | 3397 | hash_remove(fdhash, L.s); |
3398 | } else { | ||
3399 | err = -1; | ||
3400 | /* gawk 'BEGIN { print close(""); print ERRNO }' | ||
3401 | * -1 | ||
3402 | * close of redirection that was never opened | ||
3403 | */ | ||
3404 | errno = ENOENT; | ||
3398 | } | 3405 | } |
3399 | if (err) | 3406 | if (err) |
3400 | setvar_i(intvar[ERRNO], errno); | 3407 | setvar_ERRNO(); |
3401 | R_d = (double)err; | 3408 | R_d = (double)err; |
3402 | break; | 3409 | break; |
3403 | } | 3410 | } |