From 067407432e2d9dd6babe3498ff46f625a2dd218a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Sat, 11 Mar 2006 15:15:25 +0000 Subject: [PATCH] * GetModeList() didn't correctly check if the mode list allocation failed. * No longer changes the arguments in case of an error. * Takes communication errors more gracefully. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16703 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/interface/PrivateScreen.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/kits/interface/PrivateScreen.cpp b/src/kits/interface/PrivateScreen.cpp index b9f09c6bd9..cebbab6594 100644 --- a/src/kits/interface/PrivateScreen.cpp +++ b/src/kits/interface/PrivateScreen.cpp @@ -425,14 +425,23 @@ BPrivateScreen::GetModeList(display_mode **_modeList, uint32 *_count) status_t status = B_ERROR; if (link.FlushWithReply(status) == B_OK && status == B_OK) { - link.Read(_count); + uint32 count; + if (link.Read(&count) < B_OK) + return B_ERROR; + // TODO: this could get too big for the link - int32 size = *_count * sizeof(display_mode); - *_modeList = (display_mode *)malloc(size); - if (_modeList == NULL) + int32 size = count * sizeof(display_mode); + display_mode* modeList = (display_mode *)malloc(size); + if (modeList == NULL) return B_NO_MEMORY; - link.Read(*_modeList, size); + if (link.Read(modeList, size) < B_OK) { + free(modeList); + return B_ERROR; + } + + *_modeList = modeList; + *_count = count; } return status;