summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorVolker Lendecke <vlendec@samba.org>2007-06-17 05:19:30 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 12:23:26 -0500
commit5e8a4c12f9617d7e7b2c392eddc1ced613a561fe (patch)
tree251aec2051a3ff3402ce072dc0e4f80a742c8356 /source3
parenta0c3774ab14342e502ef567bc63fb68a5eaa25ab (diff)
downloadsamba-5e8a4c12f9617d7e7b2c392eddc1ced613a561fe.tar.gz
samba-5e8a4c12f9617d7e7b2c392eddc1ced613a561fe.tar.bz2
samba-5e8a4c12f9617d7e7b2c392eddc1ced613a561fe.zip
r23528: Two changes to make the valgrind massif (heap profiler) output readable:
Remove the allocated inbuf/output. In async I/O we copy the buffers explicitly now, so NewInBuffer is called exactly once. This does not reduce memory footprint, but removes one of the larger chunks that clobber the rest of the massif output In getgroups_unix_user on Linux 2.6 we allocated 64k groups x 4 bytes per group x 2 (once in the routine itself and once in libc) = 512k just to throw it away directly again. This reduces it do a more typical limit of 32 groups per user. We certainly cope with overflow fine if 32 is not enough. Not 100% sure about this one, a DEVELOPER only thing? (This used to be commit 009af0909944e0f303c5d496b56fb65ca40a41d5)
Diffstat (limited to 'source3')
-rw-r--r--source3/lib/system_smbd.c2
-rw-r--r--source3/smbd/process.c64
2 files changed, 11 insertions, 55 deletions
diff --git a/source3/lib/system_smbd.c b/source3/lib/system_smbd.c
index 8159f3a3b5..ffdd8eeed0 100644
--- a/source3/lib/system_smbd.c
+++ b/source3/lib/system_smbd.c
@@ -154,7 +154,7 @@ BOOL getgroups_unix_user(TALLOC_CTX *mem_ctx, const char *user,
gid_t *groups;
int i;
- max_grp = groups_max();
+ max_grp = MIN(32, groups_max());
temp_groups = SMB_MALLOC_ARRAY(gid_t, max_grp);
if (! temp_groups) {
return False;
diff --git a/source3/smbd/process.c b/source3/smbd/process.c
index 3b922af51f..0e1ad06ed5 100644
--- a/source3/smbd/process.c
+++ b/source3/smbd/process.c
@@ -25,9 +25,10 @@ uint16 global_smbpid;
extern struct auth_context *negprot_global_auth_context;
extern int smb_echo_count;
-static char *InBuffer = NULL;
-static char *OutBuffer = NULL;
-static char *current_inbuf = NULL;
+#define TOTAL_BUFFER_SIZE (BUFFER_SIZE+LARGE_WRITEX_HDR_SIZE+SAFETY_MARGIN)
+
+static char InBuffer[TOTAL_BUFFER_SIZE];
+static char OutBuffer[TOTAL_BUFFER_SIZE];
/*
* Size of data we can send to client. Set
@@ -208,11 +209,11 @@ BOOL push_deferred_smb_message(uint16 mid,
DEBUG(10,("push_deferred_open_smb_message: pushing message len %u mid %u "
"timeout time [%u.%06u]\n",
- (unsigned int) smb_len(current_inbuf)+4, (unsigned int)mid,
+ (unsigned int) smb_len(InBuffer)+4, (unsigned int)mid,
(unsigned int)end_time.tv_sec,
(unsigned int)end_time.tv_usec));
- return push_queued_message(current_inbuf, smb_len(current_inbuf)+4,
+ return push_queued_message(InBuffer, smb_len(InBuffer)+4,
request_time, end_time,
private_data, priv_len);
}
@@ -1007,7 +1008,6 @@ static int switch_message(int type,char *inbuf,char *outbuf,int size,int bufsize
return(ERROR_DOS(ERRSRV,ERRaccess));
}
- current_inbuf = inbuf; /* In case we need to defer this message in open... */
outsize = smb_messages[type].fn(conn, inbuf,outbuf,size,bufsize);
}
@@ -1441,47 +1441,6 @@ char *get_OutBuffer(void)
return OutBuffer;
}
-const int total_buffer_size = (BUFFER_SIZE + LARGE_WRITEX_HDR_SIZE + SAFETY_MARGIN);
-
-/****************************************************************************
- Allocate a new InBuffer. Returns the new and old ones.
-****************************************************************************/
-
-static char *NewInBuffer(char **old_inbuf)
-{
- char *new_inbuf = (char *)SMB_MALLOC(total_buffer_size);
- if (!new_inbuf) {
- return NULL;
- }
- if (old_inbuf) {
- *old_inbuf = InBuffer;
- }
- InBuffer = new_inbuf;
-#if defined(DEVELOPER)
- clobber_region(SAFE_STRING_FUNCTION_NAME, SAFE_STRING_LINE, InBuffer, total_buffer_size);
-#endif
- return InBuffer;
-}
-
-/****************************************************************************
- Allocate a new OutBuffer. Returns the new and old ones.
-****************************************************************************/
-
-static char *NewOutBuffer(char **old_outbuf)
-{
- char *new_outbuf = (char *)SMB_MALLOC(total_buffer_size);
- if (!new_outbuf) {
- return NULL;
- }
- if (old_outbuf) {
- *old_outbuf = OutBuffer;
- }
- OutBuffer = new_outbuf;
-#if defined(DEVELOPER)
- clobber_region(SAFE_STRING_FUNCTION_NAME, SAFE_STRING_LINE, OutBuffer, total_buffer_size);
-#endif
- return OutBuffer;
-}
/****************************************************************************
Process commands from the client
@@ -1492,11 +1451,6 @@ void smbd_process(void)
time_t last_timeout_processing_time = time(NULL);
unsigned int num_smbs = 0;
- /* Allocate the primary Inbut/Output buffers. */
-
- if ((NewInBuffer(NULL) == NULL) || (NewOutBuffer(NULL) == NULL))
- return;
-
max_recv = MIN(lp_maxxmit(),BUFFER_SIZE);
while (True) {
@@ -1520,7 +1474,8 @@ void smbd_process(void)
run_events(smbd_event_context(), 0, NULL, NULL);
#if defined(DEVELOPER)
- clobber_region(SAFE_STRING_FUNCTION_NAME, SAFE_STRING_LINE, InBuffer, total_buffer_size);
+ clobber_region(SAFE_STRING_FUNCTION_NAME, SAFE_STRING_LINE,
+ InBuffer, TOTAL_BUFFER_SIZE);
#endif
while (!receive_message_or_smb(InBuffer,BUFFER_SIZE+LARGE_WRITEX_HDR_SIZE,select_timeout)) {
@@ -1541,7 +1496,8 @@ void smbd_process(void)
*/
num_echos = smb_echo_count;
- clobber_region(SAFE_STRING_FUNCTION_NAME, SAFE_STRING_LINE, OutBuffer, total_buffer_size);
+ clobber_region(SAFE_STRING_FUNCTION_NAME, SAFE_STRING_LINE,
+ OutBuffer, TOTAL_BUFFER_SIZE);
process_smb(InBuffer, OutBuffer);