procps/proc/xtra-procps-debug.h
Jim Warner bef8c7fb70 library: ensure that all those 'GET' macros are robust
When users call the native 'get' functions they have a
responsibility to check that the result struct address
was indeed returned. But when using those 'GET' macros
there was no protection for possible NULL dereference.

So this patch will add some protection for a potential
failure of an underlying 'get' function. And should it
occur then those 'GET' macros will just return a zero.

Plus, we'll also mirror that behavior in the debugging
header should the XTRA_PROCPS_DEBUG #define be active.
And, we might as well add a warning when invalid items
are passed to 'GET' macros, just like we do for 'VAL'.

[ lastly, we added the missing opening parens/braces ]
[ to 2 'GET' macros in that xtra-procps-debug.h file ]
[ which went unnoticed until the qa folks caught up. ]

Signed-off-by: Jim Warner <james.warner@comcast.net>
2016-08-07 21:43:38 +10:00

205 lines
6.2 KiB
C

/*
* libprocps - Library to read proc filesystem
*
* Copyright (C) 2016 Jim Warner <james.warner@comcast.net>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef XTRA_PROCPS_DEBUG_H
#define XTRA_PROCPS_DEBUG_H
#include <proc/procps-private.h>
// --- DISKSTATS ------------------------------------------
#ifdef DISKSTATS_GET
#undef DISKSTATS_GET
struct diskstats_result *xtra_diskstats_get (
struct diskstats_info *info,
const char *name,
enum diskstats_item actual_enum,
const char *typestr,
const char *file,
int lineno);
#define DISKSTATS_GET( info, name, actual_enum, type ) ( { \
struct diskstats_result *r; \
r = xtra_diskstats_get(info, name, actual_enum , STRINGIFY(type), __FILE__, __LINE__); \
r ? r->result . type : 0; } )
#endif // . . . . . . . . . .
#ifdef DISKSTATS_VAL
#undef DISKSTATS_VAL
void xtra_diskstats_val (
int relative_enum,
const char *typestr,
const struct diskstats_stack *stack,
struct diskstats_info *info,
const char *file,
int lineno);
#define DISKSTATS_VAL( relative_enum, type, stack, info ) ( { \
xtra_diskstats_val(relative_enum, STRINGIFY(type), stack, info, __FILE__, __LINE__); \
stack -> head [ relative_enum ] . result . type; } )
#endif // . . . . . . . . . .
// --- MEMINFO --------------------------------------------
#ifdef MEMINFO_GET
#undef MEMINFO_GET
struct meminfo_result *xtra_meminfo_get (
struct meminfo_info *info,
enum meminfo_item actual_enum,
const char *typestr,
const char *file,
int lineno);
#define MEMINFO_GET( info, actual_enum, type ) ( { \
struct meminfo_result *r; \
r = xtra_meminfo_get(info, actual_enum , STRINGIFY(type), __FILE__, __LINE__); \
r ? r->result . type : 0; } )
#endif // . . . . . . . . . .
#ifdef MEMINFO_VAL
#undef MEMINFO_VAL
void xtra_meminfo_val (
int relative_enum,
const char *typestr,
const struct meminfo_stack *stack,
struct meminfo_info *info,
const char *file,
int lineno);
#define MEMINFO_VAL( relative_enum, type, stack, info ) ( { \
xtra_meminfo_val(relative_enum, STRINGIFY(type), stack, info, __FILE__, __LINE__); \
stack -> head [ relative_enum ] . result . type; } )
#endif // . . . . . . . . . .
// --- PIDS -----------------------------------------------
#ifdef PIDS_VAL
#undef PIDS_VAL
void xtra_pids_val (
int relative_enum,
const char *typestr,
const struct pids_stack *stack,
struct pids_info *info,
const char *file,
int lineno);
#define PIDS_VAL( relative_enum, type, stack, info ) ( { \
xtra_pids_val(relative_enum, STRINGIFY(type), stack, info, __FILE__, __LINE__); \
stack -> head [ relative_enum ] . result . type; } )
#endif // . . . . . . . . . .
// --- SLABINFO -------------------------------------------
#ifdef SLABINFO_GET
#undef SLABINFO_GET
struct slabinfo_result *xtra_slabinfo_get (
struct slabinfo_info *info,
enum slabinfo_item actual_enum,
const char *typestr,
const char *file,
int lineno);
#define SLABINFO_GET( info, actual_enum, type ) ( { \
struct slabinfo_result *r; \
r = xtra_slabinfo_get(info, actual_enum , STRINGIFY(type), __FILE__, __LINE__); \
r ? r->result . type : 0; } )
#endif // . . . . . . . . . .
#ifdef SLABINFO_VAL
#undef SLABINFO_VAL
void xtra_slabinfo_val (
int relative_enum,
const char *typestr,
const struct slabinfo_stack *stack,
struct slabinfo_info *info,
const char *file,
int lineno);
#define SLABINFO_VAL( relative_enum, type, stack, info ) ( { \
xtra_slabinfo_val(relative_enum, STRINGIFY(type), stack, info, __FILE__, __LINE__); \
stack -> head [ relative_enum ] . result . type; } )
#endif // . . . . . . . . . .
// --- STAT -----------------------------------------------
#ifdef STAT_GET
#undef STAT_GET
struct stat_result *xtra_stat_get (
struct stat_info *info,
enum stat_item actual_enum,
const char *typestr,
const char *file,
int lineno);
#define STAT_GET( info, actual_enum, type ) ( { \
struct stat_result *r; \
r = xtra_stat_get(info, actual_enum , STRINGIFY(type), __FILE__, __LINE__); \
r ? r->result . type : 0; } )
#endif // . . . . . . . . . .
#ifdef STAT_VAL
#undef STAT_VAL
void xtra_stat_val (
int relative_enum,
const char *typestr,
const struct stat_stack *stack,
struct stat_info *info,
const char *file,
int lineno);
#define STAT_VAL( relative_enum, type, stack, info ) ( { \
xtra_stat_val(relative_enum, STRINGIFY(type), stack, info, __FILE__, __LINE__); \
stack -> head [ relative_enum ] . result . type; } )
#endif // . . . . . . . . . .
// --- VMSTAT ---------------------------------------------
#ifdef VMSTAT_GET
#undef VMSTAT_GET
struct vmstat_result *xtra_vmstat_get (
struct vmstat_info *info,
enum vmstat_item actual_enum,
const char *typestr,
const char *file,
int lineno);
#define VMSTAT_GET( info, actual_enum, type ) ( { \
struct vmstat_result *r; \
r = xtra_vmstat_get(info, actual_enum , STRINGIFY(type), __FILE__, __LINE__); \
r ? r->result . type : 0; } )
#endif // . . . . . . . . . .
#ifdef VMSTAT_VAL
#undef VMSTAT_VAL
void xtra_vmstat_val (
int relative_enum,
const char *typestr,
const struct vmstat_stack *stack,
struct vmstat_info *info,
const char *file,
int lineno);
#define VMSTAT_VAL( relative_enum, type, stack, info ) ( { \
xtra_vmstat_val(relative_enum, STRINGIFY(type), stack, info, __FILE__, __LINE__); \
stack -> head [ relative_enum ] . result . type; } )
#endif // . . . . . . . . . .
#endif // end: XTRA_PROCPS_DEBUG_H