Added WINPR_ASSERT to printer client channel

Assure all function calls have valid arguments.
This commit is contained in:
akallabeth
2022-06-24 12:53:40 +02:00
committed by akallabeth
parent 43b1f51984
commit 7bc276ba04
2 changed files with 118 additions and 25 deletions

View File

@@ -20,6 +20,8 @@
* limitations under the License.
*/
#include <winpr/assert.h>
#include <freerdp/config.h>
#include <stdio.h>
@@ -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;

View File

@@ -28,6 +28,7 @@
#include <string.h>
#include <winpr/crt.h>
#include <winpr/assert.h>
#include <winpr/string.h>
#include <winpr/synch.h>
#include <winpr/thread.h>
@@ -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;
}