[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH] More IOCTL parameter checks
Also expands ASSERT(NT_SUCCESS(function)) calls in cleanup paths Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx> --- src/xeniface/ioctl_evtchn.c | 15 ++++++++++----- src/xeniface/ioctl_gnttab.c | 26 ++++++++++++++++---------- src/xeniface/ioctl_sharedinfo.c | 5 +++++ src/xeniface/ioctl_store.c | 17 ++++++++++------- src/xeniface/ioctl_suspend.c | 11 +++++++++-- src/xeniface/ioctls.c | 4 ++-- 6 files changed, 52 insertions(+), 26 deletions(-) diff --git a/src/xeniface/ioctl_evtchn.c b/src/xeniface/ioctl_evtchn.c index f528485..90e9468 100644 --- a/src/xeniface/ioctl_evtchn.c +++ b/src/xeniface/ioctl_evtchn.c @@ -166,7 +166,8 @@ IoctlEvtchnBindUnbound( status = STATUS_INVALID_BUFFER_SIZE; if (InLen != sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_IN) || - OutLen != sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_OUT)) { + OutLen != sizeof(XENIFACE_EVTCHN_BIND_UNBOUND_OUT) || + Buffer == NULL) { goto fail1; } @@ -259,7 +260,8 @@ IoctlEvtchnBindInterdomain( status = STATUS_INVALID_BUFFER_SIZE; if (InLen != sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_IN) || - OutLen != sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT)) { + OutLen != sizeof(XENIFACE_EVTCHN_BIND_INTERDOMAIN_OUT) || + Buffer == NULL) { goto fail1; } @@ -353,7 +355,8 @@ IoctlEvtchnClose( status = STATUS_INVALID_BUFFER_SIZE; if (InLen != sizeof(XENIFACE_EVTCHN_CLOSE_IN) || - OutLen != 0) { + OutLen != 0 || + Buffer == NULL) { goto fail1; } @@ -430,7 +433,8 @@ IoctlEvtchnNotify( status = STATUS_INVALID_BUFFER_SIZE; if (InLen != sizeof(XENIFACE_EVTCHN_NOTIFY_IN) || - OutLen != 0) { + OutLen != 0 || + Buffer == NULL) { goto fail1; } @@ -462,7 +466,8 @@ IoctlEvtchnUnmask( status = STATUS_INVALID_BUFFER_SIZE; if (InLen != sizeof(XENIFACE_EVTCHN_UNMASK_IN) || - OutLen != 0) { + OutLen != 0 || + Buffer == NULL) { goto fail1; } diff --git a/src/xeniface/ioctl_gnttab.c b/src/xeniface/ioctl_gnttab.c index c3cf129..5777ac8 100644 --- a/src/xeniface/ioctl_gnttab.c +++ b/src/xeniface/ioctl_gnttab.c @@ -174,7 +174,8 @@ IoctlGnttabPermitForeignAccess( } status = STATUS_INVALID_BUFFER_SIZE; - if (OutLen != (ULONG)FIELD_OFFSET(XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT, References[In->NumberPages])) + if (OutLen != (ULONG)FIELD_OFFSET(XENIFACE_GNTTAB_PERMIT_FOREIGN_ACCESS_OUT, References[In->NumberPages]) || + Out == NULL) goto fail5; status = STATUS_NO_MEMORY; @@ -310,11 +311,12 @@ fail11: Error("Fail11: Page = %lu\n", Page); while (Page > 0) { - ASSERT(NT_SUCCESS(XENBUS_GNTTAB(RevokeForeignAccess, + NTSTATUS status2 = XENBUS_GNTTAB(RevokeForeignAccess, &Fdo->GnttabInterface, Fdo->GnttabCache, FALSE, - Context->Grants[Page - 1]))); + Context->Grants[Page - 1]); + ASSERT(NT_SUCCESS(status2)); --Page; } @@ -425,7 +427,7 @@ IoctlGnttabRevokeForeignAccess( PXENIFACE_CONTEXT_ID ContextId; status = STATUS_INVALID_BUFFER_SIZE; - if (InLen != sizeof(XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN)) + if (InLen != sizeof(XENIFACE_GNTTAB_REVOKE_FOREIGN_ACCESS_IN) || Buffer == NULL) goto fail1; Id.Type = XENIFACE_CONTEXT_GRANT; @@ -476,7 +478,8 @@ IoctlGnttabMapForeignPages( status = STATUS_INVALID_BUFFER_SIZE; if (InLen < sizeof(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_IN) || - OutLen != sizeof(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT)) { + OutLen != sizeof(XENIFACE_GNTTAB_MAP_FOREIGN_PAGES_OUT) || + Buffer == NULL) { goto fail1; } @@ -618,10 +621,12 @@ fail10: fail9: Error("Fail9\n"); - ASSERT(NT_SUCCESS(XENBUS_GNTTAB(UnmapForeignPages, - &Fdo->GnttabInterface, - Context->Address - ))); + { + NTSTATUS status2 = XENBUS_GNTTAB(UnmapForeignPages, + &Fdo->GnttabInterface, + Context->Address); + ASSERT(NT_SUCCESS(status2)); + } fail8: Error("Fail8\n"); @@ -714,7 +719,8 @@ IoctlGnttabUnmapForeignPages( status = STATUS_INVALID_BUFFER_SIZE; if (InLen != sizeof(XENIFACE_GNTTAB_UNMAP_FOREIGN_PAGES_IN) || - OutLen != 0) { + OutLen != 0 || + Buffer == NULL) { goto fail1; } diff --git a/src/xeniface/ioctl_sharedinfo.c b/src/xeniface/ioctl_sharedinfo.c index 7870732..eab35a5 100644 --- a/src/xeniface/ioctl_sharedinfo.c +++ b/src/xeniface/ioctl_sharedinfo.c @@ -56,6 +56,9 @@ IoctlSharedInfoGetTime( if (OutLen != sizeof(XENIFACE_SHAREDINFO_GET_TIME_OUT)) goto fail2; + if (Buffer == NULL) + goto fail3; + Out = (PXENIFACE_SHAREDINFO_GET_TIME_OUT)Buffer; XENBUS_SHARED_INFO(GetTime, &Fdo->SharedInfoInterface, &Time, &Local); @@ -66,6 +69,8 @@ IoctlSharedInfoGetTime( return STATUS_SUCCESS; +fail3: + Error("fail3\n"); fail2: Error("Fail2\n"); fail1: diff --git a/src/xeniface/ioctl_store.c b/src/xeniface/ioctl_store.c index 97062df..3964662 100644 --- a/src/xeniface/ioctl_store.c +++ b/src/xeniface/ioctl_store.c @@ -105,7 +105,7 @@ IoctlStoreRead( BOOLEAN SquashError = FALSE; status = STATUS_INVALID_BUFFER_SIZE; - if (InLen == 0) + if (InLen == 0 || Buffer == NULL) goto fail1; status = STATUS_INVALID_PARAMETER; @@ -173,7 +173,7 @@ IoctlStoreWrite( ULONG Length; status = STATUS_INVALID_BUFFER_SIZE; - if (InLen == 0 || OutLen != 0) + if (InLen == 0 || OutLen != 0 || Buffer == NULL) goto fail1; status = STATUS_INVALID_PARAMETER; @@ -221,7 +221,7 @@ IoctlStoreDirectory( BOOLEAN SquashError = FALSE; status = STATUS_INVALID_BUFFER_SIZE; - if (InLen == 0) + if (InLen == 0 || Buffer == NULL) goto fail1; status = STATUS_INVALID_PARAMETER; @@ -289,7 +289,7 @@ IoctlStoreRemove( NTSTATUS status; status = STATUS_INVALID_BUFFER_SIZE; - if (InLen == 0 || OutLen != 0) + if (InLen == 0 || OutLen != 0 || Buffer == NULL) goto fail1; status = STATUS_INVALID_PARAMETER; @@ -392,7 +392,8 @@ IoctlStoreSetPermissions( status = STATUS_INVALID_BUFFER_SIZE; if (InLen < sizeof(XENIFACE_STORE_SET_PERMISSIONS_IN) || - OutLen != 0) { + OutLen != 0 || + Buffer == NULL) { goto fail1; } @@ -508,7 +509,8 @@ IoctlStoreAddWatch( status = STATUS_INVALID_BUFFER_SIZE; if (InLen != sizeof(XENIFACE_STORE_ADD_WATCH_IN) || - OutLen != sizeof(XENIFACE_STORE_ADD_WATCH_OUT)) { + OutLen != sizeof(XENIFACE_STORE_ADD_WATCH_OUT) || + Buffer == NULL) { goto fail1; } @@ -648,7 +650,8 @@ IoctlStoreRemoveWatch( status = STATUS_INVALID_BUFFER_SIZE; if (InLen != sizeof(XENIFACE_STORE_REMOVE_WATCH_IN) || - OutLen != 0) { + OutLen != 0 || + Buffer == NULL) { goto fail1; } diff --git a/src/xeniface/ioctl_suspend.c b/src/xeniface/ioctl_suspend.c index 6289a94..e7e8437 100644 --- a/src/xeniface/ioctl_suspend.c +++ b/src/xeniface/ioctl_suspend.c @@ -55,6 +55,9 @@ IoctlSuspendGetCount( if (OutLen != sizeof(ULONG)) goto fail2; + if (Buffer == NULL) + goto fail3; + Value = (PULONG)Buffer; *Value = XENBUS_SUSPEND(GetCount, &Fdo->SuspendInterface); *Info = (ULONG_PTR)sizeof(ULONG); @@ -62,6 +65,8 @@ IoctlSuspendGetCount( return status; +fail3: + Error("Fail3\n"); fail2: Error("Fail2\n"); fail1: @@ -87,7 +92,8 @@ IoctlSuspendRegister( status = STATUS_INVALID_BUFFER_SIZE; if (InLen != sizeof(XENIFACE_SUSPEND_REGISTER_IN) || - OutLen != sizeof(XENIFACE_SUSPEND_REGISTER_OUT)) { + OutLen != sizeof(XENIFACE_SUSPEND_REGISTER_OUT) || + Buffer == NULL) { goto fail1; } @@ -163,7 +169,8 @@ IoctlSuspendDeregister( status = STATUS_INVALID_BUFFER_SIZE; if (InLen != sizeof(XENIFACE_SUSPEND_REGISTER_OUT) || - OutLen != 0) { + OutLen != 0 || + Buffer == NULL) { goto fail1; } diff --git a/src/xeniface/ioctls.c b/src/xeniface/ioctls.c index a624bd1..20a7669 100644 --- a/src/xeniface/ioctls.c +++ b/src/xeniface/ioctls.c @@ -48,9 +48,9 @@ __CaptureUserBuffer( NTSTATUS Status; PVOID TempBuffer = NULL; - if (Length == 0) { + if (Length == 0 || Buffer == NULL) { *CapturedBuffer = NULL; - return STATUS_SUCCESS; + return STATUS_INVALID_PARAMETER; } Status = STATUS_NO_MEMORY; -- 2.32.0.windows.1
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |