diff --git a/include/libbb.h b/include/libbb.h index 6a2a2d640..6077f64c9 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -347,7 +347,7 @@ unsigned long long monotonic_ms(void) FAST_FUNC; unsigned monotonic_sec(void) FAST_FUNC; extern void chomp(char *s) FAST_FUNC; -extern void trim(char *s) FAST_FUNC; +extern char *trim(char *s) FAST_FUNC; extern char *skip_whitespace(const char *) FAST_FUNC; extern char *skip_non_whitespace(const char *) FAST_FUNC; extern char *skip_dev_pfx(const char *tty_name) FAST_FUNC; diff --git a/libbb/trim.c b/libbb/trim.c index 16cb4fbb0..e47fec74e 100644 --- a/libbb/trim.c +++ b/libbb/trim.c @@ -10,9 +10,10 @@ #include "libbb.h" -void FAST_FUNC trim(char *s) +char* FAST_FUNC trim(char *s) { size_t len = strlen(s); + size_t old = len; /* trim trailing whitespace */ while (len && isspace(s[len-1])) @@ -26,5 +27,12 @@ void FAST_FUNC trim(char *s) memmove(s, nws, len); } } - s[len] = '\0'; + + s += len; + /* If it was a "const char*" which does not need trimming, + * avoid superfluous store */ + if (old != len) + *s = '\0'; + + return s; } diff --git a/mailutils/sendmail.c b/mailutils/sendmail.c index 346de2712..65895f0ec 100644 --- a/mailutils/sendmail.c +++ b/mailutils/sendmail.c @@ -166,9 +166,8 @@ static char *angle_address(char *str) { char *s, *e; - trim(str); - e = last_char_is(str, '>'); - if (e) { + e = trim(str); + if (e != str && e[-1] == '>') { s = strrchr(str, '<'); if (s) { *e = '\0'; diff --git a/miscutils/lsscsi.c b/miscutils/lsscsi.c index b69ff1eef..c86630e31 100644 --- a/miscutils/lsscsi.c +++ b/miscutils/lsscsi.c @@ -37,9 +37,8 @@ static char *get_line(const char *filename, char *buf, unsigned *bufsize_p) if (sz < 0) sz = 0; buf[sz] = '\0'; - trim(buf); - sz = strlen(buf) + 1; + sz = (trim(buf) - buf) + 1; bufsize -= sz; buf += sz; buf[0] = '\0'; diff --git a/procps/sysctl.c b/procps/sysctl.c index 619f4f1e4..ef1a1b99f 100644 --- a/procps/sysctl.c +++ b/procps/sysctl.c @@ -257,12 +257,16 @@ static int sysctl_handle_preload_file(const char *filename) parse_flags &= ~PARSE_EOL_COMMENTS; // NO (only first char) - comments are recognized even if not first char while (config_read(parser, token, 2, 2, "#=", parse_flags)) { char *tp; - trim(token[0]); + trim(token[1]); + tp = trim(token[0]); sysctl_dots_to_slashes(token[0]); - tp = xasprintf("%s=%s", token[0], token[1]); - sysctl_act_on_setting(tp); - free(tp); + /* ^^^converted in-place. tp still points to NUL */ + /* now, add "=TOKEN1" */ + *tp++ = '='; + overlapping_strcpy(tp, token[1]); + + sysctl_act_on_setting(token[0]); } if (ENABLE_FEATURE_CLEAN_UP) config_close(parser);