mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 10:30:33 +03:00 
			
		
		
		
	In hstore_plpython, avoid crashing when return value isn't a mapping.
Python 3 changed the behavior of PyMapping_Check(), breaking the test in plpython_to_hstore() that verifies whether a function result to be transformed is acceptable. A backwards-compatible fix is to first verify that the object doesn't pass PySequence_Check(). Perhaps accidentally, our other uses of PyMapping_Check() already follow uses of PySequence_Check(), so that no other bugs were created by this change. Per bug #17908 from Alexander Lakhin. Back-patch to all supported branches. Dmitry Dolgov and Tom Lane Discussion: https://postgr.es/m/17908-3f19a125d56a11d6@postgresql.org
This commit is contained in:
		| @@ -129,7 +129,13 @@ plpython_to_hstore(PG_FUNCTION_ARGS) | ||||
| 	HStore	   *volatile out; | ||||
|  | ||||
| 	dict = (PyObject *) PG_GETARG_POINTER(0); | ||||
| 	if (!PyMapping_Check(dict)) | ||||
|  | ||||
| 	/* | ||||
| 	 * As of Python 3, PyMapping_Check() is unreliable unless one first checks | ||||
| 	 * that the object isn't a sequence.  (Cleaner solutions exist, but not | ||||
| 	 * before Python 3.10, which we're not prepared to require yet.) | ||||
| 	 */ | ||||
| 	if (PySequence_Check(dict) || !PyMapping_Check(dict)) | ||||
| 		ereport(ERROR, | ||||
| 				(errcode(ERRCODE_WRONG_OBJECT_TYPE), | ||||
| 				 errmsg("not a Python mapping"))); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user