aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2023-05-28 17:25:56 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2023-05-28 17:25:56 +0200
commitb76b420b5da1aadad823faf12327b610614f5951 (patch)
tree38754bece4f1ded6b050047905e688abbe829b37
parent9790eb73c8b7ed1a1015f58e1fe85de0508c0526 (diff)
downloadbusybox-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.c23
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
1009static void setvar_ERRNO(void)
1010{
1011 setvar_i(intvar[ERRNO], errno);
1012}
1013
1009static const char *getvar_s(var *v) 1014static 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 }