aboutsummaryrefslogtreecommitdiffstats
path: root/builtin.c
diff options
context:
space:
mode:
authorAndrew J. Schorr <aschorr@telemetry-investments.com>2017-01-27 13:25:02 -0500
committerAndrew J. Schorr <aschorr@telemetry-investments.com>2017-01-27 13:25:02 -0500
commita7addf98875555f48f30e7a9260f39a36a7b3e75 (patch)
tree585ab531aaf54a667a4b5618bf9b476d0eaf4793 /builtin.c
parentf1507d4056a6f4e2a9cd5091a495175cbfb840ae (diff)
downloadegawk-a7addf98875555f48f30e7a9260f39a36a7b3e75.tar.gz
egawk-a7addf98875555f48f30e7a9260f39a36a7b3e75.tar.bz2
egawk-a7addf98875555f48f30e7a9260f39a36a7b3e75.zip
Introduce some helpful macros for terminating strings, and fix overrun in dcgettext.
Diffstat (limited to 'builtin.c')
-rw-r--r--builtin.c43
1 files changed, 19 insertions, 24 deletions
diff --git a/builtin.c b/builtin.c
index faee54ee..14f5c730 100644
--- a/builtin.c
+++ b/builtin.c
@@ -1981,8 +1981,7 @@ do_strftime(int nargs)
DEREF(t1);
return make_string("", 0);
}
- save = format[formatlen];
- t1->stptr[formatlen] = '\0';
+ str_terminate(t1, save);
}
if (do_gmt)
@@ -2021,7 +2020,7 @@ do_strftime(int nargs)
efree(bufp);
done:
if (t1) {
- t1->stptr[formatlen] = save;
+ str_restore(t1, save);
DEREF(t1);
}
return ret;
@@ -3751,8 +3750,8 @@ do_dcgettext(int nargs)
#if ENABLE_NLS && defined(LC_MESSAGES) && HAVE_DCGETTEXT
int lc_cat;
char *domain;
- char save, save1;
- bool saved_end = false;
+ char save1, save2;
+ size_t reslen;
if (nargs == 3) { /* third argument */
tmp = POP_STRING();
@@ -3764,9 +3763,7 @@ do_dcgettext(int nargs)
if (nargs >= 2) { /* second argument */
t2 = POP_STRING();
domain = t2->stptr;
- save = domain[t2->stlen];
- domain[t2->stlen] = '\0';
- saved_end = true;
+ str_terminate(t2, save2);
} else
domain = TEXTDOMAIN;
#else
@@ -3782,21 +3779,22 @@ do_dcgettext(int nargs)
t1 = POP_STRING(); /* first argument */
string = t1->stptr;
- save1 = string[t1->stlen];
- string[t1->stlen] = '\0';
#if ENABLE_NLS && defined(LC_MESSAGES) && HAVE_DCGETTEXT
+ str_terminate(t1, save1);
the_result = dcgettext(domain, string, lc_cat);
- string[t1->stlen] = save1;
- if (saved_end)
- domain[t2->stlen] = save;
- if (t2 != NULL)
+ str_restore(t1, save1);
+ if (t2 != NULL) {
+ str_restore(t2, save2);
DEREF(t2);
+ }
+ reslen = strlen(the_result);
#else
the_result = string;
+ reslen = t1->stlen;
#endif
DEREF(t1);
- return make_string(the_result, strlen(the_result));
+ return make_string(the_result, reslen);
}
@@ -3855,14 +3853,12 @@ do_dcngettext(int nargs)
#if ENABLE_NLS && defined(LC_MESSAGES) && HAVE_DCGETTEXT
- save1 = string1[t1->stlen];
- string1[t1->stlen] = '\0';
- save2 = string2[t2->stlen];
- string2[t2->stlen] = '\0';
+ str_terminate(t1, save1);
+ str_terminate(t2, save2);
the_result = dcngettext(domain, string1, string2, number, lc_cat);
reslen = strlen(the_result);
- string1[t1->stlen] = save1;
- string2[t2->stlen] = save2;
+ str_restore(t1, save1);
+ str_restore(t2, save2);
if (saved_end)
domain[t3->stlen] = save;
if (t3 != NULL)
@@ -3917,13 +3913,12 @@ do_bindtextdomain(int nargs)
t1 = POP_STRING();
if (t1->stlen > 0) {
directory = (const char *) t1->stptr;
- save1 = t1->stptr[t1->stlen];
- t1->stptr[t1->stlen] = '\0';
+ str_terminate(t1, save1);
}
the_result = bindtextdomain(domain, directory);
if (directory)
- t1->stptr[t1->stlen] = save1;
+ str_restore(t1, save1);
DEREF(t1);
if (t2 != NULL) {