From a65e22c6bdf32c2bb014a2ed52794590a49dda34 Mon Sep 17 00:00:00 2001 From: David Disseldorp Date: Wed, 15 Apr 2015 15:48:06 +0200 Subject: [PATCH] spoolss: cache_key handle allocation failures early MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On cache_key allocation failure, set_printer_hnd_name() currently stumbles through the rest of the function, and includes extra logic to handle a NULL key later on. Handling the allocation failure early makes sense, and also allows for the NULL key checks to be removed. Signed-off-by: David Disseldorp Reviewed-by: Guenther Deschner Autobuild-User(master): Günther Deschner Autobuild-Date(master): Wed Apr 15 18:55:50 CEST 2015 on sn-devel-104 --- source3/rpc_server/spoolss/srv_spoolss_nt.c | 28 +++++++++------------ 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/source3/rpc_server/spoolss/srv_spoolss_nt.c b/source3/rpc_server/spoolss/srv_spoolss_nt.c index 65a805a9dff..482f711f757 100644 --- a/source3/rpc_server/spoolss/srv_spoolss_nt.c +++ b/source3/rpc_server/spoolss/srv_spoolss_nt.c @@ -622,18 +622,18 @@ static WERROR set_printer_hnd_name(TALLOC_CTX *mem_ctx, found = true; } + cache_key = talloc_asprintf(talloc_tos(), "PRINTERNAME/%s", aprinter); + if (cache_key == NULL) { + return WERR_NOMEM; + } + /* * With hundreds of printers, the "for" loop iterating all * shares can be quite expensive, as it is done on every * OpenPrinter. The loop maps "aprinter" to "sname", the * result of which we cache in gencache. */ - - cache_key = talloc_asprintf(talloc_tos(), "PRINTERNAME/%s", - aprinter); - if ((cache_key != NULL) && - gencache_get(cache_key, talloc_tos(), &tmp, NULL)) { - + if (gencache_get(cache_key, talloc_tos(), &tmp, NULL)) { found = (strcmp(tmp, printer_not_found) != 0); if (!found) { DEBUG(4, ("Printer %s not found\n", aprinter)); @@ -702,20 +702,16 @@ static WERROR set_printer_hnd_name(TALLOC_CTX *mem_ctx, TALLOC_FREE(info2); } - if ( !found ) { - if (cache_key != NULL) { - gencache_set(cache_key, printer_not_found, - time(NULL)+300); - TALLOC_FREE(cache_key); - } + if (!found) { + gencache_set(cache_key, printer_not_found, + time_mono(NULL) + 300); + TALLOC_FREE(cache_key); DEBUGADD(4,("Printer not found\n")); return WERR_INVALID_PRINTER_NAME; } - if (cache_key != NULL) { - gencache_set(cache_key, sname, time(NULL)+300); - TALLOC_FREE(cache_key); - } + gencache_set(cache_key, sname, time_mono(NULL) + 300); + TALLOC_FREE(cache_key); DEBUGADD(4,("set_printer_hnd_name: Printer found: %s -> %s\n", aprinter, sname));