Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 18 May 2008 23:00:03 GMT
From:      Bruce Cran <bruce@cran.org.uk>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: bin/122925: sftp(1) duplicates filename when get listing directory on CDROM
Message-ID:  <200805182300.m4IN03CT016374@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/122925; it has been noted by GNATS.

From: Bruce Cran <bruce@cran.org.uk>
To: bug-followup@FreeBSD.org, stast@bsdportal.ru
Cc:  
Subject: Re: bin/122925: sftp(1) duplicates filename when get listing directory
 on CDROM
Date: Sun, 18 May 2008 23:52:40 +0100

 This is occurring because sftp-server expects readdir(3) to return NULL 
 for a given DIR* twice in a row after all the files have been retrieved. 
   It seems that under certain conditions that isn't true.
 
 The client sends an FXP_READDIR command; the server loops calling 
 readdir() until it gets a NULL back.  At this point it sends the results 
 back to the client, but doesn't appear to tell it it already has all the 
 entries. Instead, the client sends another FXP_READDIR, at which point 
 the server again calls readdir() with the existing DIR*, which has 
 already once before returned NULL.  Normally readdir() does return NULL 
 for a second time and the client gets back SSH2_FX_EOF.  Occasionally 
 however, readdir will just start reading the directory contents all over 
 again.
 
 The following program also shows the same behaviour, but less regularly.
 
 #include <stdio.h>
 #include <sys/types.h>
 #include <dirent.h>
 
 int main()
 {
 	DIR *dp = opendir("/cdrom/");
 
 	if (dp == NULL)
 		return (-1);
 
 	struct dirent *d = NULL;
 
 	do {
 		d = readdir(dp);
 	} while (d != NULL);
 
 	d = readdir(dp);
 	if (d != NULL)
 		printf("readdir is starting again\n");
 
 	closedir(dp);
 	return 0;
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200805182300.m4IN03CT016374>