Re: Segmentation fault while COPY in 7.3

Tom Lane <tgl@sss.pgh.pa.us>

From: Tom Lane <tgl@sss.pgh.pa.us>
To: "Nicolai Tufar" <ntufar@apb.com.tr>
Cc: "Joe Conway" <mail@joeconway.com>, pgsql-general@postgresql.org, pgsql-hackers@postgresql.org
Date: 2002-12-01T17:38:06Z
Lists: pgsql-hackers, pgsql-general
"Nicolai Tufar" <ntufar@apb.com.tr> writes:
> From: "Tom Lane" <tgl@sss.pgh.pa.us>
>> Ohhh ...
>> 
>> Nicolai, are you running with a client encoding different from server
>> encoding?

> Got it!

Okay, the problem is a double free of memory in COPY OUT.  I've applied
the following patch for 7.3.1.  (A better fix would be for COPY OUT to
run in a local memory context that it could reset every so often, like
once per row, and then we could remove these risky retail pfree's entirely.
I plan to do that instead in development sources.)

			regards, tom lane

*** src/backend/commands/copy.c.orig	Fri Oct 18 20:25:36 2002
--- src/backend/commands/copy.c	Sun Dec  1 12:28:24 2002
***************
*** 1470,1478 ****
  	char	   *string;
  	char		c;
  	char		delimc = delim[0];
- 
  	bool		same_encoding;
! 	char	   *string_start;
  	int			mblen;
  	int			i;
  
--- 1470,1477 ----
  	char	   *string;
  	char		c;
  	char		delimc = delim[0];
  	bool		same_encoding;
! 	char	   *string_start = NULL;
  	int			mblen;
  	int			i;
  
***************
*** 1481,1492 ****
  	{
  		string = (char *) pg_server_to_client((unsigned char *) server_string,
  											  strlen(server_string));
! 		string_start = string;
  	}
  	else
  	{
  		string = server_string;
- 		string_start = NULL;
  	}
  
  	for (; (c = *string) != '\0'; string += mblen)
--- 1480,1491 ----
  	{
  		string = (char *) pg_server_to_client((unsigned char *) server_string,
  											  strlen(server_string));
! 		if (string != server_string)
! 			string_start = string;
  	}
  	else
  	{
  		string = server_string;
  	}
  
  	for (; (c = *string) != '\0'; string += mblen)