mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Make object address handling more robust
pg_identify_object_as_address crashes when passed certain tuples from inconsistent system catalogs. Make it more defensive. Author: Álvaro Herrera Reviewed-by: Michaël Paquier Discussion: https://postgr.es/m/20190218202743.GA12392@alvherre.pgsql
This commit is contained in:
		@@ -3576,7 +3576,10 @@ pg_identify_object_as_address(PG_FUNCTION_ARGS)
 | 
				
			|||||||
	pfree(identity);
 | 
						pfree(identity);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* object_names */
 | 
						/* object_names */
 | 
				
			||||||
	values[1] = PointerGetDatum(strlist_to_textarray(names));
 | 
						if (names != NIL)
 | 
				
			||||||
 | 
							values[1] = PointerGetDatum(strlist_to_textarray(names));
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							values[1] = PointerGetDatum(construct_empty_array(TEXTOID));
 | 
				
			||||||
	nulls[1] = false;
 | 
						nulls[1] = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* object_args */
 | 
						/* object_args */
 | 
				
			||||||
@@ -4803,10 +4806,12 @@ strlist_to_textarray(List *list)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	ArrayType  *arr;
 | 
						ArrayType  *arr;
 | 
				
			||||||
	Datum	   *datums;
 | 
						Datum	   *datums;
 | 
				
			||||||
 | 
						bool	   *nulls;
 | 
				
			||||||
	int			j = 0;
 | 
						int			j = 0;
 | 
				
			||||||
	ListCell   *cell;
 | 
						ListCell   *cell;
 | 
				
			||||||
	MemoryContext memcxt;
 | 
						MemoryContext memcxt;
 | 
				
			||||||
	MemoryContext oldcxt;
 | 
						MemoryContext oldcxt;
 | 
				
			||||||
 | 
						int			lb[1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	memcxt = AllocSetContextCreate(CurrentMemoryContext,
 | 
						memcxt = AllocSetContextCreate(CurrentMemoryContext,
 | 
				
			||||||
								   "strlist to array",
 | 
													   "strlist to array",
 | 
				
			||||||
@@ -4814,17 +4819,25 @@ strlist_to_textarray(List *list)
 | 
				
			|||||||
	oldcxt = MemoryContextSwitchTo(memcxt);
 | 
						oldcxt = MemoryContextSwitchTo(memcxt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	datums = palloc(sizeof(text *) * list_length(list));
 | 
						datums = palloc(sizeof(text *) * list_length(list));
 | 
				
			||||||
 | 
						nulls = palloc(sizeof(bool) * list_length(list));
 | 
				
			||||||
	foreach(cell, list)
 | 
						foreach(cell, list)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		char	   *name = lfirst(cell);
 | 
							char	   *name = lfirst(cell);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		datums[j++] = CStringGetTextDatum(name);
 | 
							if (name)
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								nulls[j] = false;
 | 
				
			||||||
 | 
								datums[j++] = CStringGetTextDatum(name);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								nulls[j++] = true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	MemoryContextSwitchTo(oldcxt);
 | 
						MemoryContextSwitchTo(oldcxt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	arr = construct_array(datums, list_length(list),
 | 
						lb[0] = 1;
 | 
				
			||||||
						  TEXTOID, -1, false, 'i');
 | 
						arr = construct_md_array(datums, nulls, 1, &j,
 | 
				
			||||||
 | 
												 lb, TEXTOID, -1, false, 'i');
 | 
				
			||||||
	MemoryContextDelete(memcxt);
 | 
						MemoryContextDelete(memcxt);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return arr;
 | 
						return arr;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user