Fix possible buffer overrun and/or unportable behavior in pg_md5_encrypt()
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 15 Sep 2009 02:31:15 +0000 (02:31 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 15 Sep 2009 02:31:15 +0000 (02:31 +0000)
if salt_len == 0.  This seems to be mostly academic, since nearly all calling
code paths guarantee nonempty salt; the only case that doesn't is
PQencryptPassword where the caller could mistakenly pass an empty username.
So, fix it but don't bother backpatching.  Per ljb.

src/backend/libpq/md5.c

index 91cfe187ee947e012c5b9248c26a91c7e8ab7c2c..5edee64026e42aec01a307036e429d163a31e782 100644 (file)
@@ -14,7 +14,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/libpq/md5.c,v 1.36 2009/01/01 17:23:42 momjian Exp $
+ *   $PostgreSQL: pgsql/src/backend/libpq/md5.c,v 1.37 2009/09/15 02:31:15 tgl Exp $
  */
 
 /* This is intended to be used in both frontend and backend, so use c.h */
@@ -314,7 +314,8 @@ pg_md5_encrypt(const char *passwd, const char *salt, size_t salt_len,
               char *buf)
 {
    size_t      passwd_len = strlen(passwd);
-   char       *crypt_buf = malloc(passwd_len + salt_len);
+   /* +1 here is just to avoid risk of unportable malloc(0) */
+   char       *crypt_buf = malloc(passwd_len + salt_len + 1);
    bool        ret;
 
    if (!crypt_buf)
@@ -324,7 +325,7 @@ pg_md5_encrypt(const char *passwd, const char *salt, size_t salt_len,
     * Place salt at the end because it may be known by users trying to crack
     * the MD5 output.
     */
-   strcpy(crypt_buf, passwd);
+   memcpy(crypt_buf, passwd, passwd_len);
    memcpy(crypt_buf + passwd_len, salt, salt_len);
 
    strcpy(buf, "md5");