diff options
-rw-r--r-- | source3/include/includes.h | 8 | ||||
-rw-r--r-- | source3/include/local.h | 5 | ||||
-rw-r--r-- | source3/smbd/fileio.c | 22 | ||||
-rw-r--r-- | source3/smbd/negprot.c | 7 | ||||
-rw-r--r-- | source3/smbd/nttrans.c | 30 | ||||
-rw-r--r-- | source3/smbd/open.c | 16 | ||||
-rw-r--r-- | source3/smbd/trans2.c | 45 |
7 files changed, 49 insertions, 84 deletions
diff --git a/source3/include/includes.h b/source3/include/includes.h index 0f0bbdd89b..9b6e6266dc 100644 --- a/source3/include/includes.h +++ b/source3/include/includes.h @@ -353,6 +353,14 @@ #define SMB_OFF_T_BITS (sizeof(SMB_OFF_T)*8) + +#ifdef LARGE_SMB_OFF_T +#define SOFF_T(p, ofs, v) (SIVAL(p,ofs,(v)&0xFFFFFFFF), SIVAL(p,(ofs)+4,(v)>>32)) +#else +#define SOFF_T(p, ofs, v) SIVAL(p,ofs,v) +#endif + + /* * Set the define that tells us if we can do 64 bit * NT SMB calls. diff --git a/source3/include/local.h b/source3/include/local.h index ead97e565d..bf41af70d7 100644 --- a/source3/include/local.h +++ b/source3/include/local.h @@ -125,6 +125,11 @@ /* the size of the uid cache used to reduce valid user checks */ #define UID_CACHE_SIZE 4 +/* if mmap is enabled, then this is the maximum size of file to use + the mmap code on. We don't want to mmap huge files as virtual + address spaces are limited */ +#define MAX_MMAP_SIZE (100*0x100000) + /* the following control timings of various actions. Don't change them unless you know what you are doing. These are all in seconds */ #define DEFAULT_SMBD_TIMEOUT (60*60*24*7) diff --git a/source3/smbd/fileio.c b/source3/smbd/fileio.c index d40c159798..5c4bf7dfc2 100644 --- a/source3/smbd/fileio.c +++ b/source3/smbd/fileio.c @@ -63,19 +63,15 @@ ssize_t read_file(files_struct *fsp,char *data,SMB_OFF_T pos,size_t n) #if WITH_MMAP if (fsp->mmap_ptr) { - SMB_OFF_T num = (fsp->mmap_size > pos) ? (fsp->mmap_size - pos) : -1; - num = MIN(n,num); -#ifdef LARGE_SMB_OFF_T - if ((num > 0) && (num < (1LL<<(sizeof(size_t)*8)))) { -#else /* LARGE_SMB_OFF_T */ - if (num > 0) { -#endif /* LARGE_SMB_OFF_T */ - memcpy(data,fsp->mmap_ptr+pos,num); - data += num; - pos += num; - n -= num; - ret += num; - } + SMB_OFF_T num = (fsp->mmap_size > pos) ? (fsp->mmap_size - pos) : -1; + num = MIN(n,num); + if (num > 0) { + memcpy(data,fsp->mmap_ptr+pos,num); + data += num; + pos += num; + n -= num; + ret += num; + } } #endif diff --git a/source3/smbd/negprot.c b/source3/smbd/negprot.c index e79743cfd4..d4e6180261 100644 --- a/source3/smbd/negprot.c +++ b/source3/smbd/negprot.c @@ -161,11 +161,8 @@ static int reply_nt1(char *outbuf) /* dual names + lock_and_read + nt SMBs + remote API calls */ int capabilities = CAP_NT_FIND|CAP_LOCK_AND_READ| (lp_nt_smb_support() ? CAP_NT_SMBS | CAP_RPC_REMOTE_APIS : 0) | -#ifdef LARGE_SMB_OFF_T - (sizeof(SMB_OFF_T) == 8 ? CAP_LARGE_FILES : 0); -#else - 0; -#endif + (SMB_OFF_T_BITS == 64 ? CAP_LARGE_FILES : 0); + /* other valid capabilities which we may support at some time... diff --git a/source3/smbd/nttrans.c b/source3/smbd/nttrans.c index ee3385f152..2d991eef20 100644 --- a/source3/smbd/nttrans.c +++ b/source3/smbd/nttrans.c @@ -663,20 +663,10 @@ int reply_ntcreate_and_X(connection_struct *conn, put_long_date(p,sbuf.st_mtime); /* change time */ p += 8; SIVAL(p,0,fmode); /* File Attributes. */ - p += 4; -#ifdef LARGE_SMB_OFF_T - SIVAL(p,0, file_len); - SIVAL(p,4, file_len >> 32); -#else /* LARGE_SMB_OFF_T */ - SIVAL(p,0,file_len); -#endif /* LARGE_SMB_OFF_T */ + p += 4; + SOFF_T(p, 0, file_len); p += 8; -#ifdef LARGE_SMB_OFF_T - SIVAL(p,0, file_len); - SIVAL(p,4, file_len >> 32); -#else /* LARGE_SMB_OFF_T */ - SIVAL(p,0,file_len); -#endif /* LARGE_SMB_OFF_T */ + SOFF_T(p,0,file_len); p += 12; SCVAL(p,0,fsp->is_directory ? 1 : 0); @@ -900,19 +890,9 @@ static int call_nt_transact_create(connection_struct *conn, p += 8; SIVAL(p,0,fmode); /* File Attributes. */ p += 4; -#ifdef LARGE_SMB_OFF_T - SIVAL(p,0, file_len); - SIVAL(p,4, (file_len >> 32)); -#else /* LARGE_SMB_OFF_T */ - SIVAL(p,0,file_len); -#endif /* LARGE_SMB_OFF_T */ + SOFF_T(p,0,file_len); p += 8; -#ifdef LARGE_SMB_OFF_T - SIVAL(p,0, file_len); - SIVAL(p,4, (file_len >> 32)); -#else /* LARGE_SMB_OFF_T */ - SIVAL(p,0,file_len); -#endif /* LARGE_SMB_OFF_T */ + SOFF_T(p,0,file_len); } /* Send the required number of replies */ diff --git a/source3/smbd/open.c b/source3/smbd/open.c index a02fe91e68..394c7be3f8 100644 --- a/source3/smbd/open.c +++ b/source3/smbd/open.c @@ -541,13 +541,15 @@ static void open_file(files_struct *fsp,connection_struct *conn, /* mmap it if read-only */ if (!fsp->can_write) { fsp->mmap_size = file_size(fname); - fsp->mmap_ptr = (char *)mmap(NULL,fsp->mmap_size, - PROT_READ,MAP_SHARED,fsp->fd_ptr->fd,0); - - if (fsp->mmap_ptr == (char *)-1 || !fsp->mmap_ptr) { - DEBUG(3,("Failed to mmap() %s - %s\n", - fname,strerror(errno))); - fsp->mmap_ptr = NULL; + if (fsp->mmap_size < MAX_MMAP_SIZE) { + fsp->mmap_ptr = (char *)mmap(NULL,fsp->mmap_size, + PROT_READ,MAP_SHARED,fsp->fd_ptr->fd,0); + + if (fsp->mmap_ptr == (char *)-1 || !fsp->mmap_ptr) { + DEBUG(3,("Failed to mmap() %s - %s\n", + fname,strerror(errno))); + fsp->mmap_ptr = NULL; + } } } #endif diff --git a/source3/smbd/trans2.c b/source3/smbd/trans2.c index 49687d4cca..fe2869db93 100644 --- a/source3/smbd/trans2.c +++ b/source3/smbd/trans2.c @@ -489,12 +489,8 @@ static int get_lanman2_dir_entry(connection_struct *conn, put_long_date(p,adate); p += 8; put_long_date(p,mdate); p += 8; put_long_date(p,mdate); p += 8; - SIVAL(p,0,size); - SIVAL(p,8,size); -#ifdef LARGE_SMB_OFF_T - SIVAL(p,4,size >> 32); - SIVAL(p,12,size >> 32); -#endif /* LARGE_SMB_OFF_T */ + SOFF_T(p,0,size); + SOFF_T(p,8,size); p += 16; SIVAL(p,0,nt_extmode); p += 4; SIVAL(p,0,strlen(fname)); p += 4; @@ -522,12 +518,8 @@ static int get_lanman2_dir_entry(connection_struct *conn, put_long_date(p,adate); p += 8; put_long_date(p,mdate); p += 8; put_long_date(p,mdate); p += 8; - SIVAL(p,0,size); - SIVAL(p,8,size); -#ifdef LARGE_SMB_OFF_T - SIVAL(p,4,size >> 32); - SIVAL(p,12,size >> 32); -#endif /* LARGE_SMB_OFF_T */ + SOFF_T(p,0,size); + SOFF_T(p,8,size); p += 16; SIVAL(p,0,nt_extmode); p += 4; SIVAL(p,0,strlen(fname)); p += 4; @@ -545,12 +537,8 @@ static int get_lanman2_dir_entry(connection_struct *conn, put_long_date(p,adate); p += 8; put_long_date(p,mdate); p += 8; put_long_date(p,mdate); p += 8; - SIVAL(p,0,size); - SIVAL(p,8,size); -#ifdef LARGE_SMB_OFF_T - SIVAL(p,4,size >> 32); - SIVAL(p,12,size >> 32); -#endif /* LARGE_SMB_OFF_T */ + SOFF_T(p,0,size); + SOFF_T(p,8,size); p += 16; SIVAL(p,0,nt_extmode); p += 4; SIVAL(p,0,strlen(fname)); p += 4; @@ -1349,12 +1337,8 @@ static int call_trans2qfilepathinfo(connection_struct *conn, case SMB_QUERY_FILE_STANDARD_INFO: data_size = 22; - SIVAL(pdata,0,size); - SIVAL(pdata,8,size); -#ifdef LARGE_SMB_OFF_T - SIVAL(pdata,4,size>>32); - SIVAL(pdata,12,size>>32); -#endif /* LARGE_SMB_OFF_T */ + SOFF_T(pdata,0,size); + SOFF_T(pdata,8,size); SIVAL(pdata,16,sbuf.st_nlink); CVAL(pdata,20) = 0; CVAL(pdata,21) = (mode&aDIR)?1:0; @@ -1392,10 +1376,7 @@ static int call_trans2qfilepathinfo(connection_struct *conn, case SMB_QUERY_FILE_ALLOCATION_INFO: case SMB_QUERY_FILE_END_OF_FILEINFO: data_size = 8; - SIVAL(pdata,0,size); -#ifdef LARGE_SMB_OFF_T - SIVAL(pdata,4,size >> 32); -#endif /* LARGE_SMB_OFF_T */ + SOFF_T(pdata,0,size); break; case SMB_QUERY_FILE_ALL_INFO: @@ -1405,12 +1386,8 @@ static int call_trans2qfilepathinfo(connection_struct *conn, put_long_date(pdata+24,sbuf.st_mtime); /* change time */ SIVAL(pdata,32,mode); pdata += 40; - SIVAL(pdata,0,size); - SIVAL(pdata,8,size); -#ifdef LARGE_SMB_OFF_T - SIVAL(pdata,4,size >> 32); - SIVAL(pdata,12,size >> 32); -#endif /* LARGE_SMB_OFF_T */ + SOFF_T(pdata,0,size); + SOFF_T(pdata,8,size); SIVAL(pdata,16,sbuf.st_nlink); CVAL(pdata,20) = 0; CVAL(pdata,21) = (mode&aDIR)?1:0; |