@@ -208,14 +208,14 @@ pg_fe_scram_exchange(void *opaq, char *input, int inputlen,
208
208
{
209
209
if (inputlen == 0 )
210
210
{
211
- printfPQExpBuffer (& conn -> errorMessage ,
212
- libpq_gettext ("malformed SCRAM message (empty message)\n" ));
211
+ appendPQExpBufferStr (& conn -> errorMessage ,
212
+ libpq_gettext ("malformed SCRAM message (empty message)\n" ));
213
213
goto error ;
214
214
}
215
215
if (inputlen != strlen (input ))
216
216
{
217
- printfPQExpBuffer (& conn -> errorMessage ,
218
- libpq_gettext ("malformed SCRAM message (length mismatch)\n" ));
217
+ appendPQExpBufferStr (& conn -> errorMessage ,
218
+ libpq_gettext ("malformed SCRAM message (length mismatch)\n" ));
219
219
goto error ;
220
220
}
221
221
}
@@ -258,24 +258,24 @@ pg_fe_scram_exchange(void *opaq, char *input, int inputlen,
258
258
*/
259
259
if (!verify_server_signature (state , success ))
260
260
{
261
- printfPQExpBuffer (& conn -> errorMessage ,
262
- libpq_gettext ("could not verify server signature\n" ));
261
+ appendPQExpBufferStr (& conn -> errorMessage ,
262
+ libpq_gettext ("could not verify server signature\n" ));
263
263
goto error ;
264
264
}
265
265
266
266
if (!* success )
267
267
{
268
- printfPQExpBuffer (& conn -> errorMessage ,
269
- libpq_gettext ("incorrect server signature\n" ));
268
+ appendPQExpBufferStr (& conn -> errorMessage ,
269
+ libpq_gettext ("incorrect server signature\n" ));
270
270
}
271
271
* done = true;
272
272
state -> state = FE_SCRAM_FINISHED ;
273
273
break ;
274
274
275
275
default :
276
276
/* shouldn't happen */
277
- printfPQExpBuffer (& conn -> errorMessage ,
278
- libpq_gettext ("invalid SCRAM exchange state\n" ));
277
+ appendPQExpBufferStr (& conn -> errorMessage ,
278
+ libpq_gettext ("invalid SCRAM exchange state\n" ));
279
279
goto error ;
280
280
}
281
281
return ;
@@ -287,6 +287,11 @@ pg_fe_scram_exchange(void *opaq, char *input, int inputlen,
287
287
288
288
/*
289
289
* Read value for an attribute part of a SCRAM message.
290
+ *
291
+ * The buffer at **input is destructively modified, and *input is
292
+ * advanced over the "attr=value" string and any following comma.
293
+ *
294
+ * On failure, append an error message to *errorMessage and return NULL.
290
295
*/
291
296
static char *
292
297
read_attr_value (char * * input , char attr , PQExpBuffer errorMessage )
@@ -296,7 +301,7 @@ read_attr_value(char **input, char attr, PQExpBuffer errorMessage)
296
301
297
302
if (* begin != attr )
298
303
{
299
- printfPQExpBuffer (errorMessage ,
304
+ appendPQExpBuffer (errorMessage ,
300
305
libpq_gettext ("malformed SCRAM message (attribute \"%c\" expected)\n" ),
301
306
attr );
302
307
return NULL ;
@@ -305,7 +310,7 @@ read_attr_value(char **input, char attr, PQExpBuffer errorMessage)
305
310
306
311
if (* begin != '=' )
307
312
{
308
- printfPQExpBuffer (errorMessage ,
313
+ appendPQExpBuffer (errorMessage ,
309
314
libpq_gettext ("malformed SCRAM message (expected character \"=\" for attribute \"%c\")\n" ),
310
315
attr );
311
316
return NULL ;
@@ -346,8 +351,8 @@ build_client_first_message(fe_scram_state *state)
346
351
*/
347
352
if (!pg_strong_random (raw_nonce , SCRAM_RAW_NONCE_LEN ))
348
353
{
349
- printfPQExpBuffer (& conn -> errorMessage ,
350
- libpq_gettext ("could not generate nonce\n" ));
354
+ appendPQExpBufferStr (& conn -> errorMessage ,
355
+ libpq_gettext ("could not generate nonce\n" ));
351
356
return NULL ;
352
357
}
353
358
@@ -356,16 +361,16 @@ build_client_first_message(fe_scram_state *state)
356
361
state -> client_nonce = malloc (encoded_len + 1 );
357
362
if (state -> client_nonce == NULL )
358
363
{
359
- printfPQExpBuffer (& conn -> errorMessage ,
360
- libpq_gettext ("out of memory\n" ));
364
+ appendPQExpBufferStr (& conn -> errorMessage ,
365
+ libpq_gettext ("out of memory\n" ));
361
366
return NULL ;
362
367
}
363
368
encoded_len = pg_b64_encode (raw_nonce , SCRAM_RAW_NONCE_LEN ,
364
369
state -> client_nonce , encoded_len );
365
370
if (encoded_len < 0 )
366
371
{
367
- printfPQExpBuffer (& conn -> errorMessage ,
368
- libpq_gettext ("could not encode nonce\n" ));
372
+ appendPQExpBufferStr (& conn -> errorMessage ,
373
+ libpq_gettext ("could not encode nonce\n" ));
369
374
return NULL ;
370
375
}
371
376
state -> client_nonce [encoded_len ] = '\0' ;
@@ -431,8 +436,8 @@ build_client_first_message(fe_scram_state *state)
431
436
432
437
oom_error :
433
438
termPQExpBuffer (& buf );
434
- printfPQExpBuffer (& conn -> errorMessage ,
435
- libpq_gettext ("out of memory\n" ));
439
+ appendPQExpBufferStr (& conn -> errorMessage ,
440
+ libpq_gettext ("out of memory\n" ));
436
441
return NULL ;
437
442
}
438
443
@@ -508,8 +513,8 @@ build_client_final_message(fe_scram_state *state)
508
513
free (cbind_data );
509
514
free (cbind_input );
510
515
termPQExpBuffer (& buf );
511
- printfPQExpBuffer (& conn -> errorMessage ,
512
- "could not encode cbind data for channel binding\n" );
516
+ appendPQExpBufferStr (& conn -> errorMessage ,
517
+ "could not encode cbind data for channel binding\n" );
513
518
return NULL ;
514
519
}
515
520
buf .len += encoded_cbind_len ;
@@ -523,8 +528,8 @@ build_client_final_message(fe_scram_state *state)
523
528
* Shouldn't happen.
524
529
*/
525
530
termPQExpBuffer (& buf );
526
- printfPQExpBuffer (& conn -> errorMessage ,
527
- "channel binding not supported by this build\n" );
531
+ appendPQExpBufferStr (& conn -> errorMessage ,
532
+ "channel binding not supported by this build\n" );
528
533
return NULL ;
529
534
#endif /* HAVE_PGTLS_GET_PEER_CERTIFICATE_HASH */
530
535
}
@@ -553,8 +558,8 @@ build_client_final_message(fe_scram_state *state)
553
558
client_proof ))
554
559
{
555
560
termPQExpBuffer (& buf );
556
- printfPQExpBuffer (& conn -> errorMessage ,
557
- libpq_gettext ("could not calculate client proof\n" ));
561
+ appendPQExpBufferStr (& conn -> errorMessage ,
562
+ libpq_gettext ("could not calculate client proof\n" ));
558
563
return NULL ;
559
564
}
560
565
@@ -569,8 +574,8 @@ build_client_final_message(fe_scram_state *state)
569
574
if (encoded_len < 0 )
570
575
{
571
576
termPQExpBuffer (& buf );
572
- printfPQExpBuffer (& conn -> errorMessage ,
573
- libpq_gettext ("could not encode client proof\n" ));
577
+ appendPQExpBufferStr (& conn -> errorMessage ,
578
+ libpq_gettext ("could not encode client proof\n" ));
574
579
return NULL ;
575
580
}
576
581
buf .len += encoded_len ;
@@ -585,8 +590,8 @@ build_client_final_message(fe_scram_state *state)
585
590
586
591
oom_error :
587
592
termPQExpBuffer (& buf );
588
- printfPQExpBuffer (& conn -> errorMessage ,
589
- libpq_gettext ("out of memory\n" ));
593
+ appendPQExpBufferStr (& conn -> errorMessage ,
594
+ libpq_gettext ("out of memory\n" ));
590
595
return NULL ;
591
596
}
592
597
@@ -606,8 +611,8 @@ read_server_first_message(fe_scram_state *state, char *input)
606
611
state -> server_first_message = strdup (input );
607
612
if (state -> server_first_message == NULL )
608
613
{
609
- printfPQExpBuffer (& conn -> errorMessage ,
610
- libpq_gettext ("out of memory\n" ));
614
+ appendPQExpBufferStr (& conn -> errorMessage ,
615
+ libpq_gettext ("out of memory\n" ));
611
616
return false;
612
617
}
613
618
@@ -616,39 +621,39 @@ read_server_first_message(fe_scram_state *state, char *input)
616
621
& conn -> errorMessage );
617
622
if (nonce == NULL )
618
623
{
619
- /* read_attr_value() has generated an error string */
624
+ /* read_attr_value() has appended an error string */
620
625
return false;
621
626
}
622
627
623
628
/* Verify immediately that the server used our part of the nonce */
624
629
if (strlen (nonce ) < strlen (state -> client_nonce ) ||
625
630
memcmp (nonce , state -> client_nonce , strlen (state -> client_nonce )) != 0 )
626
631
{
627
- printfPQExpBuffer (& conn -> errorMessage ,
628
- libpq_gettext ("invalid SCRAM response (nonce mismatch)\n" ));
632
+ appendPQExpBufferStr (& conn -> errorMessage ,
633
+ libpq_gettext ("invalid SCRAM response (nonce mismatch)\n" ));
629
634
return false;
630
635
}
631
636
632
637
state -> nonce = strdup (nonce );
633
638
if (state -> nonce == NULL )
634
639
{
635
- printfPQExpBuffer (& conn -> errorMessage ,
636
- libpq_gettext ("out of memory\n" ));
640
+ appendPQExpBufferStr (& conn -> errorMessage ,
641
+ libpq_gettext ("out of memory\n" ));
637
642
return false;
638
643
}
639
644
640
645
encoded_salt = read_attr_value (& input , 's' , & conn -> errorMessage );
641
646
if (encoded_salt == NULL )
642
647
{
643
- /* read_attr_value() has generated an error string */
648
+ /* read_attr_value() has appended an error string */
644
649
return false;
645
650
}
646
651
decoded_salt_len = pg_b64_dec_len (strlen (encoded_salt ));
647
652
state -> salt = malloc (decoded_salt_len );
648
653
if (state -> salt == NULL )
649
654
{
650
- printfPQExpBuffer (& conn -> errorMessage ,
651
- libpq_gettext ("out of memory\n" ));
655
+ appendPQExpBufferStr (& conn -> errorMessage ,
656
+ libpq_gettext ("out of memory\n" ));
652
657
return false;
653
658
}
654
659
state -> saltlen = pg_b64_decode (encoded_salt ,
@@ -657,28 +662,28 @@ read_server_first_message(fe_scram_state *state, char *input)
657
662
decoded_salt_len );
658
663
if (state -> saltlen < 0 )
659
664
{
660
- printfPQExpBuffer (& conn -> errorMessage ,
661
- libpq_gettext ("malformed SCRAM message (invalid salt)\n" ));
665
+ appendPQExpBufferStr (& conn -> errorMessage ,
666
+ libpq_gettext ("malformed SCRAM message (invalid salt)\n" ));
662
667
return false;
663
668
}
664
669
665
670
iterations_str = read_attr_value (& input , 'i' , & conn -> errorMessage );
666
671
if (iterations_str == NULL )
667
672
{
668
- /* read_attr_value() has generated an error string */
673
+ /* read_attr_value() has appended an error string */
669
674
return false;
670
675
}
671
676
state -> iterations = strtol (iterations_str , & endptr , 10 );
672
677
if (* endptr != '\0' || state -> iterations < 1 )
673
678
{
674
- printfPQExpBuffer (& conn -> errorMessage ,
675
- libpq_gettext ("malformed SCRAM message (invalid iteration count)\n" ));
679
+ appendPQExpBufferStr (& conn -> errorMessage ,
680
+ libpq_gettext ("malformed SCRAM message (invalid iteration count)\n" ));
676
681
return false;
677
682
}
678
683
679
684
if (* input != '\0' )
680
- printfPQExpBuffer (& conn -> errorMessage ,
681
- libpq_gettext ("malformed SCRAM message (garbage at end of server-first-message)\n" ));
685
+ appendPQExpBufferStr (& conn -> errorMessage ,
686
+ libpq_gettext ("malformed SCRAM message (garbage at end of server-first-message)\n" ));
682
687
683
688
return true;
684
689
}
@@ -697,8 +702,8 @@ read_server_final_message(fe_scram_state *state, char *input)
697
702
state -> server_final_message = strdup (input );
698
703
if (!state -> server_final_message )
699
704
{
700
- printfPQExpBuffer (& conn -> errorMessage ,
701
- libpq_gettext ("out of memory\n" ));
705
+ appendPQExpBufferStr (& conn -> errorMessage ,
706
+ libpq_gettext ("out of memory\n" ));
702
707
return false;
703
708
}
704
709
@@ -708,7 +713,12 @@ read_server_final_message(fe_scram_state *state, char *input)
708
713
char * errmsg = read_attr_value (& input , 'e' ,
709
714
& conn -> errorMessage );
710
715
711
- printfPQExpBuffer (& conn -> errorMessage ,
716
+ if (errmsg == NULL )
717
+ {
718
+ /* read_attr_value() has appended an error message */
719
+ return false;
720
+ }
721
+ appendPQExpBuffer (& conn -> errorMessage ,
712
722
libpq_gettext ("error received from server in SCRAM exchange: %s\n" ),
713
723
errmsg );
714
724
return false;
@@ -719,20 +729,20 @@ read_server_final_message(fe_scram_state *state, char *input)
719
729
& conn -> errorMessage );
720
730
if (encoded_server_signature == NULL )
721
731
{
722
- /* read_attr_value() has generated an error message */
732
+ /* read_attr_value() has appended an error message */
723
733
return false;
724
734
}
725
735
726
736
if (* input != '\0' )
727
- printfPQExpBuffer (& conn -> errorMessage ,
728
- libpq_gettext ("malformed SCRAM message (garbage at end of server-final-message)\n" ));
737
+ appendPQExpBufferStr (& conn -> errorMessage ,
738
+ libpq_gettext ("malformed SCRAM message (garbage at end of server-final-message)\n" ));
729
739
730
740
server_signature_len = pg_b64_dec_len (strlen (encoded_server_signature ));
731
741
decoded_server_signature = malloc (server_signature_len );
732
742
if (!decoded_server_signature )
733
743
{
734
- printfPQExpBuffer (& conn -> errorMessage ,
735
- libpq_gettext ("out of memory\n" ));
744
+ appendPQExpBufferStr (& conn -> errorMessage ,
745
+ libpq_gettext ("out of memory\n" ));
736
746
return false;
737
747
}
738
748
@@ -743,8 +753,8 @@ read_server_final_message(fe_scram_state *state, char *input)
743
753
if (server_signature_len != SCRAM_KEY_LEN )
744
754
{
745
755
free (decoded_server_signature );
746
- printfPQExpBuffer (& conn -> errorMessage ,
747
- libpq_gettext ("malformed SCRAM message (invalid server signature)\n" ));
756
+ appendPQExpBufferStr (& conn -> errorMessage ,
757
+ libpq_gettext ("malformed SCRAM message (invalid server signature)\n" ));
748
758
return false;
749
759
}
750
760
memcpy (state -> ServerSignature , decoded_server_signature , SCRAM_KEY_LEN );
0 commit comments