Package: libpam-pgsql
Version: 0.7.3.1-4
Severity: normal
Tags: upstream patch
Dear Maintainer,
I tried to use libpam-pgsql to authenticate against the users created in a
PostgreSQL installation. My pam_pgsql.conf file looks like this:
database = postgres
table = pg_catalog.pg_shadow
user = postgres
password = passwordforpostgres
user_column = usename
pwd_column = passwd
pw_type = md5_postgres
Unfortunately this does not work because the password_encrypt function in
backend_pgsql.c does not create the correct password hashes for the password
type md5_postgres. The attached patch solved the problem for me.
-- System Information:
Debian Release: 7.6
APT prefers stable-updates
APT policy: (500, 'stable-updates'), (500, 'stable')
Architecture: amd64 (x86_64)
Kernel: Linux 3.14-0.bpo.2-amd64 (SMP w/2 CPU cores)
Locale: LANG=de_DE.UTF-8, LC_CTYPE=de_DE.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Versions of packages libpam-pgsql depends on:
ii libc6 2.13-38+deb7u3
ii libgcrypt11 1.5.0-5+deb7u1
ii libpam0g 1.1.3-7.1
ii libpq5 9.3.5-1.pgdg70+1
libpam-pgsql recommends no packages.
libpam-pgsql suggests no packages.
Index: backend_pgsql.c
===================================================================
--- backend_pgsql.c (revision 2)
+++ backend_pgsql.c (revision 3)
@@ -302,7 +302,8 @@
*/
unsigned char hash[16] = { 0, }; /* 16 is the md5 block size */
int i;
- s = (char *) malloc(33); /* 32 bytes + 1 byte for \0 */
+ s = (char *) malloc(36); /* 3 bytes for "md5" + 32 bytes for the hash + 1 byte for \0 */
+ strncpy(s, "md5", 3);
size_t unencoded_length;
char *unencoded;
@@ -313,7 +314,7 @@
gcry_md_hash_buffer(GCRY_MD_MD5, hash, unencoded, strlen(unencoded));
for(i = 0; i < sizeof(hash); i++)
- sprintf(&s[i * 2], "%.2x", hash[i]);
+ sprintf(&s[(i * 2) + 3], "%.2x", hash[i]);
free(unencoded);