@@ -681,13 +681,13 @@ int verify_user_added_events(uint32_t *events_id, int num_events, cuptip_control
681681 // Reconstructing event name. Append the basename, stat, and sub-metric.
682682 size_t basename_len = stat_position - cuptiu_table_p -> events [info .nameid ].basenameWithStatReplaced ;
683683 char reconstructedEventName [PAPI_HUGE_STR_LEN ]= "" ;
684- strLen = snprintf (reconstructedEventName , PAPI_MAX_STR_LEN , "%.*s%s%s" ,
684+ strLen = snprintf (reconstructedEventName , PAPI_HUGE_STR_LEN , "%.*s%s%s" ,
685685 (int )basename_len ,
686686 cuptiu_table_p -> events [info .nameid ].basenameWithStatReplaced ,
687687 stat ,
688688 stat_position + 4 );
689- if (strLen < 0 || strLen >= PAPI_MAX_STR_LEN ) {
690- SUBDBG ("Failed to fully write reconstructed event name.\n" );
689+ if (strLen < 0 || strLen >= PAPI_HUGE_STR_LEN ) {
690+ SUBDBG ("Failed to add the CUPTI metric name as reconstruction of the basename and stat exceeded the buffer size .\n" );
691691 return PAPI_EBUF ;
692692 }
693693
@@ -705,9 +705,9 @@ int verify_user_added_events(uint32_t *events_id, int num_events, cuptip_control
705705 int idx = state -> gpu_ctl [info .device ].added_events -> count ;
706706 // Store metadata
707707 strLen = snprintf (state -> gpu_ctl [info .device ].added_events -> cuda_evts [idx ],
708- PAPI_MAX_STR_LEN , "%s" , reconstructedEventName );
709- if (strLen < 0 || strLen >= PAPI_MAX_STR_LEN ) {
710- SUBDBG ("Failed to fully write reconstructed Cuda event name to array of added events.\n" );
708+ PAPI_HUGE_STR_LEN , "%s" , reconstructedEventName );
709+ if (strLen < 0 || strLen >= PAPI_HUGE_STR_LEN ) {
710+ SUBDBG ("Failed to fully write the reconstructed CUPTI metric name to array of added events.\n" );
711711 return PAPI_EBUF ;
712712 }
713713 state -> gpu_ctl [info .device ].added_events -> cuda_devs [idx ] = info .device ;
@@ -1475,15 +1475,15 @@ static int get_ntv_events(cuptiu_event_table_t *evt_table, const char *evt_name,
14751475 // Increment event count
14761476 (* count )++ ;
14771477
1478- strLen = snprintf (event -> name , PAPI_2MAX_STR_LEN , "%s" , name_no_stat );
1479- if (strLen < 0 || strLen >= PAPI_2MAX_STR_LEN ) {
1480- ERRDBG ("Failed to fully write name with no stat.\n" );
1478+ strLen = snprintf (event -> name , PAPI_HUGE_STR_LEN , "%s" , name_no_stat );
1479+ if (strLen < 0 || strLen >= PAPI_HUGE_STR_LEN ) {
1480+ ERRDBG ("Failed to fully write CUPTI metric name with no ' stat' .\n" );
14811481 return PAPI_EBUF ;
14821482 }
14831483
1484- strLen = snprintf (event -> basenameWithStatReplaced , sizeof ( event -> basenameWithStatReplaced ) , "%s" , name_restruct );
1484+ strLen = snprintf (event -> basenameWithStatReplaced , PAPI_HUGE_STR_LEN , "%s" , name_restruct );
14851485 if (strLen < 0 || strLen >= PAPI_HUGE_STR_LEN ) {
1486- ERRDBG ("String larger than PAPI_HUGE_STR_LEN " );
1486+ ERRDBG ("Failed to fully write CUPTI metric name with the stat value replaced with 'stat'.\n " );
14871487 return PAPI_EBUF ;
14881488 }
14891489
@@ -1659,10 +1659,10 @@ int cuptip_evt_name_to_code(const char *name, uint32_t *event_code)
16591659{
16601660 int htable_errno , device , stat , flags , nameid , papi_errno = PAPI_OK ;
16611661 cuptiu_event_t * event ;
1662- char base [PAPI_MAX_STR_LEN ] = { 0 };
1662+ char base [PAPI_HUGE_STR_LEN ] = { 0 };
16631663 SUBDBG ("ENTER: name: %s, event_code: %p\n" , name , event_code );
16641664
1665- papi_errno = evt_name_to_basename (name , base , PAPI_MAX_STR_LEN );
1665+ papi_errno = evt_name_to_basename (name , base , PAPI_HUGE_STR_LEN );
16661666 if (papi_errno != PAPI_OK ) {
16671667 goto fn_exit ;
16681668 }
@@ -1775,11 +1775,11 @@ static int evt_code_to_name(uint32_t event_code, char *name, int len)
17751775 }
17761776
17771777 int str_len ;
1778- char stat [PAPI_HUGE_STR_LEN ] = "" ;
1778+ char stat [PAPI_MIN_STR_LEN ] = "" ;
17791779 if (info .stat < NUM_STATS_QUALS ){
1780- str_len = snprintf (stat , sizeof ( stat ) , "%s" , stats [info .stat ]);
1781- if (str_len < 0 || str_len >= PAPI_HUGE_STR_LEN ) {
1782- ERRDBG ("String larger than PAPI_HUGE_STR_LEN " );
1780+ str_len = snprintf (stat , PAPI_MIN_STR_LEN , "%s" , stats [info .stat ]);
1781+ if (str_len < 0 || str_len >= PAPI_MIN_STR_LEN ) {
1782+ ERRDBG ("Failed to fully write statistic qualifier name.\n " );
17831783 return PAPI_EBUF ;
17841784 }
17851785 }
@@ -1794,7 +1794,7 @@ static int evt_code_to_name(uint32_t event_code, char *name, int len)
17941794 break ;
17951795 case (STAT_FLAG ):
17961796 str_len = snprintf (name , len , "%s:stat=%s" , cuptiu_table_p -> events [info .nameid ].name , stat );
1797- if (str_len < 0 || str_len >= PAPI_HUGE_STR_LEN ) {
1797+ if (str_len < 0 || str_len >= len ) {
17981798 ERRDBG ("String formatting exceeded max string length.\n" );
17991799 return PAPI_EBUF ;
18001800 }
@@ -1841,11 +1841,15 @@ int cuptip_evt_code_to_info(uint32_t event_code, PAPI_event_info_t *info)
18411841 }
18421842 size_t basename_len = stat_position - cuptiu_table_p -> events [inf .nameid ].basenameWithStatReplaced ;
18431843 char reconstructedEventName [PAPI_HUGE_STR_LEN ]= "" ;
1844- int strLen = snprintf (reconstructedEventName , PAPI_MAX_STR_LEN , "%.*s%s%s" ,
1844+ int strLen = snprintf (reconstructedEventName , PAPI_HUGE_STR_LEN , "%.*s%s%s" ,
18451845 (int )basename_len ,
18461846 cuptiu_table_p -> events [inf .nameid ].basenameWithStatReplaced ,
18471847 cuptiu_table_p -> events [inf .nameid ].stat -> arrayMetricStatistics [0 ],
18481848 stat_position + 4 );
1849+ if (strLen < 0 || strLen >= PAPI_HUGE_STR_LEN ) {
1850+ SUBDBG ("Failed to reconstruct CUPTI metric name with the basename and stat.\n" );
1851+ return PAPI_EBUF ;
1852+ }
18491853
18501854 int i ;
18511855 // For a Cuda event collect the description, units, and number of passes
@@ -1890,7 +1894,7 @@ int cuptip_evt_code_to_info(uint32_t event_code, PAPI_event_info_t *info)
18901894 }
18911895 case DEVICE_FLAG :
18921896 {
1893- char devices [PAPI_MAX_STR_LEN ] = { 0 };
1897+ char devices [PAPI_2MAX_STR_LEN ] = { 0 };
18941898 int init_metric_dev_id ;
18951899 for (i = 0 ; i < numDevicesOnMachine ; ++ i ) {
18961900 if (cuptiu_dev_check (cuptiu_table_p -> events [inf .nameid ].device_map , i )) {
@@ -1900,9 +1904,10 @@ int cuptip_evt_code_to_info(uint32_t event_code, PAPI_event_info_t *info)
19001904 init_metric_dev_id = i ;
19011905
19021906 }
1903- int strLen = snprintf (devices + strlen (devices ), PAPI_MAX_STR_LEN , "%i," , i );
1904- if (strLen < 0 || strLen >= PAPI_MAX_STR_LEN ) {
1905- ERRDBG ("Failed to fully write device qualifiers.\n" );
1907+ int strLen = snprintf (devices + strlen (devices ), PAPI_2MAX_STR_LEN - strlen (devices ), "%i," , i );
1908+ if (strLen < 0 || strLen >= PAPI_2MAX_STR_LEN - strlen (devices )) {
1909+ SUBDBG ("Failed to write device %d into devices in DEVICE_FLAG case.\n" , i );
1910+ return PAPI_EBUF ;
19061911 }
19071912
19081913 }
@@ -1964,7 +1969,7 @@ int cuptip_evt_code_to_info(uint32_t event_code, PAPI_event_info_t *info)
19641969 case (STAT_FLAG | DEVICE_FLAG ):
19651970 {
19661971 int init_metric_dev_id ;
1967- char devices [PAPI_MAX_STR_LEN ] = { 0 };
1972+ char devices [PAPI_2MAX_STR_LEN ] = { 0 };
19681973 for (i = 0 ; i < numDevicesOnMachine ; ++ i ) {
19691974 if (cuptiu_dev_check (cuptiu_table_p -> events [inf .nameid ].device_map , i )) {
19701975 /* for an event, store the first device found to use with :device=#,
@@ -1973,7 +1978,11 @@ int cuptip_evt_code_to_info(uint32_t event_code, PAPI_event_info_t *info)
19731978 init_metric_dev_id = i ;
19741979 }
19751980
1976- sprintf (devices + strlen (devices ), "%i," , i );
1981+ strLen = snprintf (devices + strlen (devices ), PAPI_2MAX_STR_LEN - strlen (devices ), "%i," , i );
1982+ if (strLen < 0 || strLen >= PAPI_2MAX_STR_LEN - strlen (devices )) {
1983+ SUBDBG ("Failed to write device %d into devices in STAT_FLAG | DEVICE_FLAG case.\n" , i );
1984+ return PAPI_EBUF ;
1985+ }
19771986 }
19781987 }
19791988 * (devices + strlen (devices ) - 1 ) = 0 ;
@@ -2060,9 +2069,9 @@ static int evt_name_to_basename(const char *name, char *base, int len)
20602069static int cuda_verify_qualifiers_are_not_repeated (const char * qualifiers )
20612070{
20622071 int numDeviceQualifiers = 0 , numStatsQualifiers = 0 ;
2063- char tmpQualifiers [PAPI_2MAX_STR_LEN ];
2064- int strLen = snprintf (tmpQualifiers , PAPI_2MAX_STR_LEN , "%s" , qualifiers );
2065- if (strLen < 0 || strLen >= PAPI_2MAX_STR_LEN ) {
2072+ char tmpQualifiers [PAPI_HUGE_STR_LEN ];
2073+ int strLen = snprintf (tmpQualifiers , PAPI_HUGE_STR_LEN , "%s" , qualifiers );
2074+ if (strLen < 0 || strLen >= PAPI_HUGE_STR_LEN ) {
20662075 SUBDBG ("Failed to fully write qualifiers into tmpQualifiers.\n" );
20672076 return PAPI_EBUF ;
20682077 }
@@ -2094,9 +2103,9 @@ static int cuda_verify_qualifiers_are_not_repeated(const char *qualifiers)
20942103*/
20952104static int cuda_verify_qualifiers_are_valid (const char * qualifiers )
20962105{
2097- char tmpQualifiers [PAPI_2MAX_STR_LEN ];
2098- int strLen = snprintf (tmpQualifiers , PAPI_2MAX_STR_LEN , "%s" , qualifiers );
2099- if (strLen < 0 || strLen >= PAPI_2MAX_STR_LEN ) {
2106+ char tmpQualifiers [PAPI_HUGE_STR_LEN ];
2107+ int strLen = snprintf (tmpQualifiers , PAPI_HUGE_STR_LEN , "%s" , qualifiers );
2108+ if (strLen < 0 || strLen >= PAPI_HUGE_STR_LEN ) {
21002109 SUBDBG ("Failed to fully write qualifiers into tmpQualifiers.\n" );
21012110 return PAPI_EBUF ;
21022111 }
@@ -2361,9 +2370,9 @@ static int enumerate_metrics_for_unique_devices(const char *pChipName, int *tota
23612370 continue ;
23622371 }
23632372
2364- char fullMetricName [PAPI_2MAX_STR_LEN ];
2365- int strLen = snprintf (fullMetricName , PAPI_2MAX_STR_LEN , "%s" , baseMetricName );
2366- if (strLen < 0 || strLen >= PAPI_2MAX_STR_LEN ) {
2373+ char fullMetricName [PAPI_HUGE_STR_LEN ];
2374+ int strLen = snprintf (fullMetricName , PAPI_HUGE_STR_LEN , "%s" , baseMetricName );
2375+ if (strLen < 0 || strLen >= PAPI_HUGE_STR_LEN ) {
23672376 SUBDBG ("Failed to fully append the base metric name.\n" );
23682377 return PAPI_EBUF ;
23692378 }
@@ -2381,8 +2390,8 @@ static int enumerate_metrics_for_unique_devices(const char *pChipName, int *tota
23812390 return papi_errno ;
23822391 }
23832392
2384- strLen = snprintf (fullMetricName + offsetForMetricName , PAPI_2MAX_STR_LEN - offsetForMetricName , "%s" , rollupMetricName );
2385- if (strLen < 0 || strLen >= PAPI_2MAX_STR_LEN ) {
2393+ strLen = snprintf (fullMetricName + offsetForMetricName , PAPI_HUGE_STR_LEN - offsetForMetricName , "%s" , rollupMetricName );
2394+ if (strLen < 0 || strLen >= PAPI_HUGE_STR_LEN - offsetForMetricName ) {
23862395 SUBDBG ("Failed to fully append rollup metric name.\n" );
23872396 return PAPI_EBUF ;
23882397 }
@@ -2408,8 +2417,8 @@ static int enumerate_metrics_for_unique_devices(const char *pChipName, int *tota
24082417 }
24092418
24102419 if (supportedSubMetrics .pSupportedSubmetrics [subMetricIdx ] != NVPW_SUBMETRIC_NONE ) {
2411- strLen = snprintf (fullMetricName + offsetForMetricName , PAPI_2MAX_STR_LEN - offsetForMetricName , "%s" , subMetricName );
2412- if (strLen < 0 || strLen >= PAPI_2MAX_STR_LEN ) {
2420+ strLen = snprintf (fullMetricName + offsetForMetricName , PAPI_HUGE_STR_LEN - offsetForMetricName , "%s" , subMetricName );
2421+ if (strLen < 0 || strLen >= PAPI_HUGE_STR_LEN - offsetForMetricName ) {
24132422 SUBDBG ("Failed to fully append submetric names.\n" );
24142423 return PAPI_EBUF ;
24152424 }
@@ -2420,15 +2429,15 @@ static int enumerate_metrics_for_unique_devices(const char *pChipName, int *tota
24202429 SUBDBG ("Failed to allocate memory for metricNames.\n" );
24212430 return PAPI_ENOMEM ;
24222431 }
2423- metricNames [metricCount ] = (char * ) malloc (PAPI_2MAX_STR_LEN * sizeof (char ));
2432+ metricNames [metricCount ] = (char * ) malloc (PAPI_HUGE_STR_LEN * sizeof (char ));
24242433 if (metricNames [metricCount ] == NULL ) {
24252434 SUBDBG ("Failed to allocate memory for the index %d in the array metricNames.\n" , metricCount );
24262435 return PAPI_ENOMEM ;
24272436 }
24282437
24292438 // Store the constructed metric name
2430- strLen = snprintf (metricNames [metricCount ], PAPI_2MAX_STR_LEN , "%s" , fullMetricName );
2431- if (strLen < 0 || strLen >= PAPI_2MAX_STR_LEN ) {
2439+ strLen = snprintf (metricNames [metricCount ], PAPI_HUGE_STR_LEN , "%s" , fullMetricName );
2440+ if (strLen < 0 || strLen >= PAPI_HUGE_STR_LEN ) {
24322441 SUBDBG ("Failed to fully write constructued metric name: %s\n" , fullMetricName );
24332442 return PAPI_EBUF ;
24342443 }
@@ -2661,8 +2670,8 @@ static int get_metric_properties(const char *pChipName, const char *metricName,
26612670 dimUnitsParams .pDimUnits = dimUnitsFactor ;
26622671 nvpwCheckErrors ( NVPW_MetricsEvaluator_GetMetricDimUnitsPtr (& dimUnitsParams ), return PAPI_EMISC );
26632672
2664- char tmpMetricUnits [PAPI_MAX_STR_LEN ] = { 0 };
2665- int i ;
2673+ char tmpMetricUnits [PAPI_HUGE_STR_LEN ] = { 0 };
2674+ int i , offsetMetricUnits = 0 ;
26662675 for (i = 0 ; i < dimUnitsParams .numDimUnits ; i ++ ) {
26672676 NVPW_MetricsEvaluator_DimUnitToString_Params dimUnitToStringParams = {NVPW_MetricsEvaluator_DimUnitToString_Params_STRUCT_SIZE };
26682677 dimUnitToStringParams .pMetricsEvaluator = pMetricsEvaluator ;
@@ -2671,11 +2680,12 @@ static int get_metric_properties(const char *pChipName, const char *metricName,
26712680 nvpwCheckErrors ( NVPW_MetricsEvaluator_DimUnitToStringPtr (& dimUnitToStringParams ), return PAPI_EMISC );
26722681
26732682 char * unitsFormat = (i == 0 ) ? "%s" : "/%s" ;
2674- strLen = snprintf (tmpMetricUnits + strlen ( tmpMetricUnits ), PAPI_MAX_STR_LEN - strlen ( tmpMetricUnits ) , unitsFormat , dimUnitToStringParams .pPluralName );
2675- if (strLen < 0 || strLen >= PAPI_MAX_STR_LEN ) {
2683+ strLen = snprintf (tmpMetricUnits + offsetMetricUnits , PAPI_HUGE_STR_LEN - offsetMetricUnits , unitsFormat , dimUnitToStringParams .pPluralName );
2684+ if (strLen < 0 || strLen >= PAPI_HUGE_STR_LEN - offsetMetricUnits ) {
26762685 SUBDBG ("Failed to fully write dimensional units for a metric.\n" );
26772686 return PAPI_EBUF ;
26782687 }
2688+ offsetMetricUnits = strlen (tmpMetricUnits );
26792689 }
26802690 free (dimUnitsFactor );
26812691 metricUnits = tmpMetricUnits ;
0 commit comments