@@ -526,6 +526,14 @@ PAM_EXTERN int pam_sm_authenticate(pam_handle_t * pamh, int flags,
526526
527527 /* Basic validation of username before use anywhere in paths or python */
528528
529+ /* IMPORTANT: when constructing strings from unknown input we must use
530+ * snprintf with the actual buffer size as max size parameter and check
531+ * that the returned value was smaller than that size. Any bigger return
532+ * value means that the buffer was written but the input truncated when
533+ * it attempted to write the returned number of bytes.
534+ * https://pubs.opengroup.org/onlinepubs/9799919799/functions/snprintf.html
535+ */
536+
529537 /* Since we rely on mapping the username to a path on disk,
530538 double check that the name does not contain path traversal attempts
531539 after basic input validation for only safe characters. */
@@ -539,7 +547,7 @@ PAM_EXTERN int pam_sm_authenticate(pam_handle_t * pamh, int flags,
539547 } else {
540548 valid_username = true;
541549 /* pUsername is validated enough to be safely used in python calls */
542- if (USERNAME_MAX_LENGTH = =
550+ if (USERNAME_MAX_LENGTH < =
543551 snprintf (safeUsername , USERNAME_MAX_LENGTH , "%s" , pUsername )) {
544552 WRITELOGMESSAGE (LOG_WARNING ,
545553 "Safe username construction failed for: %s\n" ,
@@ -714,7 +722,7 @@ PAM_EXTERN int pam_sm_authenticate(pam_handle_t * pamh, int flags,
714722 WRITELOGMESSAGE (LOG_DEBUG , "Checking for sharelink: %s\n" , pUsername );
715723 if (strlen (pUsername ) == get_sharelink_length ()) {
716724 char share_path [MAX_PATH_LENGTH ];
717- if (MAX_PATH_LENGTH = =
725+ if (MAX_PATH_LENGTH < =
718726 snprintf (share_path , MAX_PATH_LENGTH , "%s/%s/%s" ,
719727 get_sharelink_home (), SHARELINK_SUBDIR , pUsername )) {
720728 WRITELOGMESSAGE (LOG_WARNING ,
@@ -780,7 +788,7 @@ PAM_EXTERN int pam_sm_authenticate(pam_handle_t * pamh, int flags,
780788 WRITELOGMESSAGE (LOG_DEBUG , "Checking for jobsidmount: %s\n" , pUsername );
781789 if (strlen (pUsername ) == get_jobsidmount_length ()) {
782790 char share_path [MAX_PATH_LENGTH ];
783- if (MAX_PATH_LENGTH = =
791+ if (MAX_PATH_LENGTH < =
784792 snprintf (share_path , MAX_PATH_LENGTH , "%s/%s" ,
785793 get_jobsidmount_home (), pUsername )) {
786794 WRITELOGMESSAGE (LOG_WARNING ,
@@ -860,7 +868,7 @@ PAM_EXTERN int pam_sm_authenticate(pam_handle_t * pamh, int flags,
860868 WRITELOGMESSAGE (LOG_DEBUG , "Checking for jupytersidmount: %s\n" , pUsername );
861869 if (strlen (pUsername ) == get_jupytersidmount_length ()) {
862870 char share_path [MAX_PATH_LENGTH ];
863- if (MAX_PATH_LENGTH = =
871+ if (MAX_PATH_LENGTH < =
864872 snprintf (share_path , MAX_PATH_LENGTH , "%s/%s" ,
865873 get_jupytersidmount_home (), pUsername )) {
866874 WRITELOGMESSAGE (LOG_WARNING ,
@@ -952,7 +960,7 @@ PAM_EXTERN int pam_sm_authenticate(pam_handle_t * pamh, int flags,
952960 }
953961
954962 char auth_filename [MAX_PATH_LENGTH ];
955- if (MAX_PATH_LENGTH = =
963+ if (MAX_PATH_LENGTH < =
956964 snprintf (auth_filename , MAX_PATH_LENGTH , "%s/.%s/%s" , pw -> pw_dir ,
957965 get_service_dir (pService ), PASSWORD_FILENAME )) {
958966 WRITELOGMESSAGE (LOG_WARNING ,
0 commit comments