autofs-5.1.7 - eliminate some more alloca usage From: Ian Kent Quite a bit of the alloca(3) usage has been eliminated over time. Use malloc(3) for some more cases that might need to allocate a largish amount of storage. Signed-off-by: Ian Kent --- CHANGELOG | 1 + modules/lookup_program.c | 11 ++++++++++- modules/lookup_yp.c | 22 +++++++++++++++++++--- modules/parse_sun.c | 13 +++++++++++-- modules/replicated.c | 15 ++++----------- 5 files changed, 45 insertions(+), 17 deletions(-) --- autofs-5.1.7.orig/CHANGELOG +++ autofs-5.1.7/CHANGELOG @@ -78,6 +78,7 @@ - add missing description of null map option. - fix nonstrict offset mount fail handling. - fix concat_options() error handling. +- eliminate some more alloca usage. 25/01/2021 autofs-5.1.7 - make bind mounts propagation slave by default. --- autofs-5.1.7.orig/modules/lookup_program.c +++ autofs-5.1.7/modules/lookup_program.c @@ -636,7 +636,14 @@ int lookup_mount(struct autofs_point *ap char *ent = NULL; if (me->mapent) { - ent = alloca(strlen(me->mapent) + 1); + ent = malloc(strlen(me->mapent) + 1); + if (!ent) { + char buf[MAX_ERR_BUF]; + char *estr = strerror_r(errno, buf, MAX_ERR_BUF); + error(ap->logopt, MODPREFIX "malloc: %s", estr); + cache_unlock(mc); + goto out_free; + } strcpy(ent, me->mapent); } cache_unlock(mc); @@ -644,6 +651,8 @@ int lookup_mount(struct autofs_point *ap ap->entry->current = source; ret = ctxt->parse->parse_mount(ap, name, name_len, ent, ctxt->parse->context); + if (ent) + free(ent); goto out_free; } else { if (IS_MM(me) && !IS_MM_ROOT(me)) { --- autofs-5.1.7.orig/modules/lookup_yp.c +++ autofs-5.1.7/modules/lookup_yp.c @@ -254,7 +254,7 @@ int yp_all_master_callback(int status, c len = ypkeylen + 1 + vallen + 2; - buffer = alloca(len); + buffer = malloc(len); if (!buffer) { error(logopt, MODPREFIX "could not malloc parse buffer"); return 0; @@ -267,6 +267,8 @@ int yp_all_master_callback(int status, c master_parse_entry(buffer, timeout, logging, age); + free(buffer); + return 0; } @@ -368,7 +370,12 @@ int yp_all_callback(int status, char *yp return 0; } - mapent = alloca(vallen + 1); + mapent = malloc(vallen + 1); + if (!mapent) { + error(logopt, MODPREFIX "could not malloc mapent buffer"); + free(key); + return 0; + } strncpy(mapent, val, vallen); *(mapent + vallen) = '\0'; @@ -377,6 +384,7 @@ int yp_all_callback(int status, char *yp cache_unlock(mc); free(key); + free(mapent); if (ret == CHE_FAIL) return -1; @@ -904,7 +912,14 @@ int lookup_mount(struct autofs_point *ap } if (me && (me->source == source || *me->key == '/')) { mapent_len = strlen(me->mapent); - mapent = alloca(mapent_len + 1); + mapent = malloc(mapent_len + 1); + if (!mapent) { + char *estr = strerror_r(errno, buf, MAX_ERR_BUF); + error(ap->logopt, MODPREFIX "malloc: %s", estr); + cache_unlock(mc); + free(lkp_key); + return NSS_STATUS_TRYAGAIN; + } strcpy(mapent, me->mapent); } } @@ -929,6 +944,7 @@ int lookup_mount(struct autofs_point *ap ret = ctxt->parse->parse_mount(ap, key, key_len, mapent, ctxt->parse->context); + free(mapent); if (ret) { /* Don't update negative cache when re-connecting */ if (ap->flags & MOUNT_FLAG_REMOUNT) --- autofs-5.1.7.orig/modules/parse_sun.c +++ autofs-5.1.7/modules/parse_sun.c @@ -668,9 +668,16 @@ static int sun_mount(struct autofs_point } } + what = malloc(loclen + 1); + if (!what) { + char buf[MAX_ERR_BUF]; + char *estr = strerror_r(errno, buf, MAX_ERR_BUF); + error(ap->logopt, MODPREFIX "malloc: %s", estr); + return 1; + } + pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cur_state); if (!strcmp(fstype, "nfs") || !strcmp(fstype, "nfs4")) { - what = alloca(loclen + 1); memcpy(what, loc, loclen); what[loclen] = '\0'; @@ -709,7 +716,6 @@ static int sun_mount(struct autofs_point if (!loclen) what = NULL; else { - what = alloca(loclen + 1); if (*loc == ':') { loclen--; memcpy(what, loc + 1, loclen); @@ -728,6 +734,9 @@ static int sun_mount(struct autofs_point /* Generic mount routine */ rv = do_mount(ap, root, name, namelen, what, fstype, options); } + if (what) + free(what); + pthread_setcancelstate(cur_state, NULL); if (nonstrict && rv) --- autofs-5.1.7.orig/modules/replicated.c +++ autofs-5.1.7/modules/replicated.c @@ -1044,22 +1044,15 @@ done: static int add_path(struct host *hosts, const char *path, int len) { struct host *this; - char *tmp, *tmp2; - - tmp = alloca(len + 1); - if (!tmp) - return 0; - - strncpy(tmp, path, len); - tmp[len] = '\0'; + char *tmp; this = hosts; while (this) { if (!this->path) { - tmp2 = strdup(tmp); - if (!tmp2) + tmp = strdup(path); + if (!tmp) return 0; - this->path = tmp2; + this->path = tmp; } this = this->next; }