Просмотр исходного кода

Do checking of handle code after we verify that handle could actually be
in the handle database.


git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@2166 fd59a12c-fef9-0310-b244-a6a79926bd2f

Steven Dake 17 лет назад
Родитель
Сommit
19a49ecdce
1 измененных файлов с 20 добавлено и 6 удалено
  1. 20 6
      include/corosync/hdb.h

+ 20 - 6
include/corosync/hdb.h

@@ -243,22 +243,22 @@ static inline int hdb_handle_get (
 
 	hdb_database_lock (&handle_database->lock);
 
-	if (check != 0xffffffff &&
-		check != handle_database->handles[handle].check) {
-
+	*instance = NULL;
+	if (handle >= handle_database->handle_count) {
 		hdb_database_unlock (&handle_database->lock);
 		errno = EBADF;
 		return (-1);
 	}
 
-	*instance = NULL;
-	if (handle >= handle_database->handle_count) {
+	if (handle_database->handles[handle].state != HDB_HANDLE_STATE_ACTIVE) {
 		hdb_database_unlock (&handle_database->lock);
 		errno = EBADF;
 		return (-1);
 	}
 
-	if (handle_database->handles[handle].state != HDB_HANDLE_STATE_ACTIVE) {
+	if (check != 0xffffffff &&
+		check != handle_database->handles[handle].check) {
+
 		hdb_database_unlock (&handle_database->lock);
 		errno = EBADF;
 		return (-1);
@@ -281,6 +281,13 @@ static inline int hdb_handle_put (
 
 	hdb_database_lock (&handle_database->lock);
 
+	if (handle >= handle_database->handle_count) {
+		hdb_database_unlock (&handle_database->lock);
+
+		errno = EBADF;
+		return (-1);
+	}
+
 	if (check != 0xffffffff &&
 		check != handle_database->handles[handle].check) {
 
@@ -313,6 +320,13 @@ static inline int hdb_handle_destroy (
 
 	hdb_database_lock (&handle_database->lock);
 
+	if (handle >= handle_database->handle_count) {
+		hdb_database_unlock (&handle_database->lock);
+
+		errno = EBADF;
+		return (-1);
+	}
+
 	if (check != 0xffffffff &&
 		check != handle_database->handles[handle].check) {
 		hdb_database_unlock (&handle_database->lock);