[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