diff options
Diffstat (limited to 'crypto/heimdal/appl/ftp/ftp/ftp.c')
-rw-r--r-- | crypto/heimdal/appl/ftp/ftp/ftp.c | 85 |
1 files changed, 45 insertions, 40 deletions
diff --git a/crypto/heimdal/appl/ftp/ftp/ftp.c b/crypto/heimdal/appl/ftp/ftp/ftp.c index a6cb90e..0a00bd2 100644 --- a/crypto/heimdal/appl/ftp/ftp/ftp.c +++ b/crypto/heimdal/appl/ftp/ftp/ftp.c @@ -32,7 +32,7 @@ */ #include "ftp_locl.h" -RCSID ("$Id: ftp.c,v 1.75.2.1 2004/08/20 14:59:06 lha Exp $"); +RCSID ("$Id: ftp.c 16650 2006-01-24 08:16:08Z lha $"); struct sockaddr_storage hisctladdr_ss; struct sockaddr *hisctladdr = (struct sockaddr *)&hisctladdr_ss; @@ -79,6 +79,7 @@ hookup (const char *host, int port) strlcpy (hostnamebuf, host, sizeof(hostnamebuf)); hostname = hostnamebuf; + s = -1; for (a = ai; a != NULL; a = a->ai_next) { s = socket (a->ai_family, a->ai_socktype, a->ai_protocol); if (s < 0) @@ -100,12 +101,13 @@ hookup (const char *host, int port) warn ("connect %s", addrstr); close (s); + s = -1; continue; } break; } freeaddrinfo (ai); - if (error < 0) { + if (s < 0) { warnx ("failed to contact %s", host); code = -1; return NULL; @@ -164,7 +166,7 @@ login (char *host) { char tmp[80]; char defaultpass[128]; - char *user, *pass, *acct; + char *userstr, *pass, *acctstr; int n, aflag = 0; char *myname = NULL; @@ -173,7 +175,7 @@ login (char *host) if (pw != NULL) myname = pw->pw_name; - user = pass = acct = 0; + userstr = pass = acctstr = 0; if(sec_login(host)) printf("\n*** Using plaintext user and password ***\n\n"); @@ -181,11 +183,11 @@ login (char *host) printf("Authentication successful.\n\n"); } - if (ruserpass (host, &user, &pass, &acct) < 0) { + if (ruserpass (host, &userstr, &pass, &acctstr) < 0) { code = -1; return (0); } - while (user == NULL) { + while (userstr == NULL) { if (myname) printf ("Name (%s:%s): ", host, myname); else @@ -194,19 +196,19 @@ login (char *host) if (fgets (tmp, sizeof (tmp) - 1, stdin) != NULL) tmp[strlen (tmp) - 1] = '\0'; if (*tmp == '\0') - user = myname; + userstr = myname; else - user = tmp; + userstr = tmp; } - strlcpy(username, user, sizeof(username)); - n = command("USER %s", user); + strlcpy(username, userstr, sizeof(username)); + n = command("USER %s", userstr); if (n == COMPLETE) n = command("PASS dummy"); /* DK: Compatibility with gssftp daemon */ else if(n == CONTINUE) { if (pass == NULL) { char prompt[128]; if(myname && - (!strcmp(user, "ftp") || !strcmp(user, "anonymous"))) { + (!strcmp(userstr, "ftp") || !strcmp(userstr, "anonymous"))) { snprintf(defaultpass, sizeof(defaultpass), "%s@%s", myname, mydomain); snprintf(prompt, sizeof(prompt), @@ -219,7 +221,7 @@ login (char *host) } if (pass == NULL) { pass = defaultpass; - des_read_pw_string (tmp, sizeof (tmp), prompt, 0); + UI_UTIL_read_pw_string (tmp, sizeof (tmp), prompt, 0); if (tmp[0]) pass = tmp; } @@ -228,16 +230,16 @@ login (char *host) } if (n == CONTINUE) { aflag++; - acct = tmp; - des_read_pw_string (acct, 128, "Account:", 0); - n = command ("ACCT %s", acct); + acctstr = tmp; + UI_UTIL_read_pw_string (acctstr, 128, "Account:", 0); + n = command ("ACCT %s", acctstr); } if (n != COMPLETE) { warnx ("Login failed."); return (0); } - if (!aflag && acct != NULL) - command ("ACCT %s", acct); + if (!aflag && acctstr != NULL) + command ("ACCT %s", acctstr); if (proxy) return (1); for (n = 0; n < macnum; ++n) { @@ -351,7 +353,7 @@ getreply (int expecteof) continue; case '\n': *p++ = '\0'; - if(isdigit(buf[0])){ + if(isdigit((unsigned char)buf[0])){ sscanf(buf, "%d", &code); if(code == 631){ code = 0; @@ -390,15 +392,15 @@ getreply (int expecteof) osa.sa_handler (SIGINT); #endif if (code == 227 || code == 229) { - char *p; - - p = strchr (reply_string, '('); - if (p) { - p++; - strlcpy(pasv, p, sizeof(pasv)); - p = strrchr(pasv, ')'); - if (p) - *p = '\0'; + char *q; + + q = strchr (reply_string, '('); + if (q) { + q++; + strlcpy(pasv, q, sizeof(pasv)); + q = strrchr(pasv, ')'); + if (q) + *q = '\0'; } } return code / 100; @@ -727,6 +729,8 @@ sendrequest (char *cmd, char *local, char *remote, char *lmode, int printnames) case TYPE_L: rc = lseek (fileno (fin), restart_point, SEEK_SET); break; + default: + abort(); } if (rc < 0) { warn ("local: %s", local); @@ -859,7 +863,7 @@ void recvrequest (char *cmd, char *local, char *remote, char *lmode, int printnames, int local_given) { - FILE *fout, *din = 0; + FILE *fout = NULL, *din = NULL; int (*closefunc) (FILE *); sighand oldintr, oldintp; int c, d, is_retr, tcrflag, bare_lfs = 0; @@ -1166,7 +1170,7 @@ parse_epsv (const char *str) } static int -parse_pasv (struct sockaddr_in *sin, const char *str) +parse_pasv (struct sockaddr_in *sin4, const char *str) { int a0, a1, a2, a3, p0, p1; @@ -1192,11 +1196,11 @@ parse_pasv (struct sockaddr_in *sin, const char *str) printf ("Can't parse passive mode string.\n"); return -1; } - memset (sin, 0, sizeof(*sin)); - sin->sin_family = AF_INET; - sin->sin_addr.s_addr = htonl ((a0 << 24) | (a1 << 16) | + memset (sin4, 0, sizeof(*sin4)); + sin4->sin_family = AF_INET; + sin4->sin_addr.s_addr = htonl ((a0 << 24) | (a1 << 16) | (a2 << 8) | a3); - sin->sin_port = htons ((p0 << 8) | p1); + sin4->sin_port = htons ((p0 << 8) | p1); return 0; } @@ -1318,10 +1322,10 @@ noport: verbose = overbose; if (result == ERROR) { - struct sockaddr_in *sin = (struct sockaddr_in *)data_addr; + struct sockaddr_in *sin4 = (struct sockaddr_in *)data_addr; - unsigned int a = ntohl(sin->sin_addr.s_addr); - unsigned int p = ntohs(sin->sin_port); + unsigned int a = ntohl(sin4->sin_addr.s_addr); + unsigned int p = ntohs(sin4->sin_port); if (data_addr->sa_family != AF_INET) { warnx ("remote server doesn't support EPRT"); @@ -1544,7 +1548,7 @@ abortpt (int sig) void proxtrans (char *cmd, char *local, char *remote) { - sighand oldintr; + sighand oldintr = NULL; int secndflag = 0, prox_type, nfnd; char *cmd2; fd_set mask; @@ -1616,7 +1620,8 @@ abort: pswitch (1); if (ptabflg) code = -1; - signal (SIGINT, oldintr); + if (oldintr) + signal (SIGINT, oldintr); return; } if (cpend) @@ -1751,8 +1756,8 @@ abort_remote (FILE * din) errx (1, "fd too large"); FD_SET (fileno (cin), &mask); if (din) { - if (fileno (din) >= FD_SETSIZE) - errx (1, "fd too large"); + if (fileno (din) >= FD_SETSIZE) + errx (1, "fd too large"); FD_SET (fileno (din), &mask); } if ((nfnd = empty (&mask, 10)) <= 0) { |