summaryrefslogtreecommitdiffstats
path: root/source/libsmb/clilist.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2005-03-23 03:55:02 +0000
committerJeremy Allison <jra@samba.org>2005-03-23 03:55:02 +0000
commit1fa079b56863f148dbe6fc570bbf0e676bb53bd3 (patch)
treedf3537c4bbefe8857045b31f7a6ba49c8927c6ca /source/libsmb/clilist.c
parent764c1b0f70e4e6be4c45c8351861fe87bce641e5 (diff)
downloadsamba-1fa079b56863f148dbe6fc570bbf0e676bb53bd3.tar.gz
samba-1fa079b56863f148dbe6fc570bbf0e676bb53bd3.tar.xz
samba-1fa079b56863f148dbe6fc570bbf0e676bb53bd3.zip
r5991: Fixup last entry offset correctly for level 260.
Should fix bug found by Derrell.Lipman@UnwiredUniverse.com. Jeremy.
Diffstat (limited to 'source/libsmb/clilist.c')
-rw-r--r--source/libsmb/clilist.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/source/libsmb/clilist.c b/source/libsmb/clilist.c
index eea4391e55b..0f1b9efed0e 100644
--- a/source/libsmb/clilist.c
+++ b/source/libsmb/clilist.c
@@ -29,7 +29,7 @@
by NT and 2 is used by OS/2
****************************************************************************/
-static int interpret_long_filename(struct cli_state *cli,
+static size_t interpret_long_filename(struct cli_state *cli,
int level,char *p,file_info *finfo)
{
extern file_info def_finfo;
@@ -130,12 +130,12 @@ static int interpret_long_filename(struct cli_state *cli,
clistr_pull(cli, finfo->name, p,
sizeof(finfo->name),
namelen, 0);
- return SVAL(base, 0);
+ return (size_t)IVAL(base, 0);
}
}
DEBUG(1,("Unknown long filename format %d\n",level));
- return(SVAL(p,0));
+ return (size_t)IVAL(base,0);
}
/****************************************************************************
@@ -168,6 +168,7 @@ int cli_list_new(struct cli_state *cli,const char *Mask,uint16 attribute,
unsigned int param_len, data_len;
uint16 setup;
pstring param;
+ const char *mnt;
/* NT uses 260, OS/2 uses 2. Both accept 1. */
info_level = (cli->capabilities&CAP_NT_SMBS)?260:1;
@@ -271,6 +272,10 @@ int cli_list_new(struct cli_state *cli,const char *Mask,uint16 attribute,
/* we might need the lastname for continuations */
for (p2=p,i=0;i<ff_searchcount;i++) {
+ if ((info_level == 260) && (i == ff_searchcount-1)) {
+ /* Last entry - fixup the last offset length. */
+ SIVAL(p2,0,PTR_DIFF((rdata + data_len),p2));
+ }
p2 += interpret_long_filename(cli,info_level,p2,&finfo);
}
@@ -308,11 +313,10 @@ int cli_list_new(struct cli_state *cli,const char *Mask,uint16 attribute,
First = False;
}
+ mnt = cli_cm_get_mntpoint( cli );
+
for (p=dirlist,i=0;i<total_received;i++) {
- const char *mnt = cli_cm_get_mntpoint( cli );
-
p += interpret_long_filename(cli,info_level,p,&finfo);
-
fn( mnt,&finfo, Mask, state );
}