Oops.  Yep, that is sloppy programming on our part, perhaps my part if I
added those.  Anyway, patch attached and applied. I used the proper
struct sizes instead of BUFSIZ.

This will be in 8.0.  I think it is too risky for 7.4.X but if others
disagree, let me know.

---------------------------------------------------------------------------

PostgreSQL Bugs List wrote:
> 
> The following bug has been logged online:
> 
> Bug reference:      1270
> Logged by:          Peter Davie
> 
> Email address:      [EMAIL PROTECTED]
> 
> PostgreSQL version: 7.4.5
> 
> Operating system:   OSF/1 4.0f
> 
> Description:        stack overflow in thread in fe_getauthname
> 
> Details: 
> 
> With the THREAD_SAFETY changes, a buffer is defined on the stack as:
> char       pwdbuf[BUFSIZ];
> 
> This buffer overflows the stack when used in a thread.  As the application 
> creating the thread cannot be modified to increase the stack size, it would 
> probably be prudent to reduce this buffer size (I believe that BUFSIZ is 
> around 8192 bytes on most modern Unix implementations). 
> 
> To rectify this issue (seg faults attempting to connect to the database), I 
> replaced the above declaration with: 
> char       pwdbuf[1024];
> Obviously, a manifest constant would be better!
> 
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster
> 

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  [EMAIL PROTECTED]               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
Index: src/interfaces/libpq/fe-auth.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/interfaces/libpq/fe-auth.c,v
retrieving revision 1.91
diff -c -c -r1.91 fe-auth.c
*** src/interfaces/libpq/fe-auth.c      29 Aug 2004 04:13:12 -0000      1.91
--- src/interfaces/libpq/fe-auth.c      27 Sep 2004 23:34:55 -0000
***************
*** 749,755 ****
                if (GetUserName(username, &namesize))
                        name = username;
  #else
!               char            pwdbuf[BUFSIZ];
                struct passwd pwdstr;
                struct passwd *pw = NULL;
  
--- 749,755 ----
                if (GetUserName(username, &namesize))
                        name = username;
  #else
!               char            pwdbuf[sizeof(struct passwd)];
                struct passwd pwdstr;
                struct passwd *pw = NULL;
  
Index: src/interfaces/libpq/fe-secure.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/interfaces/libpq/fe-secure.c,v
retrieving revision 1.52
diff -c -c -r1.52 fe-secure.c
*** src/interfaces/libpq/fe-secure.c    26 Sep 2004 22:51:49 -0000      1.52
--- src/interfaces/libpq/fe-secure.c    27 Sep 2004 23:34:56 -0000
***************
*** 512,518 ****
  
        {
                struct hostent hpstr;
!               char            buf[BUFSIZ];
                int                     herrno = 0;
  
                /*
--- 512,518 ----
  
        {
                struct hostent hpstr;
!               char            buf[sizeof(struct hostent)];
                int                     herrno = 0;
  
                /*
***************
*** 598,604 ****
  #ifdef WIN32
        return NULL;
  #else
!       char            pwdbuf[BUFSIZ];
        struct passwd pwdstr;
        struct passwd *pwd = NULL;
        FILE       *fp;
--- 598,604 ----
  #ifdef WIN32
        return NULL;
  #else
!       char            pwdbuf[sizeof(struct passwd)];
        struct passwd pwdstr;
        struct passwd *pwd = NULL;
        FILE       *fp;
***************
*** 745,751 ****
  #ifdef WIN32
        return 0;
  #else
!       char            pwdbuf[BUFSIZ];
        struct passwd pwdstr;
        struct passwd *pwd = NULL;
        struct stat buf,
--- 745,751 ----
  #ifdef WIN32
        return 0;
  #else
!       char            pwdbuf[sizeof(struct passwd)];
        struct passwd pwdstr;
        struct passwd *pwd = NULL;
        struct stat buf,
***************
*** 952,958 ****
  {
  #ifndef WIN32
        struct stat buf;
!       char            pwdbuf[BUFSIZ];
        struct passwd pwdstr;
        struct passwd *pwd = NULL;
        char            fnbuf[MAXPGPATH];
--- 952,958 ----
  {
  #ifndef WIN32
        struct stat buf;
!       char            pwdbuf[sizeof(struct passwd)];
        struct passwd pwdstr;
        struct passwd *pwd = NULL;
        char            fnbuf[MAXPGPATH];
Index: src/port/getaddrinfo.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/port/getaddrinfo.c,v
retrieving revision 1.13
diff -c -c -r1.13 getaddrinfo.c
*** src/port/getaddrinfo.c      27 Sep 2004 23:24:45 -0000      1.13
--- src/port/getaddrinfo.c      27 Sep 2004 23:34:57 -0000
***************
*** 85,91 ****
  
  #ifdef FRONTEND
                        struct hostent hpstr;
!                       char            buf[BUFSIZ];
                        int                     herrno = 0;
  
                        pqGethostbyname(node, &hpstr, buf, sizeof(buf),
--- 85,91 ----
  
  #ifdef FRONTEND
                        struct hostent hpstr;
!                       char            buf[sizeof(struct hostent)];
                        int                     herrno = 0;
  
                        pqGethostbyname(node, &hpstr, buf, sizeof(buf),
Index: src/port/thread.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/port/thread.c,v
retrieving revision 1.26
diff -c -c -r1.26 thread.c
*** src/port/thread.c   27 Sep 2004 23:24:45 -0000      1.26
--- src/port/thread.c   27 Sep 2004 23:34:58 -0000
***************
*** 103,109 ****
        /* POSIX version */
        getpwuid_r(uid, resultbuf, buffer, buflen, result);
  #else
- 
        /*
         * Early POSIX draft of getpwuid_r() returns 'struct passwd *'.
         * getpwuid_r(uid, resultbuf, buffer, buflen)
--- 103,108 ----
***************
*** 111,117 ****
        *result = getpwuid_r(uid, resultbuf, buffer, buflen);
  #endif
  #else
- 
        /* no getpwuid_r() available, just use getpwuid() */
        *result = getpwuid(uid);
  #endif
--- 110,115 ----
---------------------------(end of broadcast)---------------------------
TIP 8: explain analyze is your friend

Reply via email to