@@ -296,6 +296,7 @@ int determine_platform(struct flb_kube *ctx)
296296 char * first_dot ;
297297 char * second_dot ;
298298 size_t payload_b64_len ;
299+ size_t padded_len ;
299300 char * payload_b64 ;
300301 size_t issuer_len ;
301302 char * issuer_value ;
@@ -321,14 +322,28 @@ int determine_platform(struct flb_kube *ctx)
321322
322323 /* Extract and decode the payload (middle part) */
323324 payload_b64_len = second_dot - (first_dot + 1 );
324- payload_b64 = flb_malloc (payload_b64_len + 1 );
325+
326+ /* Calculate padded length */
327+ padded_len = payload_b64_len ;
328+ while (padded_len % 4 != 0 ) padded_len ++ ;
329+
330+ payload_b64 = flb_malloc (padded_len + 1 );
325331 if (!payload_b64 ) {
326332 flb_free (token_buf );
327333 return -1 ;
328334 }
329335
330336 memcpy (payload_b64 , first_dot + 1 , payload_b64_len );
331- payload_b64 [payload_b64_len ] = '\0' ;
337+
338+ /* Convert base64url to base64 and add padding */
339+ for (size_t i = 0 ; i < payload_b64_len ; i ++ ) {
340+ if (payload_b64 [i ] == '-' ) payload_b64 [i ] = '+' ;
341+ else if (payload_b64 [i ] == '_' ) payload_b64 [i ] = '/' ;
342+ }
343+ while (payload_b64_len < padded_len ) {
344+ payload_b64 [payload_b64_len ++ ] = '=' ;
345+ }
346+ payload_b64 [padded_len ] = '\0' ;
332347
333348 /* Base64 decode the payload */
334349 payload = flb_malloc (payload_b64_len * 3 / 4 + 4 ); /* Conservative size estimate */
@@ -338,8 +353,8 @@ int determine_platform(struct flb_kube *ctx)
338353 return -1 ;
339354 }
340355
341- ret = flb_base64_decode ((unsigned char * )payload , payload_b64_len * 3 / 4 + 4 ,
342- & payload_len , (unsigned char * )payload_b64 , payload_b64_len );
356+ ret = flb_base64_decode ((unsigned char * )payload , padded_len * 3 / 4 + 4 ,
357+ & payload_len , (unsigned char * )payload_b64 , padded_len );
343358
344359 flb_free (token_buf );
345360 flb_free (payload_b64 );
0 commit comments