Skip to content

Commit 409add2

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 <[email protected]> (cherry picked from commit 50ca64c)
1 parent bf2840a commit 409add2

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
@@ -3997,57 +3997,58 @@ end subroutine ompi_neighbor_alltoallw_init_f
39973997
subroutine ompi_session_get_info_f(session, info, ierror) &
39983998
BIND(C, name="ompi_session_get_info_f")
39993999
implicit none
4000-
integer, intent(in) :: session
4001-
integer, intent(out) :: info
4002-
integer, intent(out) :: ierror
4000+
INTEGER, INTENT(IN) :: session
4001+
INTEGER, INTENT(out) :: info
4002+
INTEGER, INTENT(out) :: ierror
40034003
end subroutine ompi_session_get_info_f
40044004

4005-
subroutine ompi_session_get_nth_pset_f(session, info, n, pset_len, pset_name, ierror) &
4005+
subroutine ompi_session_get_nth_pset_f(session, info, n, pset_len, pset_name, ierror, pset_name_len) &
40064006
BIND(C, name="ompi_session_get_nth_pset_f")
4007-
use, intrinsic :: ISO_C_BINDING, only : C_CHAR
4007+
use, intrinsic :: ISO_C_BINDING, only : C_CHAR, C_INT
40084008
implicit none
4009-
integer, intent(in) :: session
4010-
integer, intent(in) :: info
4011-
integer, intent(in) :: n
4012-
integer, intent(inout) :: pset_len
4009+
INTEGER, INTENT(IN) :: session
4010+
INTEGER, INTENT(IN) :: info
4011+
INTEGER, INTENT(IN) :: n
4012+
INTEGER(KIND=C_INT), VALUE, INTENT(IN) :: pset_name_len
4013+
INTEGER, INTENT(INOUT) :: pset_len
40134014
CHARACTER(KIND=C_CHAR), DIMENSION(*), INTENT(OUT) :: pset_name
4014-
integer, intent(out) :: ierror
4015+
INTEGER, INTENT(out) :: ierror
40154016
end subroutine ompi_session_get_nth_pset_f
40164017

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

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

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

40464047
subroutine ompi_session_finalize_f(session, ierror) &
4047-
BIND(C, name="ompi_session_finalize_f")
4048+
BIND(C, name="ompi_session_finalize_f")
40484049
implicit none
4049-
integer, intent(out) :: session
4050-
integer, intent(out) :: ierror
4050+
INTEGER, INTENT(out) :: session
4051+
INTEGER, INTENT(out) :: ierror
40514052
end subroutine ompi_session_finalize_f
40524053

40534054
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)