mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	xyarray__entry() is missing any bounds checking yet often the x and y
parameters come from external callers. Add bounds checks and an
unchecked __xyarray__entry().
Committer notes:
Make the 'x' and 'y' arguments to the new xyarray__entry() that does
bounds check to be of type 'size_t', so that we cover also the case
where 'x' and 'y' could be negative, which is needed anyway as having
them as 'int' breaks the build with:
  /home/acme/git/perf/tools/lib/perf/include/internal/xyarray.h: In function ‘xyarray__entry’:
  /home/acme/git/perf/tools/lib/perf/include/internal/xyarray.h:28:8: error: comparison of integer expressions of different signedness: ‘int’ and ‘size_t’ {aka ‘long unsigned int’} [-Werror=sign-compare]
     28 |  if (x >= xy->max_x || y >= xy->max_y)
        |        ^~
  /home/acme/git/perf/tools/lib/perf/include/internal/xyarray.h:28:26: error: comparison of integer expressions of different signedness: ‘int’ and ‘size_t’ {aka ‘long unsigned int’} [-Werror=sign-compare]
     28 |  if (x >= xy->max_x || y >= xy->max_y)
        |                          ^~
  cc1: all warnings being treated as errors
Signed-off-by: Rob Herring <robh@kernel.org>
Suggested-by: Arnaldo Carvalho de Melo <acme@kernel.org>
Suggested-by: Namhyung Kim <namhyung@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lore.kernel.org/lkml/20210414195758.4078803-1-robh@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
		
	
			
		
			
				
	
	
		
			43 lines
		
	
	
	
		
			960 B
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			43 lines
		
	
	
	
		
			960 B
		
	
	
	
		
			C
		
	
	
	
	
	
/* SPDX-License-Identifier: GPL-2.0 */
 | 
						|
#ifndef __LIBPERF_INTERNAL_XYARRAY_H
 | 
						|
#define __LIBPERF_INTERNAL_XYARRAY_H
 | 
						|
 | 
						|
#include <linux/compiler.h>
 | 
						|
#include <sys/types.h>
 | 
						|
 | 
						|
struct xyarray {
 | 
						|
	size_t row_size;
 | 
						|
	size_t entry_size;
 | 
						|
	size_t entries;
 | 
						|
	size_t max_x;
 | 
						|
	size_t max_y;
 | 
						|
	char contents[] __aligned(8);
 | 
						|
};
 | 
						|
 | 
						|
struct xyarray *xyarray__new(int xlen, int ylen, size_t entry_size);
 | 
						|
void xyarray__delete(struct xyarray *xy);
 | 
						|
void xyarray__reset(struct xyarray *xy);
 | 
						|
 | 
						|
static inline void *__xyarray__entry(struct xyarray *xy, int x, int y)
 | 
						|
{
 | 
						|
	return &xy->contents[x * xy->row_size + y * xy->entry_size];
 | 
						|
}
 | 
						|
 | 
						|
static inline void *xyarray__entry(struct xyarray *xy, size_t x, size_t y)
 | 
						|
{
 | 
						|
	if (x >= xy->max_x || y >= xy->max_y)
 | 
						|
		return NULL;
 | 
						|
	return __xyarray__entry(xy, x, y);
 | 
						|
}
 | 
						|
 | 
						|
static inline int xyarray__max_y(struct xyarray *xy)
 | 
						|
{
 | 
						|
	return xy->max_y;
 | 
						|
}
 | 
						|
 | 
						|
static inline int xyarray__max_x(struct xyarray *xy)
 | 
						|
{
 | 
						|
	return xy->max_x;
 | 
						|
}
 | 
						|
 | 
						|
#endif /* __LIBPERF_INTERNAL_XYARRAY_H */
 |