mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Fix volatile vs. pointer confusion
Variables used after a longjmp() need to be declared volatile.  In
case of a pointer, it's the pointer itself that needs to be declared
volatile, not the pointed-to value.  So we need
    PyObject *volatile items;
instead of
    volatile PyObject *items;  /* wrong */
Discussion: https://www.postgresql.org/message-id/flat/f747368d-9e1a-c46a-ac76-3c27da32e8e4%402ndquadrant.com
			
			
This commit is contained in:
		@@ -124,7 +124,7 @@ Datum
 | 
				
			|||||||
plpython_to_hstore(PG_FUNCTION_ARGS)
 | 
					plpython_to_hstore(PG_FUNCTION_ARGS)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	PyObject   *dict;
 | 
						PyObject   *dict;
 | 
				
			||||||
	volatile PyObject *items_v = NULL;
 | 
						PyObject *volatile items = NULL;
 | 
				
			||||||
	int32		pcount;
 | 
						int32		pcount;
 | 
				
			||||||
	HStore	   *out;
 | 
						HStore	   *out;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -135,14 +135,13 @@ plpython_to_hstore(PG_FUNCTION_ARGS)
 | 
				
			|||||||
				 errmsg("not a Python mapping")));
 | 
									 errmsg("not a Python mapping")));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	pcount = PyMapping_Size(dict);
 | 
						pcount = PyMapping_Size(dict);
 | 
				
			||||||
	items_v = PyMapping_Items(dict);
 | 
						items = PyMapping_Items(dict);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	PG_TRY();
 | 
						PG_TRY();
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		int32		buflen;
 | 
							int32		buflen;
 | 
				
			||||||
		int32		i;
 | 
							int32		i;
 | 
				
			||||||
		Pairs	   *pairs;
 | 
							Pairs	   *pairs;
 | 
				
			||||||
		PyObject   *items = (PyObject *) items_v;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
		pairs = palloc(pcount * sizeof(*pairs));
 | 
							pairs = palloc(pcount * sizeof(*pairs));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -173,14 +172,14 @@ plpython_to_hstore(PG_FUNCTION_ARGS)
 | 
				
			|||||||
				pairs[i].isnull = false;
 | 
									pairs[i].isnull = false;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		Py_DECREF(items_v);
 | 
							Py_DECREF(items);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		pcount = hstoreUniquePairs(pairs, pcount, &buflen);
 | 
							pcount = hstoreUniquePairs(pairs, pcount, &buflen);
 | 
				
			||||||
		out = hstorePairs(pairs, pcount, buflen);
 | 
							out = hstorePairs(pairs, pcount, buflen);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	PG_CATCH();
 | 
						PG_CATCH();
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		Py_DECREF(items_v);
 | 
							Py_DECREF(items);
 | 
				
			||||||
		PG_RE_THROW();
 | 
							PG_RE_THROW();
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	PG_END_TRY();
 | 
						PG_END_TRY();
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user