Skip to content

Commit

Permalink
Fix unportable disregard of alignment requirements in RADIUS code.
Browse files Browse the repository at this point in the history
The compiler is entitled to store a char[] local variable with no
particular alignment requirement.  Our RADIUS code cavalierly took such
a local variable and cast its address to a struct type that does have
alignment requirements.  On an alignment-picky machine this would lead
to bus errors.  To fix, declare the local variable honestly, and then
cast its address to char * for use in the I/O calls.

Given the lack of field complaints, there must be very few if any
people affected; but nonetheless this is a clear portability issue,
so back-patch to all supported branches.

Noted while looking at a Coverity complaint in the same code.
  • Loading branch information
tglsfdc committed Mar 26, 2017
1 parent 5674a25 commit c804c00
Showing 1 changed file with 12 additions and 9 deletions.
21 changes: 12 additions & 9 deletions src/backend/libpq/auth.c
Expand Up @@ -2355,14 +2355,16 @@ CheckCertAuth(Port *port)
*/

/*
* RADIUS authentication is described in RFC2865 (and several
* others).
* RADIUS authentication is described in RFC2865 (and several others).
*/

#define RADIUS_VECTOR_LENGTH 16
#define RADIUS_HEADER_LENGTH 20
#define RADIUS_MAX_PASSWORD_LENGTH 128

/* Maximum size of a RADIUS packet we will create or accept */
#define RADIUS_BUFFER_SIZE 1024

typedef struct
{
uint8 attribute;
Expand All @@ -2376,6 +2378,8 @@ typedef struct
uint8 id;
uint16 length;
uint8 vector[RADIUS_VECTOR_LENGTH];
/* this is a bit longer than strictly necessary: */
char pad[RADIUS_BUFFER_SIZE - RADIUS_VECTOR_LENGTH];
} radius_packet;

/* RADIUS packet types */
Expand All @@ -2392,9 +2396,6 @@ typedef struct
/* RADIUS service types */
#define RADIUS_AUTHENTICATE_ONLY 8

/* Maximum size of a RADIUS packet we will create or accept */
#define RADIUS_BUFFER_SIZE 1024

/* Seconds to wait - XXX: should be in a config variable! */
#define RADIUS_TIMEOUT 3

Expand Down Expand Up @@ -2429,10 +2430,12 @@ CheckRADIUSAuth(Port *port)
{
char *passwd;
char *identifier = "postgresql";
char radius_buffer[RADIUS_BUFFER_SIZE];
char receive_buffer[RADIUS_BUFFER_SIZE];
radius_packet *packet = (radius_packet *) radius_buffer;
radius_packet *receivepacket = (radius_packet *) receive_buffer;
radius_packet radius_send_pack;
radius_packet radius_recv_pack;
radius_packet *packet = &radius_send_pack;
radius_packet *receivepacket = &radius_recv_pack;
char *radius_buffer = (char *) &radius_send_pack;
char *receive_buffer = (char *) &radius_recv_pack;
int32 service = htonl(RADIUS_AUTHENTICATE_ONLY);
uint8 *cryptvector;
int encryptedpasswordlen;
Expand Down

0 comments on commit c804c00

Please sign in to comment.