When passing query strings to workers, pass the terminating \0.
authorRobert Haas
Wed, 20 Dec 2017 22:21:55 +0000 (17:21 -0500)
committerRobert Haas
Wed, 20 Dec 2017 22:27:25 +0000 (17:27 -0500)
Otherwise, when the query string is read, we might trailing garbage
beyond the end, unless there happens to be a \0 there by good luck.

Report and patch by Thomas Munro. Reviewed by Rafia Sabih.

Discussion: http://postgr.es/m/CAEepm=2SJs7X+_vx8QoDu8d1SMEOxtLhxxLNzZun_BvNkuNhrw@mail.gmail.com

src/backend/executor/execParallel.c

index 609643dcf94d312fbecea32d32480532430d433a..60aaa822b7e2f24e42f78ce22fb4f7fc4f0fd5dc 100644 (file)
@@ -410,7 +410,7 @@ ExecInitParallelPlan(PlanState *planstate, EState *estate, int nworkers)
 
    /* Estimate space for query text. */
    query_len = strlen(estate->es_sourceText);
-   shm_toc_estimate_chunk(&pcxt->estimator, query_len);
+   shm_toc_estimate_chunk(&pcxt->estimator, query_len + 1);
    shm_toc_estimate_keys(&pcxt->estimator, 1);
 
    /* Estimate space for serialized PlannedStmt. */
@@ -478,8 +478,8 @@ ExecInitParallelPlan(PlanState *planstate, EState *estate, int nworkers)
     */
 
    /* Store query string */
-   query_string = shm_toc_allocate(pcxt->toc, query_len);
-   memcpy(query_string, estate->es_sourceText, query_len);
+   query_string = shm_toc_allocate(pcxt->toc, query_len + 1);
+   memcpy(query_string, estate->es_sourceText, query_len + 1);
    shm_toc_insert(pcxt->toc, PARALLEL_KEY_QUERY_TEXT, query_string);
 
    /* Store serialized PlannedStmt. */