2121#include "opal/mca/pmix/pmix-internal.h"
2222#include "opal/memoryhooks/memory.h"
2323#include "opal/util/argv.h"
24+ #include "opal/util/printf.h"
2425
2526#include <fnmatch.h>
2627#include <stdio.h>
@@ -203,21 +204,23 @@ static bool opal_common_ucx_check_device(const char *device_name, char **device_
203204{
204205 char sysfs_driver_link [PATH_MAX ];
205206 char driver_path [PATH_MAX ];
206- char * ib_device_name ;
207+ char ib_device_name [ NAME_MAX ] ;
207208 char * driver_name ;
208209 char * * list_item ;
209210 ssize_t ret ;
211+ char ib_device_name_fmt [NAME_MAX ];
210212
211213 /* mlx5_0:1 */
212- ret = sscanf (device_name , "%m[^:]%*d" , & ib_device_name );
214+ opal_snprintf (ib_device_name_fmt , sizeof (ib_device_name_fmt ),
215+ "%%%u[^:]%%*d" , NAME_MAX - 1 );
216+ ret = sscanf (device_name , ib_device_name_fmt , & ib_device_name );
213217 if (ret != 1 ) {
214218 return false;
215219 }
216220
217221 sysfs_driver_link [sizeof (sysfs_driver_link ) - 1 ] = '\0' ;
218222 snprintf (sysfs_driver_link , sizeof (sysfs_driver_link ) - 1 ,
219223 "/sys/class/infiniband/%s/device/driver" , ib_device_name );
220- free (ib_device_name );
221224
222225 ret = readlink (sysfs_driver_link , driver_path , sizeof (driver_path ) - 1 );
223226 if (ret < 0 ) {
@@ -246,7 +249,8 @@ OPAL_DECLSPEC opal_common_ucx_support_level_t opal_common_ucx_support_level(ucp_
246249 [OPAL_COMMON_UCX_SUPPORT_TRANSPORT ] = "transports only" ,
247250 [OPAL_COMMON_UCX_SUPPORT_DEVICE ] = "transports and devices" };
248251#if HAVE_DECL_OPEN_MEMSTREAM
249- char * rsc_tl_name , * rsc_device_name ;
252+ char rsc_tl_name [NAME_MAX ], rsc_device_name [NAME_MAX ];
253+ char rsc_name_fmt [NAME_MAX ];
250254 char * * tl_list , * * device_list , * * list_item ;
251255 bool is_any_tl , is_any_device ;
252256 bool found_tl , negate ;
@@ -298,17 +302,17 @@ OPAL_DECLSPEC opal_common_ucx_support_level_t opal_common_ucx_support_level(ucp_
298302 /* Print ucx transports information to the memory stream */
299303 ucp_context_print_info (context , stream );
300304
305+ /* "# resource 6 : md 5 dev 4 flags -- rc_verbs/mlx5_0:1" */
306+ opal_snprintf (rsc_name_fmt , sizeof (rsc_name_fmt ),
307+ "# resource %%*d : md %%*d dev %%*d flags -- %%%u[^/ \n\r]/%%%u[^/ \n\r]" ,
308+ NAME_MAX - 1 , NAME_MAX - 1 );
309+
301310 /* Rewind and read transports/devices list from the stream */
302311 fseek (stream , 0 , SEEK_SET );
303312 while ((support_level != OPAL_COMMON_UCX_SUPPORT_DEVICE )
304313 && (fgets (line , sizeof (line ), stream ) != NULL )) {
305- rsc_tl_name = NULL ;
306- ret = sscanf (line ,
307- /* "# resource 6 : md 5 dev 4 flags -- rc_verbs/mlx5_0:1" */
308- "# resource %*d : md %*d dev %*d flags -- %m[^/ \n\r]/%m[^/ \n\r]" ,
309- & rsc_tl_name , & rsc_device_name );
314+ ret = sscanf (line , rsc_name_fmt , rsc_tl_name , rsc_device_name );
310315 if (ret != 2 ) {
311- free (rsc_tl_name );
312316 continue ;
313317 }
314318
@@ -334,9 +338,6 @@ OPAL_DECLSPEC opal_common_ucx_support_level_t opal_common_ucx_support_level(ucp_
334338 MCA_COMMON_UCX_VERBOSE (2 , "%s/%s: did not match transport list" , rsc_tl_name ,
335339 rsc_device_name );
336340 }
337-
338- free (rsc_device_name );
339- free (rsc_tl_name );
340341 }
341342
342343 MCA_COMMON_UCX_VERBOSE (2 , "support level is %s" , support_level_names [support_level ]);
0 commit comments