From nobody Fri May 22 17:58:08 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4gMY0d3KWTz6fLpx for ; Fri, 22 May 2026 17:58:09 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R13" (not verified)) by mx1.freebsd.org (Postfix) with ESMTPS id 4gMY0c66dlz4Mql for ; Fri, 22 May 2026 17:58:08 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1779472688; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=K0dy9TYYhHlFdYVMydvALD7urkmcSFcbxXLE0rtKQgM=; b=GgJiO8fSuQpGAEEVOEkhFd2zPTEfV1J9ZKgjbexprYEwptXC+KIiACy+hCU10C1kkIgktY Pun5mggpivMJW/5KfR5dwDig0mkoD57nRYDhaWpxyYqBGGe3br7Nr6JddRkRzgPsr1ZSnb 32PtCuVJT0u6Qtb+SgqO6Ipd/FwUOp9frTrcstMirFeJbLbksy3f0nXlvNEZLcULLWeffG CxthMoeg6fM3V0eaxGx2qbHv+c0tRxsa6RNi62Oyk6VVdoK4mvG5xyuDJX7DI1VtQ9UuVT S37V27ci8zk76y2WFKxW60y7tPS8MWnpOJn/pF5UalW+hBAPR+UdO8g7zqMEkQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1779472688; a=rsa-sha256; cv=none; b=aCqH81RImu+drtim8pP8AC8qBeGQ0CyVA0O7M9mziPLQSLpB55+CrsSvRTu36uH9Es7wAa 06cxolwdwYhE/aGSsnH2sr1bVNPF81uwPfRUF5Rsf585bgt1zTdmrwRGTkSy9/VvM7UX/a lzxiFwcw/uj5+OY9JcKF5Y8meRpxMXhivOoduYRkv6UlXTab0aAU/IWLBmWp8KDvLOUS3R ZzGiKHLrLlLczPcUP3kI174tTfRnXiB7H7A7oX1BF+fuhGMveAUNJN9tV0JJ1OUMx2K3z2 s2QsCVLLzavDnYP4bkVYuEi0x0/2JbuiAE8BEsdjvWEXxi5O98xLSiTw//e2QA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1779472688; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=K0dy9TYYhHlFdYVMydvALD7urkmcSFcbxXLE0rtKQgM=; b=Cc+y5TDB7OmMpf2MboYQuEHWyvwRY1Pk+QSk7N+UnhHbc2j0yIi6dRxX94yqFKz/NmCoal FXO4P61GRjy0bHoEDTjL0aRSNSKNCq1Smxtm7I6SneH1CVTzoiaTGk4Tj14tZlo5BWhTmG OKv4z/KQ/aHT+6E9Qf9uoUGHRuGpwZKd+Ri1lkDAi+N8w7NiGho6TXyHYMUzYSFiDVeZ9t 5FecLLERd3j5V6uits+revMO4xPQzD3J70mGL0vKoQmNY1SnSG8wSDB2Jpvz61TVLh8Yx4 FLR8EtwNbor4+PEwqnHfQ4v0Ou8JdyUpcw1nooNNoKBxsAypRJiBKAaJp8xW/A== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4gMY0c5Y8FzWqF for ; Fri, 22 May 2026 17:58:08 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3939a by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Fri, 22 May 2026 17:58:08 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Dag-Erling=?utf-8?Q? Sm=C3=B8rg?=rav Subject: git: 5fd928cf1cef - main - tftp: Replace fgets with getline List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org List-Id: List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: des X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 5fd928cf1cef21e0fc20ab7c2be156a0eeecdf40 Auto-Submitted: auto-generated Date: Fri, 22 May 2026 17:58:08 +0000 Message-Id: <6a109930.3939a.454d191e@gitrepo.freebsd.org> The branch main has been updated by des: URL: https://cgit.FreeBSD.org/src/commit/?id=5fd928cf1cef21e0fc20ab7c2be156a0eeecdf40 commit 5fd928cf1cef21e0fc20ab7c2be156a0eeecdf40 Author: Dag-Erling Smørgrav AuthorDate: 2026-05-22 17:57:20 +0000 Commit: Dag-Erling Smørgrav CommitDate: 2026-05-22 17:57:20 +0000 tftp: Replace fgets with getline MFC after: 1 week Reviewed by: markj Differential Revision: https://reviews.freebsd.org/D57072 --- usr.bin/tftp/main.c | 90 ++++++++++++++++++++++++++--------------------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/usr.bin/tftp/main.c b/usr.bin/tftp/main.c index 02a84f864071..849069fa9e8e 100644 --- a/usr.bin/tftp/main.c +++ b/usr.bin/tftp/main.c @@ -62,7 +62,6 @@ #include "tftp-options.h" #include "tftp.h" -#define MAXLINE (2 * MAXPATHLEN) #define TIMEOUT 5 /* secs between rexmt's */ typedef struct sockaddr_storage peeraddr; @@ -72,7 +71,7 @@ static jmp_buf toplevel; static int txrx_error; static int peer; -#define MAX_MARGV 20 +#define MAX_MARGV 32 static int margc; static char *margv[MAX_MARGV]; @@ -106,7 +105,7 @@ static const char *command_prompt(void); static void urihandling(char *URI); static void getusage(char *); -static void makeargv(char *line); +static void makeargv(char *argv0, char *line); static void putusage(char *); static void settftpmode(const char *); @@ -338,13 +337,13 @@ setpeer0(char *host, const char *lport) static void setpeer(int argc, char *argv[]) { - char line[MAXLINE]; + static char *line; + static size_t sz; if (argc < 2) { - strcpy(line, "Connect "); printf("(to) "); - fgets(&line[strlen(line)], sizeof line - strlen(line), stdin); - makeargv(line); + getline(&line, &sz, stdin); + makeargv(argv[0], line); argc = margc; argv = margv; } @@ -421,17 +420,16 @@ settftpmode(const char *newmode) static void put(int argc, char *argv[]) { - int fd; - int n; - char *cp, *targ, *path; - char line[MAXLINE]; + static char *line; + static size_t sz; + int fd, n; + char *cp, *targ, *path; struct stat sb; if (argc < 2) { - strcpy(line, "send "); printf("(file) "); - fgets(&line[strlen(line)], sizeof line - strlen(line), stdin); - makeargv(line); + getline(&line, &sz, stdin); + makeargv(argv[0], line); argc = margc; argv = margv; } @@ -531,17 +529,15 @@ putusage(char *s) static void get(int argc, char *argv[]) { - int fd; - int n; - char *cp; - char *src; - char line[MAXLINE]; + static char *line; + static size_t sz; + int fd, n; + char *cp, *src; if (argc < 2) { - strcpy(line, "get "); printf("(files) "); - fgets(&line[strlen(line)], sizeof line - strlen(line), stdin); - makeargv(line); + getline(&line, &sz, stdin); + makeargv(argv[0], line); argc = margc; argv = margv; } @@ -621,14 +617,14 @@ getusage(char *s) static void settimeoutpacket(int argc, char *argv[]) { + static char *line; + static size_t sz; int t; - char line[MAXLINE]; if (argc < 2) { - strcpy(line, "Packet timeout "); printf("(value) "); - fgets(&line[strlen(line)], sizeof line - strlen(line), stdin); - makeargv(line); + getline(&line, &sz, stdin); + makeargv(argv[0], line); argc = margc; argv = margv; } @@ -648,14 +644,14 @@ settimeoutpacket(int argc, char *argv[]) static void settimeoutnetwork(int argc, char *argv[]) { + static char *line; + static size_t sz; int t; - char line[MAXLINE]; if (argc < 2) { - strcpy(line, "Network timeout "); printf("(value) "); - fgets(&line[strlen(line)], sizeof line - strlen(line), stdin); - makeargv(line); + getline(&line, &sz, stdin); + makeargv(argv[0], line); argc = margc; argv = margv; } @@ -731,23 +727,22 @@ command_prompt(void) static void command(bool interactive, EditLine *el, History *hist, HistEvent *hep) { + static char *line; + static size_t sz; const struct cmd *c; const char *bp; - char *cp; - int len, num; - char line[MAXLINE]; + int len; for (;;) { if (interactive) { - if ((bp = el_gets(el, &num)) == NULL || num == 0) + if ((bp = el_gets(el, &len)) == NULL || len == 0) exit(0); - len = MIN(MAXLINE, num); - memcpy(line, bp, len); - line[len - 1] = '\0'; - history(hist, hep, H_ENTER, bp); + if ((size_t)len >= sz) + line = realloc(line, sz = len + 1); + strlcpy(line, bp, sz); + history(hist, hep, H_ENTER, line); } else { - line[0] = 0; - if (fgets(line, sizeof line , stdin) == NULL) { + if ((len = getline(&line, &sz, stdin)) <= 0) { if (feof(stdin)) { exit(txrx_error); } else { @@ -755,11 +750,11 @@ command(bool interactive, EditLine *el, History *hist, HistEvent *hep) } } } - if ((cp = strchr(line, '\n'))) - *cp = '\0'; + if (line[len - 1] == '\n') + line[--len] = '\0'; if (line[0] == 0) continue; - makeargv(line); + makeargv(NULL, line); if (margc == 0) continue; c = getcmd(margv[0]); @@ -808,12 +803,16 @@ getcmd(const char *name) * Slice a string up into argc/argv. */ static void -makeargv(char *line) +makeargv(char *argv0, char *line) { char *cp; char **argp = margv; margc = 0; + if (argv0 != NULL) { + *argp++ = argv0; + margc++; + } if ((cp = strchr(line, '\n')) != NULL) *cp = '\0'; for (cp = line; margc < MAX_MARGV - 1 && *cp != '\0';) { @@ -822,13 +821,14 @@ makeargv(char *line) if (*cp == '\0') break; *argp++ = cp; - margc += 1; + margc++; while (*cp != '\0' && !isspace(*cp)) cp++; if (*cp == '\0') break; *cp++ = '\0'; } + /* XXX warn about truncation if *cp != '\0'? */ *argp++ = 0; }