Date: Thu, 6 Jan 2011 23:23:39 GMT From: Aleksey <rndfax@yandex.ru> To: freebsd-gnats-submit@FreeBSD.org Subject: misc/153748: [libfetch] in ftp_request: closing of the connection happens too earlier Message-ID: <201101062323.p06NNdXi041455@red.freebsd.org> Resent-Message-ID: <201101062330.p06NU5jl097094@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 153748 >Category: misc >Synopsis: [libfetch] in ftp_request: closing of the connection happens too earlier >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Thu Jan 06 23:30:05 UTC 2011 >Closed-Date: >Last-Modified: >Originator: Aleksey >Release: >Organization: >Environment: FreeBSD r2d2.homenet 8.1-STABLE FreeBSD 8.1-STABLE #7 r215308: Sun Nov 14 21:31:16 UTC 2010 admin@r2d2.homenet:/usr/obj/usr/src/sys/kernel i386 >Description: libfetch/ftp.c - ftp_request sends command QUIT when it is called only for stat. Therefore, after calling fetchStatURL(..) it's not possible to work with this ftp-cached_connection, because the server closes this connection. >How-To-Repeat: #include <sys/param.h> #include <stdio.h> #include <fetch.h> int main() { FILE *ftp; const char *url = "ftp://ftp2.freebsd.org/pub/FreeBSD/ports/i386/packages-8-stable/UPDATING"; struct url_stat f_stat; if (fetchStatURL(url, &f_stat, "") == -1) { printf("fetchStatURL error\n"); return -1; } if ((ftp = fetchGetURL(url, "")) == NULL) { printf("fetchGetURL error\n"); return -1; } fclose(ftp); return 0; } this code produces "Broken pipe". >Fix: To fix this problem, don't send QUIT in the ftp_request(..), just decrease the count reference to this cached connection. Patch attached. Patch attached with submission follows: --- /usr/src/lib/libfetch/ftp.c 2011-01-06 03:00:01.000000000 +0000 +++ /usr/src/lib/libfetch/ftp.c 2011-01-06 03:00:27.000000000 +0000 @@ -1132,7 +1132,7 @@ /* just a stat */ if (strcmp(op, "STAT") == 0) { - ftp_disconnect(conn); + fetch_close(conn); return (FILE *)1; /* bogus return value */ } if (strcmp(op, "STOR") == 0 || strcmp(op, "APPE") == 0) >Release-Note: >Audit-Trail: >Unformatted:
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201101062323.p06NNdXi041455>