Thread: Call pstrdup() of palloc.h will change source string, please help!
Hello,
I'm working on modifying an postgresql extension called "cstore_fdw". My function is like:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
static bool
ParsePeriod(const char *periodString, Period *result)
{
bool isSuccess = true;
char *dupPeriodForString;
char delimiters[3][2] = { "(", ",", ")" };
char **results[3] = {&(result->periodName), &(result->start_column_name), &(result->end_column_name)};
dupPeriodForString = pstrdup(periodString); // !!!! pstrdup error !!!!
if (dupPeriodForString == NULL || strlen(dupPeriodForString) <= 0 || result == NULL)
{
isSuccess = false;
}
for (int i = 0; i < 3; ++i)
{
char *token = NULL;
Size len = 0;
int j;
if ( (token = strsep(&dupPeriodForString, delimiters[i])) == NULL )
{
isSuccess = false;
break;
}
// trim
len = strlen(token);
while(isspace(token[len - 1])) --len;
while(*token && isspace(*token)) ++token, --len;
token = pnstrdup(token, len);
// lowercase
len = strlen(token);
for (j = 0; j < len; j++)
{
token[j] = tolower(token[j]);
}
*results[i] = token;
}
return isSuccess;
}
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
pstrdup() will change source "system_time( stt , ett )" to "system_time( stt " and return "system_time( stt " when it is called in ValidateForeignTableOptions() and CStoreGetOptions(). But if I call it in somewhere else, it won't get wrong.
Here's my enviornment:
postgresql: psql (PostgreSQL) 12.10 (Ubuntu 12.10-0ubuntu0.20.04.1)
compiler: clang version 10.0.0-4ubuntu1
OS: WINDOWS sub linux GNU/Linux 5.10.102.1-microsoft-standard-WSL2 x86_64
How can I do to fix this problem?
"=?ISO-8859-1?B?bWVuZ2Zhbmp1bg==?=" <meng_fan_jun@foxmail.com> writes: > pstrdup() will change source "system_time( stt , ett )" to "system_time( stt " and return "system_time( stt " whenit is called in ValidateForeignTableOptions() and CStoreGetOptions(). That claim is not very credible. I'm not sure where the bug is in this code, but the chance that it's in pstrdup is frankly zero. According to the man page for strsep(), that function modifies the string pointed to by its first argument. I suspect you're failing to account for that. I'm also suspicious of the "// trim" code, which will misbehave for a zero-length token. regards, tom lane