Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.bin/ftp Make fetch_read() return size_t like fread() doe...



details:   https://anonhg.NetBSD.org/src/rev/ae9e591b2abd
branches:  trunk
changeset: 840352:ae9e591b2abd
user:      christos <christos%NetBSD.org@localhost>
date:      Thu Apr 04 00:36:09 2019 +0000

description:
Make fetch_read() return size_t like fread() does. It is bogus to
have one backing implementation that returns different values and
types than the other.  Handle error setting properly; i.e. bail
out if the internal read returned an error. Now we get a proper
error message when the the server resets our connection instead of
a warning that the right failed with an invalid argument.

The server used for testing was:
        http://capeweather.dyndns.org:8080/graphs/3474.png
Which seems to be unreliable :-)

diffstat:

 usr.bin/ftp/fetch.c |  14 +++++++++-----
 usr.bin/ftp/ssl.c   |  34 ++++++++++++++++++----------------
 usr.bin/ftp/ssl.h   |   4 ++--
 3 files changed, 29 insertions(+), 23 deletions(-)

diffs (169 lines):

diff -r 6592aed0608f -r ae9e591b2abd usr.bin/ftp/fetch.c
--- a/usr.bin/ftp/fetch.c       Wed Apr 03 22:10:49 2019 +0000
+++ b/usr.bin/ftp/fetch.c       Thu Apr 04 00:36:09 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: fetch.c,v 1.230 2018/02/11 02:51:58 christos Exp $     */
+/*     $NetBSD: fetch.c,v 1.231 2019/04/04 00:36:09 christos Exp $     */
 
 /*-
  * Copyright (c) 1997-2015 The NetBSD Foundation, Inc.
@@ -37,7 +37,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: fetch.c,v 1.230 2018/02/11 02:51:58 christos Exp $");
+__RCSID("$NetBSD: fetch.c,v 1.231 2019/04/04 00:36:09 christos Exp $");
 #endif /* not lint */
 
 /*
@@ -1640,10 +1640,14 @@
                        if (ischunked)
                                bufrem = MIN(chunksize, bufrem);
                        while (bufrem > 0) {
+                               size_t nr = MIN((off_t)bufsize, bufrem);
                                flen = fetch_read(xferbuf, sizeof(char),
-                                   MIN((off_t)bufsize, bufrem), fin);
-                               if (flen <= 0)
+                                   nr, fin);
+                               if (flen == 0) {
+                                       if (fetch_error(fin))
+                                               goto chunkerror;
                                        goto chunkdone;
+                               }
                                bytes += flen;
                                bufrem -= flen;
                                if (fwrite(xferbuf, sizeof(char), flen, fout)
@@ -1694,7 +1698,7 @@
        } while (ischunked);
 
 /* XXX: deal with optional trailer & CRLF here? */
-
+chunkerror:
        if (hash && !progress && bytes > 0) {
                if (bytes < mark)
                        (void)putc('#', ttyout);
diff -r 6592aed0608f -r ae9e591b2abd usr.bin/ftp/ssl.c
--- a/usr.bin/ftp/ssl.c Wed Apr 03 22:10:49 2019 +0000
+++ b/usr.bin/ftp/ssl.c Thu Apr 04 00:36:09 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ssl.c,v 1.6 2018/02/06 19:26:02 christos Exp $ */
+/*     $NetBSD: ssl.c,v 1.7 2019/04/04 00:36:09 christos Exp $ */
 
 /*-
  * Copyright (c) 1998-2004 Dag-Erling Coïdan Smørgrav
@@ -34,7 +34,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: ssl.c,v 1.6 2018/02/06 19:26:02 christos Exp $");
+__RCSID("$NetBSD: ssl.c,v 1.7 2019/04/04 00:36:09 christos Exp $");
 #endif
 
 #include <time.h>
@@ -348,7 +348,7 @@
        return 0;
 }
 
-ssize_t
+size_t
 fetch_read(void *ptr, size_t size, size_t nmemb, struct fetch_connect *conn)
 {
        struct timeval now, timeout, delta;
@@ -408,6 +408,7 @@
                else
                        rlen = fetch_nonssl_read(conn->sd, buf, len);
                if (rlen == 0) {
+                       conn->iseof = 1;
                        break;
                } else if (rlen > 0) {
                        len -= rlen;
@@ -415,9 +416,10 @@
                        total += rlen;
                        continue;
                } else if (rlen == FETCH_READ_ERROR) {
+                       conn->iserr = errno;
                        if (errno == EINTR)
                                fetch_cache_data(conn, start, total);
-                       return -1;
+                       return 0;
                }
                FD_ZERO(&readfds);
                while (!FD_ISSET(conn->sd, &readfds)) {
@@ -425,8 +427,8 @@
                        if (quit_time > 0) {
                                gettimeofday(&now, NULL);
                                if (!timercmp(&timeout, &now, >)) {
-                                       errno = ETIMEDOUT;
-                                       return -1;
+                                       conn->iserr = ETIMEDOUT;
+                                       return 0;
                                }
                                timersub(&timeout, &now, &delta);
                        }
@@ -435,7 +437,8 @@
                                quit_time > 0 ? &delta : NULL) < 0) {
                                if (errno == EINTR)
                                        continue;
-                               return -1;
+                               conn->iserr = errno;
+                               return 0;
                        }
                }
        }
@@ -451,7 +454,7 @@
 fetch_getln(char *str, int size, struct fetch_connect *conn)
 {
        size_t tmpsize;
-       ssize_t len;
+       size_t len;
        char c;
 
        if (conn->buf == NULL) {
@@ -474,13 +477,12 @@
        conn->buflen = 0;
        do {
                len = fetch_read(&c, sizeof(c), 1, conn);
-               if (len == -1) {
-                       conn->iserr = 1;
-                       return NULL;
-               }
                if (len == 0) {
-                       conn->iseof = 1;
-                       break;
+                       if (conn->iserr)
+                               return NULL;
+                       if (conn->iseof)
+                               break;
+                       abort();
                }
                conn->buf[conn->buflen++] = c;
                if (conn->buflen == conn->bufsize) {
@@ -532,8 +534,8 @@
        } else if (len == buflen - 1) { /* line too long */
                while (1) {
                        char c;
-                       ssize_t rlen = fetch_read(&c, sizeof(c), 1, conn);
-                       if (rlen <= 0 || c == '\n')
+                       size_t rlen = fetch_read(&c, sizeof(c), 1, conn);
+                       if (rlen == 0 || c == '\n')
                                break;
                }
                if (errormsg)
diff -r 6592aed0608f -r ae9e591b2abd usr.bin/ftp/ssl.h
--- a/usr.bin/ftp/ssl.h Wed Apr 03 22:10:49 2019 +0000
+++ b/usr.bin/ftp/ssl.h Thu Apr 04 00:36:09 2019 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: ssl.h,v 1.3 2015/09/12 19:38:42 wiz Exp $      */
+/*     $NetBSD: ssl.h,v 1.4 2019/04/04 00:36:09 christos Exp $ */
 
 /*-
  * Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -38,7 +38,7 @@
 struct fetch_connect *fetch_open(const char *, const char *);
 struct fetch_connect *fetch_fdopen(int, const char *);
 int fetch_close(struct fetch_connect *);
-ssize_t fetch_read(void *, size_t, size_t, struct fetch_connect *);
+size_t fetch_read(void *, size_t, size_t, struct fetch_connect *);
 char *fetch_getln(char *, int, struct fetch_connect *);
 int fetch_getline(struct fetch_connect *, char *, size_t, const char **);
 void fetch_set_ssl(struct fetch_connect *, void *);



Home | Main Index | Thread Index | Old Index