[Pgpool-general] pgpool2.1b2 segfaulting

Yoshiyuki Asaba y-asaba at sraoss.co.jp
Fri May 16 15:21:30 UTC 2008


Hi,

From: Nico -telmich- Schottelius <nico-pgpool at schottelius.org>
Subject: Re: [Pgpool-general] pgpool2.1b2 segfaulting
Date: Fri, 16 May 2008 15:14:21 +0200

> GDB infos:

Thanks!

Could you apply the attached patch?

Regards,

--
Yoshiyuki Asaba
y-asaba at sraoss.co.jp
-------------- next part --------------
Index: pool_process_query.c
===================================================================
RCS file: /cvsroot/pgpool/pgpool-II/pool_process_query.c,v
retrieving revision 1.107
diff -c -r1.107 pool_process_query.c
*** pool_process_query.c	3 Apr 2008 13:10:34 -0000	1.107
--- pool_process_query.c	16 May 2008 15:18:58 -0000
***************
*** 2205,2211 ****
  	int i, j;
  	unsigned char mask;
  	int size, size1 = 0;
! 	char *buf = NULL;
  	char msgbuf[1024];
  
  	pool_write(frontend, "D", 1);
--- 2205,2211 ----
  	int i, j;
  	unsigned char mask;
  	int size, size1 = 0;
! 	char *buf = NULL, *sendbuf = NULL;
  	char msgbuf[1024];
  
  	pool_write(frontend, "D", 1);
***************
*** 2251,2259 ****
  			/* field size */
  			if (pool_read(MASTER(backend), &size, sizeof(int)) < 0)
  				return POOL_END;
  			/* forward to frontend */
  			pool_write(frontend, &size, sizeof(int));
! 			size1 = size;
  			for (j=0;j<NUM_BACKENDS;j++)
  			{
  				if (VALID_BACKEND(j) && !IS_MASTER_NODE_ID(j))
--- 2251,2273 ----
  			/* field size */
  			if (pool_read(MASTER(backend), &size, sizeof(int)) < 0)
  				return POOL_END;
+ 
+ 			size1 = ntohl(size) - 4;
+ 
+ 			/* read and send actual data only when size > 0 */
+ 			if (size1 > 0)
+ 			{
+ 				sendbuf = pool_read2(MASTER(backend), size1);
+ 				if (sendbuf == NULL)
+ 					return POOL_END;
+ 			}
+ 
  			/* forward to frontend */
  			pool_write(frontend, &size, sizeof(int));
! 			pool_write(frontend, sendbuf, size1);
! 			snprintf(msgbuf, Min(sizeof(msgbuf), size1+1), "%s", sendbuf);
! 			pool_debug("AsciiRow: len: %d data: %s", size1, msgbuf);
! 
  			for (j=0;j<NUM_BACKENDS;j++)
  			{
  				if (VALID_BACKEND(j) && !IS_MASTER_NODE_ID(j))
***************
*** 2261,2291 ****
  					/* field size */
  					if (pool_read(CONNECTION(backend, j), &size, sizeof(int)) < 0)
  						return POOL_END;
- 				}
- 				/* XXX: field size maybe different among
- 				   backends. If we were a paranoid, we have to treat
- 				   this as a fatal error. However in the real world
- 				   we'd better to adapt this situation. Just throw a
- 				   log... */
- 				if (size != size1)
- 					pool_debug("AsciiRow: %d th field size does not match between master(%d) and %d th backend(%d)",
- 							   i, ntohl(size), j, ntohl(size1));
  
! 				buf = NULL;
! 				size = ntohl(size) - 4;
  
! 				/* read and send actual data only when size > 0 */
! 				if (size > 0)
! 				{
! 					buf = pool_read2(CONNECTION(backend, j), size);
! 					if (buf == NULL)
! 						return POOL_END;
  
! 					if (IS_MASTER_NODE_ID(j))
  					{
! 						pool_write(frontend, buf, size);
! 						snprintf(msgbuf, Min(sizeof(msgbuf), size+1), "%s", buf);
! 						pool_debug("AsciiRow: len: %d data: %s", size, msgbuf);
  					}
  				}
  			}
--- 2275,2299 ----
  					/* field size */
  					if (pool_read(CONNECTION(backend, j), &size, sizeof(int)) < 0)
  						return POOL_END;
  
! 					buf = NULL;
! 					size = ntohl(size) - 4;
  
! 					/* XXX: field size maybe different among
! 					   backends. If we were a paranoid, we have to treat
! 					   this as a fatal error. However in the real world
! 					   we'd better to adapt this situation. Just throw a
! 					   log... */
! 					if (size != size1)
! 						pool_debug("AsciiRow: %d th field size does not match between master(%d) and %d th backend(%d)",
! 								   i, ntohl(size), j, ntohl(size1));
  
! 					/* read and send actual data only when size > 0 */
! 					if (size > 0)
  					{
! 						buf = pool_read2(CONNECTION(backend, j), size);
! 						if (buf == NULL)
! 							return POOL_END;
  					}
  				}
  			}


More information about the Pgpool-general mailing list