1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-12 20:58:37 +03:00

r18011: Should fix bug 3835.

Jeremy: requires your eyes...

If the remote connection timed out while cli_list() was retrieving its list of
files, the error was not returned to the user, e.g. via smbc_opendir(), so the
user didn't have a way to know to set the timeout longer and try again.  This
problem would occur when a very large directory is being read with a too-small
timeout on the cli.

Jeremy, although there were a couple of areas that needed to be handled, I
needed to make one change that you should bless, in libsmb/clientgen.c.  It
was setting

  cli->smb_rw_error = smb_read_error;

but smb_read_error is zero, so this had no effect.  I'm now doing

  cli->smb_rw_error = READ_TIMEOUT;

instead, and according to the OP, these (cumulative) changes (in a slightly
different form) solve the problem.

Please confirm this smb_rw_error change will have no other adverse effects
that you can see.

Derrell
This commit is contained in:
Derrell Lipman 2006-09-03 00:50:34 +00:00 committed by Gerald (Jerry) Carter
parent 10b32cb6de
commit fa664b24b8
4 changed files with 53 additions and 21 deletions

View File

@ -6,10 +6,12 @@ EXTLIB_INCL = -I/usr/include/gtk-1.2 \
-I/usr/include/glib-1.2 \ -I/usr/include/glib-1.2 \
-I/usr/lib/glib/include -I/usr/lib/glib/include
DEFS = -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE DEFS = -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
CFLAGS = -O0 -g -I$(SAMBA_INCL) $(EXTLIB_INCL) $(DEFS) CFLAGS = -O0 -g -I$(SAMBA_INCL) $(EXTLIB_INCL) $(DEFS)
LDFLAGS = -L/usr/local/samba/lib LDFLAGS = -L/usr/local/samba/lib
LIBSMBCLIENT = /usr/local/samba/lib/libsmbclient.so
TESTS= testsmbc \ TESTS= testsmbc \
tree \ tree \
@ -26,43 +28,43 @@ all: $(TESTS) smbsh
testsmbc: testsmbc.o testsmbc: testsmbc.o
@echo Linking testsmbc @echo Linking testsmbc
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< -lsmbclient $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< $(LIBSMBCLIENT)
tree: tree.o tree: tree.o
@echo Linking tree @echo Linking tree
@$(CC) `gtk-config --cflags` $(CFLAGS) $(LDFLAGS) -o $@ `gtk-config --libs` -lsmbclient $< @$(CC) `gtk-config --cflags` $(CFLAGS) $(LDFLAGS) -o $@ `gtk-config --libs` $(LIBSMBCLIENT) $<
testacl: testacl.o testacl: testacl.o
@echo Linking testacl @echo Linking testacl
@$(CC) `gtk-config --cflags` $(CFLAGS) $(LDFLAGS) -o $@ `gtk-config --libs` -lsmbclient -lpopt $< @$(CC) `gtk-config --cflags` $(CFLAGS) $(LDFLAGS) -o $@ `gtk-config --libs` $(LIBSMBCLIENT) -lpopt $<
testbrowse: testbrowse.o testbrowse: testbrowse.o
@echo Linking testbrowse @echo Linking testbrowse
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ -lsmbclient -lpopt $< @$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(LIBSMBCLIENT) -lpopt $<
testbrowse2: testbrowse2.o testbrowse2: testbrowse2.o
@echo Linking testbrowse2 @echo Linking testbrowse2
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ -lsmbclient -lpopt $< @$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(LIBSMBCLIENT) -lpopt $<
teststat: teststat.o teststat: teststat.o
@echo Linking teststat @echo Linking teststat
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ /usr/local/samba/lib/libsmbclient.so -lpopt $< @$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(LIBSMBCLIENT) -lpopt $<
teststat2: teststat2.o teststat2: teststat2.o
@echo Linking teststat2 @echo Linking teststat2
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ /usr/local/samba/lib/libsmbclient.so -lpopt $< @$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(LIBSMBCLIENT) -lpopt $<
testchmod: testchmod.o testchmod: testchmod.o
@echo Linking testchmod @echo Linking testchmod
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ /usr/local/samba/lib/libsmbclient.so -lpopt $< @$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(LIBSMBCLIENT) -lpopt $<
testutime: testutime.o testutime: testutime.o
@echo Linking testutime @echo Linking testutime
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ /usr/local/samba/lib/libsmbclient.so -lpopt $< @$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(LIBSMBCLIENT) -lpopt $<
testread: testread.o testread: testread.o
@echo Linking testread @echo Linking testread
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ /usr/local/samba/lib/libsmbclient.so -lpopt $< @$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $(LIBSMBCLIENT) -lpopt $<
smbsh: smbsh:
make -C smbwrapper make -C smbwrapper

View File

@ -79,7 +79,6 @@ static BOOL client_receive_smb(int fd,char *buffer, unsigned int timeout)
BOOL cli_receive_smb(struct cli_state *cli) BOOL cli_receive_smb(struct cli_state *cli)
{ {
extern int smb_read_error;
BOOL ret; BOOL ret;
/* fd == -1 causes segfaults -- Tom (tom@ninja.nl) */ /* fd == -1 causes segfaults -- Tom (tom@ninja.nl) */
@ -107,9 +106,9 @@ BOOL cli_receive_smb(struct cli_state *cli)
} }
/* If the server is not responding, note that now */ /* If the server is not responding, note that now */
if (!ret) { if (!ret) {
cli->smb_rw_error = smb_read_error; DEBUG(0, ("Receiving SMB: Server stopped responding\n"));
cli->smb_rw_error = READ_TIMEOUT;
close(cli->fd); close(cli->fd);
cli->fd = -1; cli->fd = -1;
return ret; return ret;

View File

@ -349,10 +349,17 @@ int cli_list_new(struct cli_state *cli,const char *Mask,uint16 attribute,
mnt = cli_cm_get_mntpoint( cli ); mnt = cli_cm_get_mntpoint( cli );
for (p=dirlist,i=0;i<total_received;i++) { /* see if the server disconnected or the connection otherwise failed */
p += interpret_long_filename(cli,info_level,p,&finfo,NULL,NULL,NULL); if (cli_is_error(cli)) {
fn( mnt,&finfo, Mask, state ); total_received = -1;
} } else {
/* no connection problem. let user function add each entry */
for (p=dirlist,i=0;i<total_received;i++) {
p += interpret_long_filename(cli, info_level, p,
&finfo,NULL,NULL,NULL);
fn( mnt,&finfo, Mask, state );
}
}
/* free up the dirlist buffer and last name raw blob */ /* free up the dirlist buffer and last name raw blob */
SAFE_FREE(dirlist); SAFE_FREE(dirlist);

View File

@ -2540,6 +2540,7 @@ static SMBCFILE *
smbc_opendir_ctx(SMBCCTX *context, smbc_opendir_ctx(SMBCCTX *context,
const char *fname) const char *fname)
{ {
int saved_errno;
fstring server, share, user, password, options; fstring server, share, user, password, options;
pstring workgroup; pstring workgroup;
pstring path; pstring path;
@ -2547,6 +2548,7 @@ smbc_opendir_ctx(SMBCCTX *context,
char *p; char *p;
SMBCSRV *srv = NULL; SMBCSRV *srv = NULL;
SMBCFILE *dir = NULL; SMBCFILE *dir = NULL;
struct _smbc_callbacks *cb;
struct in_addr rem_ip; struct in_addr rem_ip;
if (!context || !context->internal || if (!context || !context->internal ||
@ -2908,9 +2910,9 @@ smbc_opendir_ctx(SMBCCTX *context,
SAFE_FREE(dir->fname); SAFE_FREE(dir->fname);
SAFE_FREE(dir); SAFE_FREE(dir);
} }
errno = smbc_errno(context, targetcli); saved_errno = smbc_errno(context, targetcli);
if (errno == EINVAL) { if (saved_errno == EINVAL) {
/* /*
* See if they asked to opendir something * See if they asked to opendir something
* other than a directory. If so, the * other than a directory. If so, the
@ -2926,12 +2928,34 @@ smbc_opendir_ctx(SMBCCTX *context,
! IS_DOS_DIR(mode)) { ! IS_DOS_DIR(mode)) {
/* It is. Correct the error value */ /* It is. Correct the error value */
errno = ENOTDIR; saved_errno = ENOTDIR;
} }
} }
return NULL; /*
* If there was an error and the server is no
* good any more...
*/
cb = &context->callbacks;
if (cli_is_error(targetcli) &&
cb->check_server_fn(context, srv)) {
/* ... then remove it. */
if (cb->remove_unused_server_fn(context,
srv)) {
/*
* We could not remove the server
* completely, remove it from the
* cache so we will not get it
* again. It will be removed when the
* last file/dir is closed.
*/
cb->remove_cached_srv_fn(context, srv);
}
}
errno = saved_errno;
return NULL;
} }
} }