Tom Lane wrote:
Since both allocations are only transient within this routine, there's a simpler more effective solution, which is to only do one malloc in the first place
Yeah, true. Attached is a revised patch -- committed to HEAD. -Neil
Index: src/interfaces/libpq/fe-auth.c =================================================================== RCS file: /var/lib/cvs/pgsql/src/interfaces/libpq/fe-auth.c,v retrieving revision 1.102 diff -c -r1.102 fe-auth.c *** src/interfaces/libpq/fe-auth.c 27 Jun 2005 02:04:26 -0000 1.102 --- src/interfaces/libpq/fe-auth.c 30 Jun 2005 01:55:35 -0000 *************** *** 407,433 **** { char *crypt_pwd2; ! if (!(crypt_pwd = malloc(MD5_PASSWD_LEN + 1)) || ! !(crypt_pwd2 = malloc(MD5_PASSWD_LEN + 1))) { fprintf(stderr, libpq_gettext("out of memory\n")); return STATUS_ERROR; } if (!EncryptMD5(password, conn->pguser, strlen(conn->pguser), crypt_pwd2)) { free(crypt_pwd); - free(crypt_pwd2); return STATUS_ERROR; } if (!EncryptMD5(crypt_pwd2 + strlen("md5"), conn->md5Salt, sizeof(conn->md5Salt), crypt_pwd)) { free(crypt_pwd); - free(crypt_pwd2); return STATUS_ERROR; } - free(crypt_pwd2); break; } case AUTH_REQ_CRYPT: --- 407,433 ---- { char *crypt_pwd2; ! /* Allocate enough space for two MD5 hashes */ ! crypt_pwd = malloc(2 * (MD5_PASSWD_LEN + 1)); ! if (!crypt_pwd) { fprintf(stderr, libpq_gettext("out of memory\n")); return STATUS_ERROR; } + + crypt_pwd2 = crypt_pwd + MD5_PASSWD_LEN + 1; if (!EncryptMD5(password, conn->pguser, strlen(conn->pguser), crypt_pwd2)) { free(crypt_pwd); return STATUS_ERROR; } if (!EncryptMD5(crypt_pwd2 + strlen("md5"), conn->md5Salt, sizeof(conn->md5Salt), crypt_pwd)) { free(crypt_pwd); return STATUS_ERROR; } break; } case AUTH_REQ_CRYPT:
---------------------------(end of broadcast)--------------------------- TIP 2: you can get off all lists at once with the unregister command (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])