[Samba] patch: smbclient lost some files

Yasuoka Masahiko yasuoka at second-software.com
Fri Jul 18 03:32:58 GMT 2003

Dear developers,

I found a problem that 'smbclient' loses some files when it's creating
a tar ball.  A patch attached this message is for samba 2.2.8a and
fixes this problem.  Would you please check it?

I think there is a protocol mismatch with Windows 2000 at
cli_list_new() in libsmb/clilist.c (FIND FIRST2/FIND NEXT2). Samba
assumes that 'Last Name Offset' response field is points to 

   - the first octet of FileName field of the last file/directory

But responses from Windows 2000 points to

   - the first octet of the last file/directory entry.

As result, smbclient sets 'mask' incorrectly and Windows 2000 seems to
fail resuming the transaction and lost some files.

As far as I read 'CIFS technical reference', I think Samba is correct.
But I think we need a working around for this protocol mismatch.


  smbclient loses some files when it is creating a tar ball.


  OS:      Red Hat Linux/i386 (Linux2.4.20-18.8)
  cc:      gcc 3.2 20020903
  libc:    glibc-2.3.2 (RPM glibc-2.3.2-4.80.6)
  version:   2.2.8a
  Network: smbclient connects to a Windows 2000(SP4) box in same network.

How to Repeat:

  1. Make a share directory on Windows box.  The share directory
     includes a many many files and directories (26,000+ files and
     300+ directory).  Some directories have many files in it(950+).
  2. Create a tar ball of the share directory using smbclient.
  3. During creating a tar ball, run a job on Windows box like
     'dir /s /b [share directory]'
  4. tar ball (smbclient) lost some files (3-30 files).


    Yasuoka Masahiko (yasuoka at second-software.com)
    Second Software Inc.   http://www.second-software.com/
-------------- next part --------------
--- clilist.c-orig	2003-03-15 06:34:48.000000000 +0900
+++ clilist.c	2003-07-18 12:01:16.000000000 +0900
@@ -184,7 +184,12 @@ int cli_list_new(struct cli_state *cli,c
 			SSVAL(param,2,max_matches); /* max count */
 			SIVAL(param,6,0); /* ff_resume_key */
+			SSVAL(param,10,4+2);	/* resume required + close on end */
 			SSVAL(param,10,8+4+2);	/* continue + resume required + close on end */
 			p = param+12;
 			p += clistr_push(cli, param+12, mask, -1, 
@@ -246,6 +251,25 @@ int cli_list_new(struct cli_state *cli,c
 				case 260:
+				/*
+				 * According to CIFS Technical Document 1.0,
+				 * ff_last_name must point to last FILENAME.
+				 * But Window 2000 points to the first byte
+				 * of last file/directory entry.
+				 */
+					if (!ff_eos && !memcmp(p + ff_lastname,
+					    "\0\0\0\0", 4)) {
+						file_info resume_fi;
+						interpret_long_filename(
+						    cli, info_level,
+						    p + ff_lastname,
+						    &resume_fi);
+						strlcpy(mask, resume_fi.name,
+						    255);
+					} else
 					clistr_pull(cli, mask, p+ff_lastname,

More information about the samba mailing list