Commit 32178092 authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

Robson Braga Araujo filed bug report #1776235

(http://curl.haxx.se/bug/view.cgi?id=1776235) about ftp requests with NOBODY
on a directory would do a "SIZE (null)" request. This is now fixed and test
case 1000 was added to verify.
parent f3c7adcb
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -6,6 +6,12 @@

                                  Changelog

Daniel S (18 August 2007)
- Robson Braga Araujo filed bug report #1776235
  (http://curl.haxx.se/bug/view.cgi?id=1776235) about ftp requests with NOBODY
  on a directory would do a "SIZE (null)" request. This is now fixed and test
  case 1000 was added to verify.

Daniel S (17 August 2007)
- Song Ma provided a patch that cures a problem libcurl has when doing resume
  HTTP PUT using Digest authentication. Test case 5320 and 5322 were also
+2 −1
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ This release includes the following bugfixes:
 o memory leak when handling compressed data streams from broken servers
 o no NTLM unicode response
 o resume HTTP PUT using Digest authentication
 o FTP NOBODY requests on directories sent "SIZE (null)"

This release includes the following known bugs:

@@ -64,6 +65,6 @@ advice from friends like these:
 Daniel Cater, Colin Hogben, Jofell Gallardo, Daniel Johnson,
 Ralf S. Engelschall, James Housley, Chris Flerackers, Patrick Monnerat,
 Jayesh A Shah, Greg Zavertnik, Peter O'Gorman, Greg Morse, Dmitriy Sergeyev,
 Scott Cantor, Allen Pulsifer, Andrew Wansink
 Scott Cantor, Allen Pulsifer, Andrew Wansink, Robson Braga Araujo
 
        Thanks! (and sorry if I forgot to mention someone)
+23 −5
Original line number Diff line number Diff line
@@ -140,6 +140,19 @@ static int ftp_need_type(struct connectdata *conn,
#define NBFTPSENDF(x,y,z)  if ((result = Curl_nbftpsendf(x,y,z)) != CURLE_OK) \
                              return result


/*
 * NOTE: back in the old days, we added code in the FTP code that made NOBODY
 * requests on files respond with headers passed to the client/stdout that
 * looked like HTTP ones.
 *
 * This approach is not very elegant, it causes confusion and is error-prone.
 * It is subject for removal at the next (or at least a future) soname bump.
 * Until then you can test the effects of the removal by undefining the
 * following define named CURL_FTP_HTTPSTYLE_HEAD.
 */
#define CURL_FTP_HTTPSTYLE_HEAD 1

static void freedirs(struct connectdata *conn)
{
  struct ftp_conn *ftpc = &conn->proto.ftpc;
@@ -1303,8 +1316,8 @@ static CURLcode ftp_state_post_size(struct connectdata *conn)
  CURLcode result = CURLE_OK;
  struct FTP *ftp = conn->data->reqdata.proto.ftp;

  if(ftp->no_transfer) {
    /* if a "head"-like request is being made */
  if(ftp->no_transfer && ftp->file) {
    /* if a "head"-like request is being made (on a file) */

    /* Determine if server can respond to REST command and therefore
       whether it supports range */
@@ -1323,8 +1336,8 @@ static CURLcode ftp_state_post_type(struct connectdata *conn)
  CURLcode result = CURLE_OK;
  struct FTP *ftp = conn->data->reqdata.proto.ftp;

  if(ftp->no_transfer) {
    /* if a "head"-like request is being made */
  if(ftp->no_transfer && ftp->file) {
    /* if a "head"-like request is being made (on a file) */

    /* we know ftp->file is a valid pointer to a file name */
    NBFTPSENDF(conn, "SIZE %s", ftp->file);
@@ -1898,6 +1911,7 @@ static CURLcode ftp_state_mdtm_resp(struct connectdata *conn,
        data->info.filetime = (long)curl_getdate(buf, &secs);
      }

#ifdef CURL_FTP_HTTPSTYLE_HEAD
      /* If we asked for a time of the file and we actually got one as well,
         we "emulate" a HTTP-style header in our output. */

@@ -1928,6 +1942,7 @@ static CURLcode ftp_state_mdtm_resp(struct connectdata *conn,
        if(result)
          return result;
      } /* end of a ridiculous amount of conditionals */
#endif
    }
    break;
  default:
@@ -2096,6 +2111,7 @@ static CURLcode ftp_state_size_resp(struct connectdata *conn,
  filesize = (ftpcode == 213)?curlx_strtoofft(buf+4, NULL, 0):-1;

  if(instate == FTP_SIZE) {
#ifdef CURL_FTP_HTTPSTYLE_HEAD
    if(-1 != filesize) {
      snprintf(buf, sizeof(data->state.buffer),
               "Content-Length: %" FORMAT_OFF_T "\r\n", filesize);
@@ -2103,6 +2119,7 @@ static CURLcode ftp_state_size_resp(struct connectdata *conn,
      if(result)
        return result;
    }
#endif
    result = ftp_state_post_size(conn);
  }
  else if(instate == FTP_RETR_SIZE)
@@ -2125,13 +2142,14 @@ static CURLcode ftp_state_rest_resp(struct connectdata *conn,
  switch(instate) {
  case FTP_REST:
  default:
#ifdef CURL_FTP_HTTPSTYLE_HEAD
    if (ftpcode == 350) {
      result = Curl_client_write(conn, CLIENTWRITE_BOTH,
                               (char *)"Accept-ranges: bytes\r\n", 0);
      if(result)
        return result;
    }

#endif
    result = ftp_state_post_rest(conn);
    break;

+1 −1
Original line number Diff line number Diff line
@@ -43,4 +43,4 @@ EXTRA_DIST = test1 test108 test117 test127 test20 test27 test34 test46 \
 test296 test297 test298 test610 test611 test612 test406 test407 test408   \
 test409 test613 test614 test700 test701 test702 test704 test705 test703   \
 test706 test707 test350 test351 test352 test353 test289 test540 test354   \
 test231 test1001 test1002
 test231 test1000 test1001 test1002

tests/data/test1000

0 → 100644
+44 −0
Original line number Diff line number Diff line
<testcase>
<info>
<keywords>
FTP
PASV
LIST
NOBODY
</keywords>
</info>
#
# Server-side
<reply>
# When doing LIST, we get the default list output hard-coded in the test
# FTP server
<datacheck>
</datacheck>
</reply>

#
# Client-side
<client>
<server>
ftp
</server>
 <name>
FTP dir list PASV with -I
 </name>
 <command>
ftp://%HOSTIP:%FTPPORT/1000/ -I
</command>
</client>

#
# Verify data after the test has been "shot"
<verify>
<protocol>
USER anonymous
PASS ftp@example.com
PWD
CWD 1000
QUIT
</protocol>
</verify>
</testcase>