summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/printing/print_cups.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/source3/printing/print_cups.c b/source3/printing/print_cups.c
index a8cc538942e..2b3b8ed8e3f 100644
--- a/source3/printing/print_cups.c
+++ b/source3/printing/print_cups.c
@@ -454,6 +454,7 @@ static void cups_async_callback(struct event_context *event_ctx,
struct cups_async_cb_args *cb_args = (struct cups_async_cb_args *)p;
int fd = cb_args->pipe_fd;
struct pcap_cache *tmp_pcap_cache = NULL;
+ bool ret_ok = true;
DEBUG(5,("cups_async_callback: callback received for printer data. "
"fd = %d\n", fd));
@@ -471,6 +472,7 @@ static void cups_async_callback(struct event_context *event_ctx,
if (ret != sizeof(namelen)) {
DEBUG(10,("cups_async_callback: namelen read failed %d %s\n",
errno, strerror(errno)));
+ ret_ok = false;
break;
}
@@ -485,6 +487,7 @@ static void cups_async_callback(struct event_context *event_ctx,
if (ret != sizeof(infolen)) {
DEBUG(10,("cups_async_callback: infolen read failed %s\n",
strerror(errno)));
+ ret_ok = false;
break;
}
@@ -494,6 +497,7 @@ static void cups_async_callback(struct event_context *event_ctx,
if (namelen) {
name = TALLOC_ARRAY(frame, char, namelen);
if (!name) {
+ ret_ok = false;
break;
}
ret = sys_read(fd, name, namelen);
@@ -504,6 +508,7 @@ static void cups_async_callback(struct event_context *event_ctx,
if (ret != namelen) {
DEBUG(10,("cups_async_callback: name read failed %s\n",
strerror(errno)));
+ ret_ok = false;
break;
}
DEBUG(11,("cups_async_callback: read name %s\n",
@@ -514,6 +519,7 @@ static void cups_async_callback(struct event_context *event_ctx,
if (infolen) {
info = TALLOC_ARRAY(frame, char, infolen);
if (!info) {
+ ret_ok = false;
break;
}
ret = sys_read(fd, info, infolen);
@@ -524,6 +530,7 @@ static void cups_async_callback(struct event_context *event_ctx,
if (ret != infolen) {
DEBUG(10,("cups_async_callback: info read failed %s\n",
strerror(errno)));
+ ret_ok = false;
break;
}
DEBUG(11,("cups_async_callback: read info %s\n",
@@ -533,14 +540,21 @@ static void cups_async_callback(struct event_context *event_ctx,
}
/* Add to our local pcap cache. */
- pcap_cache_add_specific(&tmp_pcap_cache, name, info);
+ ret_ok = pcap_cache_add_specific(&tmp_pcap_cache, name, info);
TALLOC_FREE(name);
TALLOC_FREE(info);
+ if (!ret_ok) {
+ DEBUG(0, ("failed to add to tmp pcap cache\n"));
+ break;
+ }
}
TALLOC_FREE(frame);
- if (tmp_pcap_cache) {
- /* We got a namelist, replace our local cache. */
+ if (!ret_ok) {
+ DEBUG(0,("failed to read a new printer list\n"));
+ pcap_cache_destroy_specific(&tmp_pcap_cache);
+ } else {
+ /* We got a possibly empty namelist, replace our local cache. */
pcap_cache_destroy_specific(&local_pcap_copy);
local_pcap_copy = tmp_pcap_cache;
@@ -551,9 +565,6 @@ static void cups_async_callback(struct event_context *event_ctx,
if (cb_args->post_cache_fill_fn) {
cb_args->post_cache_fill_fn();
}
- } else {
- DEBUG(2,("cups_async_callback: failed to read a new "
- "printer list\n"));
}
close(fd);
TALLOC_FREE(cb_args);