[PATCH 1/3] spoolss: drop _spoolss_Enum* SPOOLSS_BUFFER_OK usage

David Disseldorp ddiss at samba.org
Fri Dec 19 10:08:40 MST 2014


The ugly SPOOLSS_BUFFER_OK macro is called multiple times in succession,
which can be optimised by only performing the spoolss response bounds
check once.

Signed-off-by: David Disseldorp <ddiss at samba.org>
---
 source3/rpc_server/spoolss/srv_spoolss_nt.c | 81 +++++++++++++++++++----------
 1 file changed, 54 insertions(+), 27 deletions(-)

diff --git a/source3/rpc_server/spoolss/srv_spoolss_nt.c b/source3/rpc_server/spoolss/srv_spoolss_nt.c
index 115af2d..14ec2bf 100644
--- a/source3/rpc_server/spoolss/srv_spoolss_nt.c
+++ b/source3/rpc_server/spoolss/srv_spoolss_nt.c
@@ -4757,10 +4757,13 @@ WERROR _spoolss_EnumPrinters(struct pipes_struct *p,
 						     spoolss_EnumPrinters,
 						     *r->out.info, r->in.level,
 						     *r->out.count);
-	*r->out.info	= SPOOLSS_BUFFER_OK(*r->out.info, NULL);
-	*r->out.count	= SPOOLSS_BUFFER_OK(*r->out.count, 0);
+	if (*r->out.needed > r->in.offered) {
+		*r->out.info = NULL;
+		*r->out.count = 0;
+		return WERR_INSUFFICIENT_BUFFER;
+	}
 
-	return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
+	return WERR_OK;
 }
 
 /****************************************************************
@@ -7448,10 +7451,13 @@ WERROR _spoolss_EnumJobs(struct pipes_struct *p,
 						     spoolss_EnumJobs,
 						     *r->out.info, r->in.level,
 						     *r->out.count);
-	*r->out.info	= SPOOLSS_BUFFER_OK(*r->out.info, NULL);
-	*r->out.count	= SPOOLSS_BUFFER_OK(*r->out.count, 0);
+	if (*r->out.needed > r->in.offered) {
+		*r->out.info = NULL;
+		*r->out.count = 0;
+		return WERR_INSUFFICIENT_BUFFER;
+	}
 
-	return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
+	return WERR_OK;
 }
 
 /****************************************************************
@@ -7786,10 +7792,13 @@ WERROR _spoolss_EnumPrinterDrivers(struct pipes_struct *p,
 						     spoolss_EnumPrinterDrivers,
 						     *r->out.info, r->in.level,
 						     *r->out.count);
-	*r->out.info	= SPOOLSS_BUFFER_OK(*r->out.info, NULL);
-	*r->out.count	= SPOOLSS_BUFFER_OK(*r->out.count, 0);
+	if (*r->out.needed > r->in.offered) {
+		*r->out.info = NULL;
+		*r->out.count = 0;
+		return WERR_INSUFFICIENT_BUFFER;
+	}
 
-	return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
+	return WERR_OK;
 }
 
 /****************************************************************
@@ -7840,10 +7849,13 @@ WERROR _spoolss_EnumForms(struct pipes_struct *p,
 						     spoolss_EnumForms,
 						     *r->out.info, r->in.level,
 						     *r->out.count);
-	*r->out.info	= SPOOLSS_BUFFER_OK(*r->out.info, NULL);
-	*r->out.count	= SPOOLSS_BUFFER_OK(*r->out.count, 0);
+	if (*r->out.needed > r->in.offered) {
+		*r->out.info = NULL;
+		*r->out.count = 0;
+		return WERR_INSUFFICIENT_BUFFER;
+	}
 
-	return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
+	return WERR_OK;
 }
 
 /****************************************************************
@@ -8135,10 +8147,13 @@ WERROR _spoolss_EnumPorts(struct pipes_struct *p,
 						     spoolss_EnumPorts,
 						     *r->out.info, r->in.level,
 						     *r->out.count);
-	*r->out.info	= SPOOLSS_BUFFER_OK(*r->out.info, NULL);
-	*r->out.count	= SPOOLSS_BUFFER_OK(*r->out.count, 0);
+	if (*r->out.needed > r->in.offered) {
+		*r->out.info = NULL;
+		*r->out.count = 0;
+		return WERR_INSUFFICIENT_BUFFER;
+	}
 
-	return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
+	return WERR_OK;
 }
 
 /****************************************************************************
@@ -9111,10 +9126,13 @@ WERROR _spoolss_EnumPrintProcessors(struct pipes_struct *p,
 						     spoolss_EnumPrintProcessors,
 						     *r->out.info, r->in.level,
 						     *r->out.count);
-	*r->out.info	= SPOOLSS_BUFFER_OK(*r->out.info, NULL);
-	*r->out.count	= SPOOLSS_BUFFER_OK(*r->out.count, 0);
+	if (*r->out.needed > r->in.offered) {
+		*r->out.info = NULL;
+		*r->out.count = 0;
+		return WERR_INSUFFICIENT_BUFFER;
+	}
 
-	return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
+	return WERR_OK;
 }
 
 /****************************************************************************
@@ -9207,10 +9225,13 @@ WERROR _spoolss_EnumPrintProcDataTypes(struct pipes_struct *p,
 						     spoolss_EnumPrintProcDataTypes,
 						     *r->out.info, r->in.level,
 						     *r->out.count);
-	*r->out.info	= SPOOLSS_BUFFER_OK(*r->out.info, NULL);
-	*r->out.count	= SPOOLSS_BUFFER_OK(*r->out.count, 0);
+	if (*r->out.needed > r->in.offered) {
+		*r->out.info = NULL;
+		*r->out.count = 0;
+		return WERR_INSUFFICIENT_BUFFER;
+	}
 
-	return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
+	return WERR_OK;
 }
 
 /****************************************************************************
@@ -9380,10 +9401,13 @@ WERROR _spoolss_EnumMonitors(struct pipes_struct *p,
 						     spoolss_EnumMonitors,
 						     *r->out.info, r->in.level,
 						     *r->out.count);
-	*r->out.info	= SPOOLSS_BUFFER_OK(*r->out.info, NULL);
-	*r->out.count	= SPOOLSS_BUFFER_OK(*r->out.count, 0);
+	if (*r->out.needed > r->in.offered) {
+		*r->out.info = NULL;
+		*r->out.count = 0;
+		return WERR_INSUFFICIENT_BUFFER;
+	}
 
-	return SPOOLSS_BUFFER_OK(WERR_OK, WERR_INSUFFICIENT_BUFFER);
+	return WERR_OK;
 }
 
 /****************************************************************************
@@ -10104,10 +10128,13 @@ WERROR _spoolss_EnumPrinterDataEx(struct pipes_struct *p,
 					       spoolss_EnumPrinterDataEx,
 					       *r->out.info,
 					       *r->out.count);
-	*r->out.info	= SPOOLSS_BUFFER_OK(*r->out.info, NULL);
-	*r->out.count	= SPOOLSS_BUFFER_OK(*r->out.count, *r->out.count);
+	if (*r->out.needed > r->in.offered) {
+		*r->out.info = NULL;
+		/* XXX *r->out.count remains set */
+		return WERR_MORE_DATA;
+	}
 
-	return SPOOLSS_BUFFER_OK(WERR_OK, WERR_MORE_DATA);
+	return WERR_OK;
 }
 
 /****************************************************************************
-- 
2.1.2



More information about the samba-technical mailing list