@@ -1805,37 +1805,49 @@ pqConnectOptions2(PGconn *conn)
18051805int len ;
18061806
18071807len = pg_b64_dec_len (strlen (conn -> scram_client_key ));
1808- /* Consider the zero-terminator */
1809- if (len != SCRAM_MAX_KEY_LEN + 1 )
1808+ conn -> scram_client_key_binary = malloc (len );
1809+ if (!conn -> scram_client_key_binary )
1810+ gotooom_error ;
1811+ len = pg_b64_decode (conn -> scram_client_key ,strlen (conn -> scram_client_key ),
1812+ conn -> scram_client_key_binary ,len );
1813+ if (len < 0 )
1814+ {
1815+ libpq_append_conn_error (conn ,"invalid SCRAM client key" );
1816+ free (conn -> scram_client_key_binary );
1817+ return false;
1818+ }
1819+ if (len != SCRAM_MAX_KEY_LEN )
18101820{
18111821libpq_append_conn_error (conn ,"invalid SCRAM client key length: %d" ,len );
1822+ free (conn -> scram_client_key_binary );
18121823return false;
18131824}
18141825conn -> scram_client_key_len = len ;
1815- conn -> scram_client_key_binary = malloc (len );
1816- if (!conn -> scram_client_key_binary )
1817- gotooom_error ;
1818- pg_b64_decode (conn -> scram_client_key ,strlen (conn -> scram_client_key ),
1819- conn -> scram_client_key_binary ,len );
18201826}
18211827
18221828if (conn -> scram_server_key )
18231829{
18241830int len ;
18251831
18261832len = pg_b64_dec_len (strlen (conn -> scram_server_key ));
1827- /* Consider the zero-terminator */
1828- if (len != SCRAM_MAX_KEY_LEN + 1 )
1833+ conn -> scram_server_key_binary = malloc (len );
1834+ if (!conn -> scram_server_key_binary )
1835+ gotooom_error ;
1836+ len = pg_b64_decode (conn -> scram_server_key ,strlen (conn -> scram_server_key ),
1837+ conn -> scram_server_key_binary ,len );
1838+ if (len < 0 )
1839+ {
1840+ libpq_append_conn_error (conn ,"invalid SCRAM server key" );
1841+ free (conn -> scram_server_key_binary );
1842+ return false;
1843+ }
1844+ if (len != SCRAM_MAX_KEY_LEN )
18291845{
18301846libpq_append_conn_error (conn ,"invalid SCRAM server key length: %d" ,len );
1847+ free (conn -> scram_server_key_binary );
18311848return false;
18321849}
18331850conn -> scram_server_key_len = len ;
1834- conn -> scram_server_key_binary = malloc (len );
1835- if (!conn -> scram_server_key_binary )
1836- gotooom_error ;
1837- pg_b64_decode (conn -> scram_server_key ,strlen (conn -> scram_server_key ),
1838- conn -> scram_server_key_binary ,len );
18391851}
18401852
18411853/*