mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	plperl: Correctly handle empty arrays in plperl_ref_from_pg_array.
plperl_ref_from_pg_array() didn't consider the case that postgrs arrays can have 0 dimensions (when they're empty) and accessed the first dimension without a check. Fix that by special casing the empty array case. Author: Alex Hunsaker Reported-By: Andres Freund / valgrind / buildfarm animal skink Discussion: 20160308063240.usnzg6bsbjrne667@alap3.anarazel.de Backpatch: 9.1-
This commit is contained in:
		@@ -1433,17 +1433,25 @@ plperl_ref_from_pg_array(Datum arg, Oid typid)
 | 
				
			|||||||
	info->ndims = ARR_NDIM(ar);
 | 
						info->ndims = ARR_NDIM(ar);
 | 
				
			||||||
	dims = ARR_DIMS(ar);
 | 
						dims = ARR_DIMS(ar);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	deconstruct_array(ar, elementtype, typlen, typbyval,
 | 
						/* No dimensions? Return an empty array */
 | 
				
			||||||
					  typalign, &info->elements, &info->nulls,
 | 
						if (info->ndims == 0)
 | 
				
			||||||
					  &nitems);
 | 
						{
 | 
				
			||||||
 | 
							av = newRV_noinc((SV *) newAV());
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							deconstruct_array(ar, elementtype, typlen, typbyval,
 | 
				
			||||||
 | 
											  typalign, &info->elements, &info->nulls,
 | 
				
			||||||
 | 
											  &nitems);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Get total number of elements in each dimension */
 | 
							/* Get total number of elements in each dimension */
 | 
				
			||||||
	info->nelems = palloc(sizeof(int) * info->ndims);
 | 
							info->nelems = palloc(sizeof(int) * info->ndims);
 | 
				
			||||||
	info->nelems[0] = nitems;
 | 
							info->nelems[0] = nitems;
 | 
				
			||||||
	for (i = 1; i < info->ndims; i++)
 | 
							for (i = 1; i < info->ndims; i++)
 | 
				
			||||||
		info->nelems[i] = info->nelems[i - 1] / dims[i - 1];
 | 
								info->nelems[i] = info->nelems[i - 1] / dims[i - 1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	av = split_array(info, 0, nitems, 0);
 | 
							av = split_array(info, 0, nitems, 0);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	hv = newHV();
 | 
						hv = newHV();
 | 
				
			||||||
	(void) hv_store(hv, "array", 5, av, 0);
 | 
						(void) hv_store(hv, "array", 5, av, 0);
 | 
				
			||||||
@@ -1462,6 +1470,9 @@ split_array(plperl_array_info *info, int first, int last, int nest)
 | 
				
			|||||||
	int			i;
 | 
						int			i;
 | 
				
			||||||
	AV		   *result;
 | 
						AV		   *result;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* we should only be called when we have something to split */
 | 
				
			||||||
 | 
						Assert(info->ndims > 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* since this function recurses, it could be driven to stack overflow */
 | 
						/* since this function recurses, it could be driven to stack overflow */
 | 
				
			||||||
	check_stack_depth();
 | 
						check_stack_depth();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user