autofs-5.1.7 - use snprintf() when constructing hosts mapent From: Ian Kent Using multiple strcpy() and strcat() functions when constructing the hosts map offset for each export is much slower than using a single sprintf() for each. Signed-off-by: Ian Kent --- CHANGELOG | 1 + modules/lookup_hosts.c | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 1bd6ac7f..d613e5ca 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -2,6 +2,7 @@ - add xdr_exports(). - remove mount.x and rpcgen dependencies. - dont use realloc in host exports list processing. +- use sprintf() when constructing hosts mapent. 25/01/2021 autofs-5.1.7 - make bind mounts propagation slave by default. diff --git a/modules/lookup_hosts.c b/modules/lookup_hosts.c index e3ee0ab8..c1ebb7f6 100644 --- a/modules/lookup_hosts.c +++ b/modules/lookup_hosts.c @@ -87,10 +87,12 @@ int lookup_read_master(struct master *master, time_t age, void *context) static char *get_exports(struct autofs_point *ap, const char *host) { char buf[MAX_ERR_BUF]; + char entry[PATH_MAX + 1]; char *mapent; struct exportinfo *exp, *this; size_t hostlen = strlen(host); size_t mapent_len; + int len, pos; debug(ap->logopt, MODPREFIX "fetchng export list for %s", host); @@ -114,21 +116,19 @@ static char *get_exports(struct autofs_point *ap, const char *host) } *mapent = 0; + pos = 0; this = exp; - while (this) { - if (!*mapent) - strcpy(mapent, "\""); - else - strcat(mapent, " \""); - strcat(mapent, this->dir); - strcat(mapent, "\""); - - strcat(mapent, " \""); - strcat(mapent, host); - strcat(mapent, ":"); - strcat(mapent, this->dir); - strcat(mapent, "\""); + if (this) { + len = sprintf(mapent, "\"%s\" \"%s:%s\"", + this->dir, host, this->dir); + pos += len; + this = this->next; + } + while (this) { + len = sprintf(mapent + pos, " \"%s\" \"%s:%s\"", + this->dir, host, this->dir); + pos += len; this = this->next; } rpc_exports_free(exp);