diff --git a/channels/printer/client/cups/printer_cups.c b/channels/printer/client/cups/printer_cups.c index 6e65f6560..8c4a41ee3 100644 --- a/channels/printer/client/cups/printer_cups.c +++ b/channels/printer/client/cups/printer_cups.c @@ -20,6 +20,8 @@ * limitations under the License. */ +#include + #include #include @@ -50,7 +52,7 @@ typedef struct { rdpPrintJob printjob; - void* printjob_object; + http_t* printjob_object; int printjob_id; } rdpCupsPrintJob; @@ -63,12 +65,13 @@ typedef struct static void printer_cups_get_printjob_name(char* buf, size_t size, size_t id) { - time_t tt; struct tm tres; - struct tm* t; + const time_t tt = time(NULL); + const struct tm* t = localtime_r(&tt, &tres); + + WINPR_ASSERT(buf); + WINPR_ASSERT(size > 0); - tt = time(NULL); - t = localtime_r(&tt, &tres); sprintf_s(buf, size - 1, "FreeRDP Print %04d-%02d-%02d %02d-%02d-%02d - Job %" PRIdz, t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, id); } @@ -82,6 +85,8 @@ static UINT printer_cups_write_printjob(rdpPrintJob* printjob, const BYTE* data, { rdpCupsPrintJob* cups_printjob = (rdpCupsPrintJob*)printjob; + WINPR_ASSERT(cups_printjob); + #ifndef _CUPS_API_1_4 { @@ -104,7 +109,7 @@ static UINT printer_cups_write_printjob(rdpPrintJob* printjob, const BYTE* data, #else - cupsWriteRequestData((http_t*)cups_printjob->printjob_object, (const char*)data, size); + cupsWriteRequestData(cups_printjob->printjob_object, (const char*)data, size); #endif @@ -114,6 +119,9 @@ static UINT printer_cups_write_printjob(rdpPrintJob* printjob, const BYTE* data, static void printer_cups_close_printjob(rdpPrintJob* printjob) { rdpCupsPrintJob* cups_printjob = (rdpCupsPrintJob*)printjob; + rdpCupsPrinter* cups_printer; + + WINPR_ASSERT(cups_printjob); #ifndef _CUPS_API_1_4 @@ -133,13 +141,16 @@ static void printer_cups_close_printjob(rdpPrintJob* printjob) #else - cupsFinishDocument((http_t*)cups_printjob->printjob_object, printjob->printer->name); + cupsFinishDocument(cups_printjob->printjob_object, printjob->printer->name); cups_printjob->printjob_id = 0; - httpClose((http_t*)cups_printjob->printjob_object); + httpClose(cups_printjob->printjob_object); #endif - ((rdpCupsPrinter*)printjob->printer)->printjob = NULL; + cups_printer = (rdpCupsPrinter*)printjob->printer; + WINPR_ASSERT(cups_printer); + + cups_printer->printjob = NULL; free(cups_printjob); } @@ -148,6 +159,8 @@ static rdpPrintJob* printer_cups_create_printjob(rdpPrinter* printer, UINT32 id) rdpCupsPrinter* cups_printer = (rdpCupsPrinter*)printer; rdpCupsPrintJob* cups_printjob; + WINPR_ASSERT(cups_printer); + if (cups_printer->printjob != NULL) return NULL; @@ -190,47 +203,57 @@ static rdpPrintJob* printer_cups_create_printjob(rdpPrinter* printer, UINT32 id) printer_cups_get_printjob_name(buf, sizeof(buf), cups_printjob->printjob.id); cups_printjob->printjob_id = - cupsCreateJob((http_t*)cups_printjob->printjob_object, printer->name, buf, 0, NULL); + cupsCreateJob(cups_printjob->printjob_object, printer->name, buf, 0, NULL); if (!cups_printjob->printjob_id) { - httpClose((http_t*)cups_printjob->printjob_object); + httpClose(cups_printjob->printjob_object); free(cups_printjob); return NULL; } - cupsStartDocument((http_t*)cups_printjob->printjob_object, printer->name, - cups_printjob->printjob_id, buf, CUPS_FORMAT_AUTO, 1); + cupsStartDocument(cups_printjob->printjob_object, printer->name, cups_printjob->printjob_id, + buf, CUPS_FORMAT_AUTO, 1); } #endif cups_printer->printjob = cups_printjob; - return (rdpPrintJob*)cups_printjob; + return &cups_printjob->printjob; } static rdpPrintJob* printer_cups_find_printjob(rdpPrinter* printer, UINT32 id) { rdpCupsPrinter* cups_printer = (rdpCupsPrinter*)printer; + WINPR_ASSERT(cups_printer); + if (cups_printer->printjob == NULL) return NULL; if (cups_printer->printjob->printjob.id != id) return NULL; - return (rdpPrintJob*)cups_printer->printjob; + return &cups_printer->printjob->printjob; } static void printer_cups_free_printer(rdpPrinter* printer) { rdpCupsPrinter* cups_printer = (rdpCupsPrinter*)printer; + WINPR_ASSERT(cups_printer); + if (cups_printer->printjob) - cups_printer->printjob->printjob.Close((rdpPrintJob*)cups_printer->printjob); + { + WINPR_ASSERT(cups_printer->printjob->printjob.Close); + cups_printer->printjob->printjob.Close(&cups_printer->printjob->printjob); + } if (printer->backend) + { + WINPR_ASSERT(printer->backend->ReleaseRef); printer->backend->ReleaseRef(printer->backend); + } free(printer->name); free(printer->driver); free(printer); @@ -282,8 +305,12 @@ static rdpPrinter* printer_cups_new_printer(rdpCupsPrinterDriver* cups_driver, c cups_printer->printer.AddRef = printer_cups_add_ref_printer; cups_printer->printer.ReleaseRef = printer_cups_release_ref_printer; + WINPR_ASSERT(cups_printer->printer.AddRef); cups_printer->printer.AddRef(&cups_printer->printer); + + WINPR_ASSERT(cups_printer->printer.backend->AddRef); cups_printer->printer.backend->AddRef(cups_printer->printer.backend); + return &cups_printer->printer; fail: @@ -307,20 +334,19 @@ static void printer_cups_release_enum_printers(rdpPrinter** printers) static rdpPrinter** printer_cups_enum_printers(rdpPrinterDriver* driver) { rdpPrinter** printers; - int num_printers; - cups_dest_t* dests; - cups_dest_t* dest; - int num_dests; + int num_printers = 0; + cups_dest_t* dests = NULL; + cups_dest_t* dest = NULL; int i; BOOL haveDefault = FALSE; + const int num_dests = cupsGetDests(&dests); + + WINPR_ASSERT(driver); - num_dests = cupsGetDests(&dests); printers = (rdpPrinter**)calloc(num_dests + 1, sizeof(rdpPrinter*)); if (!printers) return NULL; - num_printers = 0; - for (i = 0, dest = dests; i < num_dests; i++, dest++) { if (dest->instance == NULL) @@ -356,6 +382,7 @@ static rdpPrinter* printer_cups_get_printer(rdpPrinterDriver* driver, const char { rdpCupsPrinterDriver* cups_driver = (rdpCupsPrinterDriver*)driver; + WINPR_ASSERT(cups_driver); return printer_cups_new_printer(cups_driver, name, driverName, cups_driver->id_sequence == 1 ? TRUE : FALSE); } @@ -373,6 +400,9 @@ static rdpCupsPrinterDriver* uniq_cups_driver = NULL; static void printer_cups_release_ref_driver(rdpPrinterDriver* driver) { rdpCupsPrinterDriver* cups_driver = (rdpCupsPrinterDriver*)driver; + + WINPR_ASSERT(cups_driver); + if (cups_driver->references <= 1) { if (uniq_cups_driver == cups_driver) @@ -402,6 +432,7 @@ rdpPrinterDriver* cups_freerdp_printer_client_subsystem_entry(void) uniq_cups_driver->id_sequence = 1; } + WINPR_ASSERT(uniq_cups_driver->driver.AddRef); uniq_cups_driver->driver.AddRef(&uniq_cups_driver->driver); return &uniq_cups_driver->driver; diff --git a/channels/printer/client/printer_main.c b/channels/printer/client/printer_main.c index 80e89a643..be80766ff 100644 --- a/channels/printer/client/printer_main.c +++ b/channels/printer/client/printer_main.c @@ -28,6 +28,7 @@ #include #include +#include #include #include #include @@ -426,9 +427,15 @@ static UINT printer_process_irp_create(PRINTER_DEVICE* printer_dev, IRP* irp) { rdpPrintJob* printjob = NULL; + WINPR_ASSERT(printer_dev); + WINPR_ASSERT(irp); + if (printer_dev->printer) + { + WINPR_ASSERT(printer_dev->printer->CreatePrintJob); printjob = printer_dev->printer->CreatePrintJob(printer_dev->printer, irp->devman->id_sequence++); + } if (printjob) { @@ -452,8 +459,14 @@ static UINT printer_process_irp_close(PRINTER_DEVICE* printer_dev, IRP* irp) { rdpPrintJob* printjob = NULL; + WINPR_ASSERT(printer_dev); + WINPR_ASSERT(irp); + if (printer_dev->printer) + { + WINPR_ASSERT(printer_dev->printer->FindPrintJob); printjob = printer_dev->printer->FindPrintJob(printer_dev->printer, irp->FileId); + } if (!printjob) { @@ -481,6 +494,9 @@ static UINT printer_process_irp_write(PRINTER_DEVICE* printer_dev, IRP* irp) UINT error = CHANNEL_RC_OK; void* ptr; + WINPR_ASSERT(printer_dev); + WINPR_ASSERT(irp); + if (!Stream_CheckAndLogRequiredLength(TAG, irp->input, 32)) return ERROR_INVALID_DATA; Stream_Read_UINT32(irp->input, Length); @@ -490,7 +506,10 @@ static UINT printer_process_irp_write(PRINTER_DEVICE* printer_dev, IRP* irp) if (!Stream_SafeSeek(irp->input, Length)) return ERROR_INVALID_DATA; if (printer_dev->printer) + { + WINPR_ASSERT(printer_dev->printer->FindPrintJob); printjob = printer_dev->printer->FindPrintJob(printer_dev->printer, irp->FileId); + } if (!printjob) { @@ -510,6 +529,8 @@ static UINT printer_process_irp_write(PRINTER_DEVICE* printer_dev, IRP* irp) Stream_Write_UINT32(irp->output, Length); Stream_Write_UINT8(irp->output, 0); /* Padding */ + + WINPR_ASSERT(irp->Complete); return irp->Complete(irp); } @@ -520,7 +541,12 @@ static UINT printer_process_irp_write(PRINTER_DEVICE* printer_dev, IRP* irp) */ static UINT printer_process_irp_device_control(PRINTER_DEVICE* printer_dev, IRP* irp) { + WINPR_ASSERT(printer_dev); + WINPR_ASSERT(irp); + Stream_Write_UINT32(irp->output, 0); /* OutputBufferLength */ + + WINPR_ASSERT(irp->Complete); return irp->Complete(irp); } @@ -533,6 +559,9 @@ static UINT printer_process_irp(PRINTER_DEVICE* printer_dev, IRP* irp) { UINT error; + WINPR_ASSERT(printer_dev); + WINPR_ASSERT(irp); + switch (irp->MajorFunction) { case IRP_MJ_CREATE: @@ -574,6 +603,7 @@ static UINT printer_process_irp(PRINTER_DEVICE* printer_dev, IRP* irp) default: irp->IoStatus = STATUS_NOT_SUPPORTED; + WINPR_ASSERT(irp->Complete); return irp->Complete(irp); } @@ -584,12 +614,14 @@ static DWORD WINAPI printer_thread_func(LPVOID arg) { IRP* irp; PRINTER_DEVICE* printer_dev = (PRINTER_DEVICE*)arg; - HANDLE obj[] = { printer_dev->event, printer_dev->stopEvent }; UINT error = CHANNEL_RC_OK; + WINPR_ASSERT(printer_dev); + while (1) { - DWORD rc = WaitForMultipleObjects(2, obj, FALSE, INFINITE); + HANDLE obj[] = { printer_dev->event, printer_dev->stopEvent }; + DWORD rc = WaitForMultipleObjects(ARRAYSIZE(obj), obj, FALSE, INFINITE); if (rc == WAIT_FAILED) { @@ -635,6 +667,10 @@ static DWORD WINAPI printer_thread_func(LPVOID arg) static UINT printer_irp_request(DEVICE* device, IRP* irp) { PRINTER_DEVICE* printer_dev = (PRINTER_DEVICE*)device; + + WINPR_ASSERT(printer_dev); + WINPR_ASSERT(irp); + InterlockedPushEntrySList(printer_dev->pIrpList, &(irp->ItemEntry)); SetEvent(printer_dev->event); return CHANNEL_RC_OK; @@ -644,7 +680,12 @@ static UINT printer_custom_component(DEVICE* device, UINT16 component, UINT16 pa { UINT32 eventID; PRINTER_DEVICE* printer_dev = (PRINTER_DEVICE*)device; + + WINPR_ASSERT(printer_dev); + WINPR_ASSERT(printer_dev->rdpcontext); + const rdpSettings* settings = printer_dev->rdpcontext->settings; + WINPR_ASSERT(settings); if (component != RDPDR_CTYP_PRN) return ERROR_INVALID_DATA; @@ -826,6 +867,9 @@ static UINT printer_free(DEVICE* device) IRP* irp; PRINTER_DEVICE* printer_dev = (PRINTER_DEVICE*)device; UINT error; + + WINPR_ASSERT(printer_dev); + SetEvent(printer_dev->stopEvent); if (WaitForSingleObject(printer_dev->thread, INFINITE) == WAIT_FAILED) @@ -842,7 +886,10 @@ static UINT printer_free(DEVICE* device) } while ((irp = (IRP*)InterlockedPopEntrySList(printer_dev->pIrpList)) != NULL) + { + WINPR_ASSERT(irp->Discard); irp->Discard(irp); + } CloseHandle(printer_dev->thread); CloseHandle(printer_dev->stopEvent); @@ -850,7 +897,10 @@ static UINT printer_free(DEVICE* device) winpr_aligned_free(printer_dev->pIrpList); if (printer_dev->printer) + { + WINPR_ASSERT(printer_dev->printer->ReleaseRef); printer_dev->printer->ReleaseRef(printer_dev->printer); + } Stream_Free(printer_dev->device.data, TRUE); free(printer_dev); @@ -866,6 +916,10 @@ static UINT printer_register(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints, rdpPrint { PRINTER_DEVICE* printer_dev; UINT error = ERROR_INTERNAL_ERROR; + + WINPR_ASSERT(pEntryPoints); + WINPR_ASSERT(printer); + printer_dev = (PRINTER_DEVICE*)calloc(1, sizeof(PRINTER_DEVICE)); if (!printer_dev) @@ -930,6 +984,7 @@ static UINT printer_register(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints, rdpPrint goto error_out; } + WINPR_ASSERT(printer->AddRef); printer->AddRef(printer); return CHANNEL_RC_OK; error_out: @@ -1016,6 +1071,7 @@ UINT printer_DeviceServiceEntry(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints) if (name && name[0]) { + WINPR_ASSERT(driver->GetPrinter); rdpPrinter* printer = driver->GetPrinter(driver, name, driver_name); if (!printer) @@ -1025,6 +1081,7 @@ UINT printer_DeviceServiceEntry(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints) goto fail; } + WINPR_ASSERT(printer->ReleaseRef); if (!printer_save_default_config(pEntryPoints->rdpcontext->settings, printer)) { error = CHANNEL_RC_INITIALIZATION_ERROR; @@ -1042,6 +1099,7 @@ UINT printer_DeviceServiceEntry(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints) } else { + WINPR_ASSERT(driver->EnumPrinters); rdpPrinter** printers = driver->EnumPrinters(driver); rdpPrinter** current = printers; @@ -1056,13 +1114,17 @@ UINT printer_DeviceServiceEntry(PDEVICE_SERVICE_ENTRY_POINTS pEntryPoints) } } + WINPR_ASSERT(driver->ReleaseEnumPrinters); driver->ReleaseEnumPrinters(printers); } fail: free(driver_name); if (driver) + { + WINPR_ASSERT(driver->ReleaseRef); driver->ReleaseRef(driver); + } return error; }