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

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 commit is contained in:
Volker Lendecke
2007-06-17 05:19:30 +00:00
committed by Gerald (Jerry) Carter
parent 9dcbef9615
commit 009af09099
2 changed files with 11 additions and 55 deletions

View File

@@ -154,7 +154,7 @@ BOOL getgroups_unix_user(TALLOC_CTX *mem_ctx, const char *user,
gid_t *groups; gid_t *groups;
int i; int i;
max_grp = groups_max(); max_grp = MIN(32, groups_max());
temp_groups = SMB_MALLOC_ARRAY(gid_t, max_grp); temp_groups = SMB_MALLOC_ARRAY(gid_t, max_grp);
if (! temp_groups) { if (! temp_groups) {
return False; return False;

View File

@@ -25,9 +25,10 @@ uint16 global_smbpid;
extern struct auth_context *negprot_global_auth_context; extern struct auth_context *negprot_global_auth_context;
extern int smb_echo_count; extern int smb_echo_count;
static char *InBuffer = NULL; #define TOTAL_BUFFER_SIZE (BUFFER_SIZE+LARGE_WRITEX_HDR_SIZE+SAFETY_MARGIN)
static char *OutBuffer = NULL;
static char *current_inbuf = NULL; static char InBuffer[TOTAL_BUFFER_SIZE];
static char OutBuffer[TOTAL_BUFFER_SIZE];
/* /*
* Size of data we can send to client. Set * 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 " DEBUG(10,("push_deferred_open_smb_message: pushing message len %u mid %u "
"timeout time [%u.%06u]\n", "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_sec,
(unsigned int)end_time.tv_usec)); (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, request_time, end_time,
private_data, priv_len); 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)); 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); outsize = smb_messages[type].fn(conn, inbuf,outbuf,size,bufsize);
} }
@@ -1441,47 +1441,6 @@ char *get_OutBuffer(void)
return OutBuffer; 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 Process commands from the client
@@ -1492,11 +1451,6 @@ void smbd_process(void)
time_t last_timeout_processing_time = time(NULL); time_t last_timeout_processing_time = time(NULL);
unsigned int num_smbs = 0; 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); max_recv = MIN(lp_maxxmit(),BUFFER_SIZE);
while (True) { while (True) {
@@ -1520,7 +1474,8 @@ void smbd_process(void)
run_events(smbd_event_context(), 0, NULL, NULL); run_events(smbd_event_context(), 0, NULL, NULL);
#if defined(DEVELOPER) #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 #endif
while (!receive_message_or_smb(InBuffer,BUFFER_SIZE+LARGE_WRITEX_HDR_SIZE,select_timeout)) { 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; 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); process_smb(InBuffer, OutBuffer);