svn commit: samba r7471 - in trunk/source/smbd: .
jra at samba.org
jra at samba.org
Fri Jun 10 19:39:46 GMT 2005
Author: jra
Date: 2005-06-10 19:39:46 +0000 (Fri, 10 Jun 2005)
New Revision: 7471
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=7471
Log:
Fix bug found by Marc Kaplan - amazing how similar InBuffer looks to OutBuffer
when you're typing it wrong :-). Tidy up some InBuf/OutBuf usage.
We're valgrind clean in Marc's test case now.
Jeremy.
Modified:
trunk/source/smbd/aio.c
trunk/source/smbd/oplock.c
trunk/source/smbd/process.c
Changeset:
Modified: trunk/source/smbd/aio.c
===================================================================
--- trunk/source/smbd/aio.c 2005-06-10 18:34:36 UTC (rev 7470)
+++ trunk/source/smbd/aio.c 2005-06-10 19:39:46 UTC (rev 7471)
@@ -116,7 +116,9 @@
static void delete_aio_ex(struct aio_extra *aio_ex)
{
DLIST_REMOVE(aio_list_head, aio_ex);
- SAFE_FREE(aio_ex->inbuf);
+ /* Safe to do as we've removed ourselves from the in use list first. */
+ free_InBuffer(aio_ex->inbuf);
+
SAFE_FREE(aio_ex->outbuf);
SAFE_FREE(aio_ex);
}
@@ -524,6 +526,22 @@
}
}
}
+
+/****************************************************************************
+ Check if a buffer was stolen for aio use.
+*****************************************************************************/
+
+BOOL aio_inbuffer_in_use(char *inbuf)
+{
+ struct aio_extra *aio_ex;
+
+ for( aio_ex = aio_list_head; aio_ex; aio_ex = aio_ex->next) {
+ if (aio_ex->inbuf == inbuf) {
+ return True;
+ }
+ }
+ return False;
+}
#else
BOOL aio_finished(void)
{
@@ -561,4 +579,9 @@
void cancel_aio_by_fsp(files_struct *fsp)
{
}
+
+BOOL aio_inbuffer_in_use(char *ptr)
+{
+ return False;
+}
#endif
Modified: trunk/source/smbd/oplock.c
===================================================================
--- trunk/source/smbd/oplock.c 2005-06-10 18:34:36 UTC (rev 7470)
+++ trunk/source/smbd/oplock.c 2005-06-10 19:39:46 UTC (rev 7471)
@@ -751,7 +751,7 @@
if((outbuf = NewOutBuffer(&saved_outbuf))==NULL) {
DEBUG(0,("oplock_break: malloc fail for output buffer.\n"));
set_InBuffer(saved_inbuf);
- SAFE_FREE(inbuf);
+ free_InBuffer(inbuf);
return False;
}
@@ -911,11 +911,11 @@
/* Restore the global In/Out buffers. */
set_InBuffer(saved_inbuf);
- set_InBuffer(saved_outbuf);
+ set_OutBuffer(saved_outbuf);
/* Free the buffers we've been using to recurse. */
- SAFE_FREE(inbuf);
- SAFE_FREE(outbuf);
+ free_InBuffer(inbuf);
+ free_OutBuffer(outbuf);
/* We need this in case a readraw crossed on the wire. */
if(global_oplock_break)
Modified: trunk/source/smbd/process.c
===================================================================
--- trunk/source/smbd/process.c 2005-06-10 18:34:36 UTC (rev 7470)
+++ trunk/source/smbd/process.c 2005-06-10 19:39:46 UTC (rev 7471)
@@ -1516,9 +1516,31 @@
void set_OutBuffer(char *new_outbuf)
{
- InBuffer = new_outbuf;
+ OutBuffer = new_outbuf;
}
+/****************************************************************************
+ Free an InBuffer. Checks if not in use by aio system.
+ Must have been allocated by NewInBuffer.
+****************************************************************************/
+
+void free_InBuffer(char *inbuf)
+{
+ if (!aio_inbuffer_in_use(inbuf)) {
+ SAFE_FREE(inbuf);
+ }
+}
+
+/****************************************************************************
+ Free an OutBuffer. No outbuffers currently stolen by aio system.
+ Must have been allocated by NewInBuffer.
+****************************************************************************/
+
+void free_OutBuffer(char *outbuf)
+{
+ SAFE_FREE(outbuf);
+}
+
const int total_buffer_size = (BUFFER_SIZE + LARGE_WRITEX_HDR_SIZE + SAFETY_MARGIN);
/****************************************************************************
@@ -1536,7 +1558,7 @@
}
InBuffer = new_inbuf;
#if defined(DEVELOPER)
- clobber_region(SAFE_STRING_FUNCTION_NAME, SAFE_STRING_LINE, new_inbuf, total_buffer_size);
+ clobber_region(SAFE_STRING_FUNCTION_NAME, SAFE_STRING_LINE, InBuffer, total_buffer_size);
#endif
return InBuffer;
}
@@ -1569,10 +1591,10 @@
{
time_t last_timeout_processing_time = time(NULL);
unsigned int num_smbs = 0;
- char *inbuf = NewInBuffer(NULL);
- char *outbuf = NewOutBuffer(NULL);
- if ((inbuf == NULL) || (outbuf == NULL))
+ /* Allocate the primary Inbut/Output buffers. */
+
+ if ((NewInBuffer(NULL) == NULL) || (NewOutBuffer(NULL) == NULL))
return;
max_recv = MIN(lp_maxxmit(),BUFFER_SIZE);
More information about the samba-cvs
mailing list