diff options
-rw-r--r-- | source3/printing/print_cups.c | 23 |
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); |