From e00c6053dc5e6cb23335bb57cc312b4ca71d3e8f Mon Sep 17 00:00:00 2001 From: Jeff Squyres Date: Fri, 7 Apr 2006 03:49:58 +0000 Subject: [PATCH] Commit 1 of 2: be consistent in the MPI_*_F2C functions for the handling of invalid Fortran handles. Per MPI-2:4.12.4, if we get an invalid Fortran handle, we should return an invalid C handle. Before this commit, we checked if the fortran handle index was out of range (i.e., <0 or >sizeof(array)). If so, we used to return MPI_*_NULL (i.e., a valid C handle). But to be faithful to MPI-2:4.12.4, we now return NULL (an invalid C handle). If the fortran index is in bounds but is an index for an MPI object that has already been freed, the code already returns NULL because the entry in the array will be NULL (i.e., we already did what MPI-2:4.12.4 said for this case). Hence, this commit makes the handling of invalid fortran handles in the MPI_*_F2C functions be uniform: we always return NULL. Commit 2 of this will be to edit just about every C interface function (!) to ensure that MPI handles are not NULL. Otherwise, if the user calls a fortran interface function with an invalid handle, the fortran interface function will call MPI_*_F2C and blindly pass the result to the back-end C function. The C function will eventually end up trying to dereference it -- segv. Having a run-time check for NULL and invoking an MPI exception is far more social (e.g., the user can get a stack trace out of MPI_ABORT) and consistent (i.e., we're already checking for MPI_*_NULL in the C interface functions). Since all the C interface functions have all the machinery for run-time parameter checking, and they all already check for MPI_*_NULL, it's easy enough to add another check for NULL. This commit was SVN r9560. --- ompi/mpi/c/comm_f2c.c | 6 ++++-- ompi/mpi/c/errhandler_f2c.c | 8 +++++--- ompi/mpi/c/file_f2c.c | 6 ++++-- ompi/mpi/c/group_f2c.c | 6 ++++-- ompi/mpi/c/info_f2c.c | 6 ++++-- ompi/mpi/c/op_f2c.c | 6 ++++-- ompi/mpi/c/request_f2c.c | 6 ++++-- ompi/mpi/c/type_f2c.c | 6 ++++-- ompi/mpi/c/win_f2c.c | 6 ++++-- 9 files changed, 37 insertions(+), 19 deletions(-) diff --git a/ompi/mpi/c/comm_f2c.c b/ompi/mpi/c/comm_f2c.c index f3e2dc6526..7e91b4881a 100644 --- a/ompi/mpi/c/comm_f2c.c +++ b/ompi/mpi/c/comm_f2c.c @@ -9,6 +9,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -41,11 +42,12 @@ MPI_Comm MPI_Comm_f2c(MPI_Fint comm) } /* Per MPI-2:4.12.4, do not invoke an error handler if we get an - invalid fortran handle */ + invalid fortran handle. If we get an invalid fortran handle, + return an invalid C handle. */ if ( 0 > o_index || o_index >= ompi_pointer_array_get_size(&ompi_mpi_communicators)) { - return MPI_COMM_NULL; + return NULL; } return ompi_pointer_array_get_item(&ompi_mpi_communicators, o_index); diff --git a/ompi/mpi/c/errhandler_f2c.c b/ompi/mpi/c/errhandler_f2c.c index 6c266d063d..92f95f7bdc 100644 --- a/ompi/mpi/c/errhandler_f2c.c +++ b/ompi/mpi/c/errhandler_f2c.c @@ -9,6 +9,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -43,12 +44,13 @@ MPI_Errhandler MPI_Errhandler_f2c(MPI_Fint errhandler_f) } /* Per MPI-2:4.12.4, do not invoke an error handler if we get an - invalid fortran handle */ - + invalid fortran handle. If we get an invalid fortran handle, + return an invalid C handle. */ + if (eh_index < 0 || eh_index >= ompi_pointer_array_get_size(ompi_errhandler_f_to_c_table)) { - return MPI_ERRHANDLER_NULL; + return NULL; } return ompi_pointer_array_get_item(ompi_errhandler_f_to_c_table, diff --git a/ompi/mpi/c/file_f2c.c b/ompi/mpi/c/file_f2c.c index be1bdd80f3..f658f8c6eb 100644 --- a/ompi/mpi/c/file_f2c.c +++ b/ompi/mpi/c/file_f2c.c @@ -9,6 +9,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -42,12 +43,13 @@ MPI_File MPI_File_f2c(MPI_Fint file_f) } /* Per MPI-2:4.12.4, do not invoke an error handler if we get an - invalid fortran handle */ + invalid fortran handle. If we get an invalid fortran handle, + return an invalid C handle. */ if (file_index < 0 || file_index >= ompi_pointer_array_get_size(&ompi_file_f_to_c_table)) { - return MPI_FILE_NULL; + return NULL; } return ompi_pointer_array_get_item(&ompi_file_f_to_c_table, file_index); diff --git a/ompi/mpi/c/group_f2c.c b/ompi/mpi/c/group_f2c.c index 2a5d903a72..a8e3e9079e 100644 --- a/ompi/mpi/c/group_f2c.c +++ b/ompi/mpi/c/group_f2c.c @@ -9,6 +9,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -42,12 +43,13 @@ MPI_Group MPI_Group_f2c(MPI_Fint group_f) } /* Per MPI-2:4.12.4, do not invoke an error handler if we get an - invalid fortran handle */ + invalid fortran handle. If we get an invalid fortran handle, + return an invalid C handle. */ if (group_index < 0 || group_index >= ompi_pointer_array_get_size(ompi_group_f_to_c_table)) { - return MPI_GROUP_NULL; + return NULL; } return ompi_pointer_array_get_item(ompi_group_f_to_c_table, group_index); diff --git a/ompi/mpi/c/info_f2c.c b/ompi/mpi/c/info_f2c.c index 81dae6853d..181195e307 100644 --- a/ompi/mpi/c/info_f2c.c +++ b/ompi/mpi/c/info_f2c.c @@ -9,6 +9,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -50,12 +51,13 @@ MPI_Info MPI_Info_f2c(MPI_Fint info) } /* Per MPI-2:4.12.4, do not invoke an error handler if we get an - invalid fortran handle */ + invalid fortran handle. If we get an invalid fortran handle, + return an invalid C handle. */ if (info_index < 0 || info_index >= ompi_pointer_array_get_size(&ompi_info_f_to_c_table)) { - return MPI_INFO_NULL; + return NULL; } return ompi_pointer_array_get_item(&ompi_info_f_to_c_table, info_index); diff --git a/ompi/mpi/c/op_f2c.c b/ompi/mpi/c/op_f2c.c index f7c3dcdf14..80f1b31654 100644 --- a/ompi/mpi/c/op_f2c.c +++ b/ompi/mpi/c/op_f2c.c @@ -9,6 +9,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -43,12 +44,13 @@ MPI_Op MPI_Op_f2c(MPI_Fint op_f) } /* Per MPI-2:4.12.4, do not invoke an error handler if we get an - invalid fortran handle */ + invalid fortran handle. If we get an invalid fortran handle, + return an invalid C handle. */ if (op_index < 0 || op_index >= ompi_pointer_array_get_size(ompi_op_f_to_c_table)) { - return MPI_OP_NULL; + return NULL; } return ompi_pointer_array_get_item(ompi_op_f_to_c_table, op_index); diff --git a/ompi/mpi/c/request_f2c.c b/ompi/mpi/c/request_f2c.c index efe6181f28..6633af171f 100644 --- a/ompi/mpi/c/request_f2c.c +++ b/ompi/mpi/c/request_f2c.c @@ -9,6 +9,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -41,12 +42,13 @@ MPI_Request MPI_Request_f2c(MPI_Fint request) } /* Per MPI-2:4.12.4, do not invoke an error handler if we get an - invalid fortran handle */ + invalid fortran handle. If we get an invalid fortran handle, + return an invalid C handle. */ if (request_index < 0 || request_index >= ompi_pointer_array_get_size(&ompi_request_f_to_c_table)) { - return MPI_REQUEST_NULL; + return NULL; } return ompi_pointer_array_get_item(&ompi_request_f_to_c_table, diff --git a/ompi/mpi/c/type_f2c.c b/ompi/mpi/c/type_f2c.c index 8bb69667c4..47632323ec 100644 --- a/ompi/mpi/c/type_f2c.c +++ b/ompi/mpi/c/type_f2c.c @@ -9,6 +9,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -41,12 +42,13 @@ MPI_Datatype MPI_Type_f2c(MPI_Fint datatype) } /* Per MPI-2:4.12.4, do not invoke an error handler if we get an - invalid fortran handle */ + invalid fortran handle. If we get an invalid fortran handle, + return an invalid C handle. */ if (datatype_index < 0 || datatype_index >= ompi_pointer_array_get_size(ompi_datatype_f_to_c_table)) { - return MPI_DATATYPE_NULL; + return NULL; } return ompi_pointer_array_get_item(ompi_datatype_f_to_c_table, datatype); diff --git a/ompi/mpi/c/win_f2c.c b/ompi/mpi/c/win_f2c.c index 03947a801c..2d18c7fe93 100644 --- a/ompi/mpi/c/win_f2c.c +++ b/ompi/mpi/c/win_f2c.c @@ -9,6 +9,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. + * Copyright (c) 2006 Cisco Systems, Inc. All rights reserved. * $COPYRIGHT$ * * Additional copyrights may follow @@ -41,11 +42,12 @@ MPI_Win MPI_Win_f2c(MPI_Fint win) } /* Per MPI-2:4.12.4, do not invoke an error handler if we get an - invalid fortran handle */ + invalid fortran handle. If we get an invalid fortran handle, + return an invalid C handle. */ if ( 0 > o_index || o_index >= ompi_pointer_array_get_size(&ompi_mpi_windows)) { - return MPI_WIN_NULL; + return NULL; } return ompi_pointer_array_get_item(&ompi_mpi_windows, o_index);