mirror of
https://github.com/morgan9e/FreeRDP
synced 2026-04-15 00:44:19 +09:00
Added WINPR_ASSERT to printer client channel
Assure all function calls have valid arguments.
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user