| From: | mengfanjun <meng_fan_jun(at)foxmail(dot)com> | 
|---|---|
| To: | pgsql-general <pgsql-general(at)lists(dot)postgresql(dot)org> | 
| Subject: | Call pstrdup() of palloc.h will change source string, please help! | 
| Date: | 2022-06-04 03:07:56 | 
| Message-ID: | tencent_755B695BF291AADC410AF2D15D2114B36206@qq.com | 
| Views: | Whole Thread | Raw Message | Download mbox | Resend email | 
| Thread: | |
| Lists: | pgsql-general | 
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?
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Bryn Llewellyn | 2022-06-04 04:45:52 | Re: '{"x": 42, "y": null}'::jsonb != '{"x": 42}'::jsonb ... Really? | 
| Previous Message | David G. Johnston | 2022-06-04 02:01:11 | Re: '{"x": 42, "y": null}'::jsonb != '{"x": 42}'::jsonb ... Really? |