From e313ecf635ba0ff872868bcd530d42c656f0fba6 Mon Sep 17 00:00:00 2001 From: Dmitry Volyntsev Date: Tue, 12 Feb 2019 18:56:04 +0300 Subject: [PATCH] Eliminating sprintf() and vsnprintf() usage. --- njs/njs_builtin.c | 21 ++++++++++----------- njs/njs_date.c | 24 ++++++++++-------------- njs/njs_json.c | 9 ++++----- njs/njs_number.h | 9 +++++---- njs/njs_regexp.c | 5 +++-- njs/njs_shell.c | 12 ++++++------ njs/njs_time.c | 8 +++++--- njs/test/njs_unit_test.c | 7 +++---- nxt/nxt_string.h | 3 +++ nxt/nxt_trace.c | 9 +++++---- 10 files changed, 54 insertions(+), 53 deletions(-) diff --git a/njs/njs_builtin.c b/njs/njs_builtin.c index 07a3fa7b..95df5dbe 100644 --- a/njs/njs_builtin.c +++ b/njs/njs_builtin.c @@ -595,7 +595,7 @@ njs_builtin_completions_size(njs_vm_t *vm) static nxt_array_t * njs_builtin_completions(njs_vm_t *vm, nxt_array_t *array) { - char *compl; + u_char *compl; size_t n, len; nxt_str_t string, *completions; nxt_uint_t i, k; @@ -634,7 +634,8 @@ njs_builtin_completions(njs_vm_t *vm, nxt_array_t *array) return NULL; } - snprintf(compl, len, "%s.%s", obj->name.start, string.start); + nxt_sprintf(compl, compl + len, "%s.%s%Z", obj->name.start, + string.start); completions[n].length = len; completions[n++].start = (u_char *) compl; @@ -654,12 +655,10 @@ njs_builtin_completions(njs_vm_t *vm, nxt_array_t *array) return NULL; } - snprintf(compl, len, ".%s", string.start); + nxt_sprintf(compl, compl + len, ".%s%Z", string.start); for (k = 0; k < n; k++) { - if (strncmp((char *) completions[k].start, compl, len) - == 0) - { + if (nxt_strncmp(completions[k].start, compl, len) == 0) { break; } } @@ -684,7 +683,8 @@ njs_builtin_completions(njs_vm_t *vm, nxt_array_t *array) return NULL; } - snprintf(compl, len, "%s.%s", obj->name.start, string.start); + nxt_sprintf(compl, compl + len, "%s.%s%Z", obj->name.start, + string.start); completions[n].length = len; completions[n++].start = (u_char *) compl; @@ -710,7 +710,7 @@ njs_builtin_completions(njs_vm_t *vm, nxt_array_t *array) return NULL; } - snprintf(compl, len, "%.*s", (int) ev->name.length, ev->name.start); + nxt_sprintf(compl, compl + len, "%V%Z", &ev->name); completions[n].length = len; completions[n++].start = (u_char *) compl; @@ -728,9 +728,8 @@ njs_builtin_completions(njs_vm_t *vm, nxt_array_t *array) return NULL; } - snprintf(compl, len, "%.*s.%.*s", (int) ev->name.length, - ev->name.start, (int) ext_prop->name.length, - ext_prop->name.start); + nxt_sprintf(compl, compl + len, "%V.%V%Z", &ev->name, + &ext_prop->name); completions[n].length = len; completions[n++].start = (u_char *) compl; diff --git a/njs/njs_date.c b/njs/njs_date.c index 7b28ec9a..eabee2ef 100644 --- a/njs/njs_date.c +++ b/njs/njs_date.c @@ -984,9 +984,8 @@ njs_date_prototype_to_utc_string(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused) { double time; - size_t size; time_t clock; - u_char buf[NJS_DATE_TIME_LEN]; + u_char buf[NJS_DATE_TIME_LEN], *p; struct tm tm; static const char *week[] = { "Sun", "Mon", "Tue", "Wed", @@ -1001,13 +1000,12 @@ njs_date_prototype_to_utc_string(njs_vm_t *vm, njs_value_t *args, clock = time / 1000; gmtime_r(&clock, &tm); - size = snprintf((char *) buf, NJS_DATE_TIME_LEN, + p = nxt_sprintf(buf, buf + NJS_DATE_TIME_LEN, "%s %s %02d %4d %02d:%02d:%02d GMT", - week[tm.tm_wday], month[tm.tm_mon], - tm.tm_mday, tm.tm_year + 1900, - tm.tm_hour, tm.tm_min, tm.tm_sec); + week[tm.tm_wday], month[tm.tm_mon], tm.tm_mday, + tm.tm_year + 1900, tm.tm_hour, tm.tm_min, tm.tm_sec); - return njs_string_new(vm, &vm->retval, buf, size, size); + return njs_string_new(vm, &vm->retval, buf, p - buf, p - buf); } vm->retval = njs_string_invalid_date; @@ -1029,9 +1027,8 @@ njs_date_to_string(njs_vm_t *vm, njs_value_t *retval, const njs_value_t *date) { int32_t year; double time; - size_t size; time_t clock; - u_char buf[NJS_ISO_DATE_TIME_LEN]; + u_char buf[NJS_ISO_DATE_TIME_LEN], *p; struct tm tm; time = date->data.u.date->time; @@ -1043,14 +1040,13 @@ njs_date_to_string(njs_vm_t *vm, njs_value_t *retval, const njs_value_t *date) year = tm.tm_year + 1900; - size = snprintf((char *) buf, NJS_ISO_DATE_TIME_LEN, + p = nxt_sprintf(buf, buf + NJS_ISO_DATE_TIME_LEN, (year < 0) ? "%07d-%02d-%02dT%02d:%02d:%02d.%03dZ" : "%04d-%02d-%02dT%02d:%02d:%02d.%03dZ", - year, tm.tm_mon + 1, tm.tm_mday, - tm.tm_hour, tm.tm_min, tm.tm_sec, - (int) ((int64_t) time % 1000)); + year, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, + tm.tm_sec, (int) ((int64_t) time % 1000)); - return njs_string_new(vm, retval, buf, size, size); + return njs_string_new(vm, retval, buf, p - buf, p - buf); } vm->retval = njs_string_invalid_date; diff --git a/njs/njs_json.c b/njs/njs_json.c index a5432e4f..8c25dca8 100644 --- a/njs/njs_json.c +++ b/njs/njs_json.c @@ -2069,13 +2069,12 @@ const njs_object_init_t njs_json_object_init = { static nxt_int_t njs_dump_value(njs_json_stringify_t *stringify, const njs_value_t *value) { - size_t len; njs_ret_t ret; nxt_str_t str; nxt_uint_t written; njs_value_t str_val; const njs_extern_t *ext_proto; - char buf[32]; + u_char buf[32], *p; njs_ret_t (*to_string)(njs_vm_t *, njs_value_t *, const njs_value_t *); @@ -2243,9 +2242,9 @@ njs_dump_value(njs_json_stringify_t *stringify, const njs_value_t *value) return njs_json_buf_append(stringify, (char *) str.start, str.length); default: - len = snprintf(buf, sizeof(buf), "[Unknown value type:%d]", - value->type); - return njs_json_buf_append(stringify, buf, len); + p = nxt_sprintf(buf, buf + nxt_length(buf), "[Unknown value type:%uD]", + value->type); + return njs_json_buf_append(stringify, (char *) buf, p - buf); } return ret; diff --git a/njs/njs_number.h b/njs/njs_number.h index 3e940673..769ef3bd 100644 --- a/njs/njs_number.h +++ b/njs/njs_number.h @@ -62,11 +62,12 @@ njs_char_to_hex(u_char c) nxt_inline void njs_uint32_to_string(njs_value_t *value, uint32_t u32) { - size_t size; + u_char *dst, *p; - size = snprintf((char *) njs_string_short_start(value), - NJS_STRING_SHORT, "%u", u32); - njs_string_short_set(value, size, size); + dst = njs_string_short_start(value); + p = nxt_sprintf(dst, dst + NJS_STRING_SHORT, "%uD", u32); + + njs_string_short_set(value, p - dst, p - dst); } diff --git a/njs/njs_regexp.c b/njs/njs_regexp.c index f256b21c..e759ba03 100644 --- a/njs/njs_regexp.c +++ b/njs/njs_regexp.c @@ -378,10 +378,11 @@ njs_regexp_compile_trace_handler(nxt_trace_t *trace, nxt_trace_data_t *td, p = trace->handler(trace, td, start); if (vm->parser != NULL) { - njs_syntax_error(vm, "%s in %uD", start, vm->parser->lexer->line); + njs_syntax_error(vm, "%*s in %uD", (int) (p - start), start, + vm->parser->lexer->line); } else { - njs_syntax_error(vm, "%s", start); + njs_syntax_error(vm, "%*s", (int) (p - start), start); } return p; diff --git a/njs/njs_shell.c b/njs/njs_shell.c index 3b72c079..cc274d5c 100644 --- a/njs/njs_shell.c +++ b/njs/njs_shell.c @@ -719,7 +719,7 @@ next: continue; } - if (strncmp(text, (char *) var->name.start, cmpl->length) == 0) { + if (nxt_strncmp(text, var->name.start, cmpl->length) == 0) { return njs_editline(&var->name); } } @@ -769,8 +769,8 @@ next: suffix = njs_completion(cmpl->suffix_completions, cmpl->index++); - if (len != 0 && strncmp((char *) suffix->start, p, - nxt_min(len, suffix->length)) != 0) + if (len != 0 && nxt_strncmp(suffix->start, p, + nxt_min(len, suffix->length)) != 0) { continue; } @@ -781,8 +781,8 @@ next: return NULL; } - snprintf(completion, len, "%.*s%.*s", (int) (p - text), text, - (int) suffix->length, suffix->start); + nxt_sprintf((u_char *) completion, (u_char *) completion + len, + "%*s%V%Z", (int) (p - text), text, suffix); return completion; } @@ -803,7 +803,7 @@ next: continue; } - if (strncmp(text, (char *) suffix->start, cmpl->length) == 0) { + if (nxt_strncmp(text, suffix->start, cmpl->length) == 0) { return njs_editline(suffix); } } diff --git a/njs/njs_time.c b/njs/njs_time.c index f5b1fafe..58b589c9 100644 --- a/njs/njs_time.c +++ b/njs/njs_time.c @@ -100,7 +100,7 @@ njs_ret_t njs_clear_timeout(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, njs_index_t unused) { - u_char buf[16]; + u_char buf[16], *p; njs_ret_t ret; njs_event_t *event; nxt_lvlhsh_query_t lhq; @@ -110,9 +110,11 @@ njs_clear_timeout(njs_vm_t *vm, njs_value_t *args, nxt_uint_t nargs, return NJS_OK; } + p = nxt_sprintf(buf, buf + nxt_length(buf), "%uD", + (unsigned) args[1].data.u.number); + lhq.key.start = buf; - lhq.key.length = snprintf((char *) buf, sizeof(buf) - 1, "%u", - (unsigned) args[1].data.u.number); + lhq.key.length = p - buf; lhq.key_hash = nxt_djb_hash(lhq.key.start, lhq.key.length); lhq.proto = &njs_event_hash_proto; lhq.pool = vm->mem_pool; diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c index 90b5db41..74d92313 100644 --- a/njs/test/njs_unit_test.c +++ b/njs/test/njs_unit_test.c @@ -11288,15 +11288,14 @@ static njs_ret_t njs_unit_test_r_get_a_external(njs_vm_t *vm, njs_value_t *value, void *obj, uintptr_t data) { - char buf[16]; - size_t len; + u_char buf[16], *p; njs_unit_test_req_t *r; r = (njs_unit_test_req_t *) obj; - len = sprintf(buf, "%u", r->a); + p = nxt_sprintf(buf, buf + nxt_length(buf), "%uD", r->a); - return njs_string_create(vm, value, (u_char *) buf, len, 0); + return njs_string_create(vm, value, buf, p - buf, 0); } diff --git a/nxt/nxt_string.h b/nxt/nxt_string.h index 338c6809..3a6ec4be 100644 --- a/nxt/nxt_string.h +++ b/nxt/nxt_string.h @@ -44,6 +44,9 @@ nxt_upper_case(u_char c) #define nxt_cpymem(dst, src, n) (((u_char *) memcpy(dst, src, n)) + (n)) +#define nxt_strncmp(s1, s2, n) strncmp((char *) s1, (char *) s2, n) + + #define nxt_memset(buf, c, length) (void) (memset(buf, c, length)) diff --git a/nxt/nxt_trace.c b/nxt/nxt_trace.c index f442ae83..440a7f39 100644 --- a/nxt/nxt_trace.c +++ b/nxt/nxt_trace.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #include @@ -15,14 +16,14 @@ static u_char * nxt_last_handler(nxt_trace_t *trace, nxt_trace_data_t *td, u_char *start) { - int n; + u_char *p; ssize_t size; size = td->end - start; - n = vsnprintf((char *) start, size, td->fmt, td->args); + p = nxt_vsprintf(start, start + size, td->fmt, td->args); - if (n < size) { - start += n; + if (p - start < size) { + start = p; } return start; -- 2.47.3