Skip to content

Commit 50ca64c

Browse files
committed
sessions: fix a problem with fortran interface
For fortran interfaces for MPI_Session_get_nth_pset, the input character array in which to return the process set names was not being properly handled to trim out potential junk characers in the input array. This is easiest to observe when the user is supplying an input character array of MPI_MAX_PSET_NAME_LEN size. Related to #12084. Also do some fix-up of capitalization and indention. Signed-off-by: Howard Pritchard <howardp@lanl.gov>
1 parent d4bfe8c commit 50ca64c

File tree

4 files changed

+41
-34
lines changed

4 files changed

+41
-34
lines changed

ompi/mpi/fortran/mpif-h/prototypes_mpi.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -393,7 +393,7 @@ PN2(void, MPI_Session_call_errhandler, mpi_session_call_errhandler, MPI_SESSION_
393393
PN2(void, MPI_Session_create_errhandler, mpi_session_create_errhandler, MPI_SESSION_CREATE_ERRHANDLER, (ompi_errhandler_fortran_handler_fn_t* function, MPI_Fint *errhandler, MPI_Fint *ierr));
394394
PN2(void, MPI_Session_get_errhandler, mpi_session_get_errhandler, MPI_SESSION_GET_ERRHANDLER, (MPI_Fint *session, MPI_Fint *erhandler, MPI_Fint *ierr));
395395
PN2(void, MPI_Session_get_info, mpi_session_get_info, MPI_SESSION_GET_INFO, (MPI_Fint *session, MPI_Fint *info, MPI_Fint *ierr));
396-
PN2(void, MPI_Session_get_nth_pset, mpi_session_get_nth_pset, MPI_SESSION_GET_NTH_PSET, (MPI_Fint *session, MPI_Fint *info, MPI_Fint *n, MPI_Fint *pset_len, char *pset_name, MPI_Fint *ierr));
396+
PN2(void, MPI_Session_get_nth_pset, mpi_session_get_nth_pset, MPI_SESSION_GET_NTH_PSET, (MPI_Fint *session, MPI_Fint *info, MPI_Fint *n, MPI_Fint *pset_len, char *pset_name, MPI_Fint *ierr, int pset_name_len));
397397
PN2(void, MPI_Session_get_num_psets, mpi_session_get_num_psets, MPI_SESSION_GET_NUM_PSETS, (MPI_Fint *session, MPI_Fint *info, MPI_Fint *npset_names, MPI_Fint *ierr));
398398
PN2(void, MPI_Session_get_pset_info, mpi_session_get_pset_info, MPI_SESSION_GET_PSET_INFO, (MPI_Fint *session, char *pset_name, MPI_Fint *info, MPI_Fint *ierr, int name_len));
399399
PN2(void, MPI_Session_init, mpi_session_init, MPI_SESSION_INIT, (MPI_Fint *info, MPI_Fint *errhandler, MPI_Fint *session, MPI_Fint *ierr));

ompi/mpi/fortran/mpif-h/session_get_nth_pset_f.c

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ OMPI_GENERATE_F77_BINDINGS (PMPI_SESSION_GET_NTH_PSET,
4646
pmpi_session_get_nth_pset_,
4747
pmpi_session_get_nth_pset__,
4848
pompi_session_get_nth_pset_f,
49-
(MPI_Fint *session, MPI_Fint *info, MPI_Fint *n, MPI_Fint *pset_len, char *pset_name, MPI_Fint *ierr),
50-
(session, info, n, pset_len, pset_name, ierr))
49+
(MPI_Fint *session, MPI_Fint *info, MPI_Fint *n, MPI_Fint *pset_len, char *pset_name, MPI_Fint *ierr, int pset_name_len),
50+
(session, info, n, pset_len, pset_name, ierr, pset_name_len))
5151
#endif
5252
#endif
5353

@@ -66,14 +66,15 @@ OMPI_GENERATE_F77_BINDINGS (MPI_SESSION_GET_NTH_PSET,
6666
mpi_session_get_nth_pset_,
6767
mpi_session_get_nth_pset__,
6868
ompi_session_get_nth_pset_f,
69-
(MPI_Fint *session, MPI_Fint *info, MPI_Fint *n, MPI_Fint *pset_len, char *pset_name, MPI_Fint *ierr),
70-
(session, info, n, pset_len, pset_name, ierr))
69+
(MPI_Fint *session, MPI_Fint *info, MPI_Fint *n, MPI_Fint *pset_len, char *pset_name, MPI_Fint *ierr, int pset_name_len),
70+
(session, info, n, pset_len, pset_name, ierr, pset_name_len))
7171
#else
7272
#define ompi_session_get_nth_pset_f pompi_session_get_nth_pset_f
7373
#endif
7474
#endif
7575

76-
void ompi_session_get_nth_pset_f(MPI_Fint *session, MPI_Fint *info, MPI_Fint *n, MPI_Fint *pset_len, char *pset_name, MPI_Fint *ierr)
76+
void ompi_session_get_nth_pset_f(MPI_Fint *session, MPI_Fint *info, MPI_Fint *n, MPI_Fint *pset_len, char *pset_name, MPI_Fint *ierr,
77+
int pset_name_len)
7778
{
7879
int c_ierr;
7980
MPI_Session c_session;
@@ -94,8 +95,12 @@ void ompi_session_get_nth_pset_f(MPI_Fint *session, MPI_Fint *info, MPI_Fint *n,
9495
c_ierr = PMPI_Session_get_nth_pset(c_session, MPI_INFO_NULL, *n,
9596
OMPI_SINGLE_NAME_CONVERT(pset_len),
9697
c_name);
98+
/*
99+
* use pset_name_len as that is the length of the supplied pset_name
100+
* otherwise there may be gibberish characters past *pset_len
101+
*/
97102
if (MPI_SUCCESS == c_ierr) {
98-
ompi_fortran_string_c2f(c_name, pset_name, *pset_len);
103+
ompi_fortran_string_c2f(c_name, pset_name, pset_name_len);
99104
}
100105
}
101106

ompi/mpi/fortran/use-mpi-f08/bindings/mpi-f-interfaces-bind.h

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3998,57 +3998,58 @@ end subroutine ompi_neighbor_alltoallw_init_f
39983998
subroutine ompi_session_get_info_f(session, info, ierror) &
39993999
BIND(C, name="ompi_session_get_info_f")
40004000
implicit none
4001-
integer, intent(in) :: session
4002-
integer, intent(out) :: info
4003-
integer, intent(out) :: ierror
4001+
INTEGER, INTENT(IN) :: session
4002+
INTEGER, INTENT(out) :: info
4003+
INTEGER, INTENT(out) :: ierror
40044004
end subroutine ompi_session_get_info_f
40054005

4006-
subroutine ompi_session_get_nth_pset_f(session, info, n, pset_len, pset_name, ierror) &
4006+
subroutine ompi_session_get_nth_pset_f(session, info, n, pset_len, pset_name, ierror, pset_name_len) &
40074007
BIND(C, name="ompi_session_get_nth_pset_f")
4008-
use, intrinsic :: ISO_C_BINDING, only : C_CHAR
4008+
use, intrinsic :: ISO_C_BINDING, only : C_CHAR, C_INT
40094009
implicit none
4010-
integer, intent(in) :: session
4011-
integer, intent(in) :: info
4012-
integer, intent(in) :: n
4013-
integer, intent(inout) :: pset_len
4010+
INTEGER, INTENT(IN) :: session
4011+
INTEGER, INTENT(IN) :: info
4012+
INTEGER, INTENT(IN) :: n
4013+
INTEGER(KIND=C_INT), VALUE, INTENT(IN) :: pset_name_len
4014+
INTEGER, INTENT(INOUT) :: pset_len
40144015
CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(OUT) :: pset_name
4015-
integer, intent(out) :: ierror
4016+
INTEGER, INTENT(out) :: ierror
40164017
end subroutine ompi_session_get_nth_pset_f
40174018

40184019
subroutine ompi_session_get_num_psets_f(session, info, npset_names, ierror) &
40194020
BIND(C, name="ompi_session_get_num_psets_f")
4020-
implicit none
4021-
integer, intent(in) :: session
4022-
integer, intent(in) :: info
4023-
integer, intent(out) :: npset_names
4024-
integer, intent(out) :: ierror
4021+
implicit none
4022+
INTEGER, INTENT(IN) :: session
4023+
INTEGER, INTENT(IN) :: info
4024+
INTEGER, INTENT(out) :: npset_names
4025+
INTEGER, INTENT(out) :: ierror
40254026
end subroutine ompi_session_get_num_psets_f
40264027

40274028
subroutine ompi_session_get_pset_info_f(session, pset_name, info, ierror, name_len) &
40284029
BIND(C, name="ompi_session_get_pset_info_f")
40294030
use, intrinsic :: ISO_C_BINDING, only : C_CHAR
40304031
implicit none
4031-
integer, intent(in) :: session
4032+
INTEGER, INTENT(IN) :: session
40324033
CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(IN) :: pset_name
40334034
INTEGER, VALUE, INTENT(IN) :: name_len
4034-
integer, intent(out) :: info
4035-
integer, intent(out) :: ierror
4035+
INTEGER, INTENT(out) :: info
4036+
INTEGER, INTENT(out) :: ierror
40364037
end subroutine ompi_session_get_pset_info_f
40374038

40384039
subroutine ompi_session_init_f(info, errhandler, session, ierror) &
40394040
BIND(C, name="ompi_session_init_f")
4040-
implicit none
4041-
integer, intent(in) :: info
4042-
integer, intent(in) :: errhandler
4043-
integer, intent(out) :: session
4044-
integer, intent(out) :: ierror
4041+
implicit none
4042+
INTEGER, INTENT(IN) :: info
4043+
INTEGER, INTENT(IN) :: errhandler
4044+
INTEGER, INTENT(out) :: session
4045+
INTEGER, INTENT(out) :: ierror
40454046
end subroutine ompi_session_init_f
40464047

40474048
subroutine ompi_session_finalize_f(session, ierror) &
4048-
BIND(C, name="ompi_session_finalize_f")
4049+
BIND(C, name="ompi_session_finalize_f")
40494050
implicit none
4050-
integer, intent(out) :: session
4051-
integer, intent(out) :: ierror
4051+
INTEGER, INTENT(out) :: session
4052+
INTEGER, INTENT(out) :: ierror
40524053
end subroutine ompi_session_finalize_f
40534054

40544055
subroutine ompi_session_call_errhandler_f(session,errorcode,ierror) &

ompi/mpi/fortran/use-mpi-f08/session_get_nth_pset_f08.F90

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ subroutine MPI_Session_get_nth_pset_f08(session, info, n, pset_len, pset_name, i
2323
INTEGER, OPTIONAL, INTENT(OUT) :: ierror
2424
integer :: c_ierror
2525

26-
call ompi_session_get_nth_pset_f(session%MPI_VAL, MPI_INFO_NULL%MPI_VAL, n, pset_len, pset_name, c_ierror)
26+
call ompi_session_get_nth_pset_f(session%MPI_VAL, MPI_INFO_NULL%MPI_VAL, n, &
27+
pset_len, pset_name, c_ierror, len(pset_name))
2728
if (present(ierror)) ierror = c_ierror
2829

2930
end subroutine MPI_Session_get_nth_pset_f08

0 commit comments

Comments
 (0)