library: fix boo-boo left by earlier patch, <PIDS> api
After the commit referenced below the potential exists for a SEGV (resulting from an out-of-bounds Item_table reference if PROCPS_PIDS_physical_end is encountered). So this patch eliminates that PROCPS_PIDS_physical_end as no longer necessary and completes the task of using PROCPS_PIDS_logical_end as a sole necessary fencepost. Reference(s): commit e7585992d9c0743246247b3d6ee0041942fe07d5
This commit is contained in:
parent
8c38a58d94
commit
b778a267fe
24
proc/pids.c
24
proc/pids.c
@ -52,9 +52,8 @@
|
|||||||
|
|
||||||
#define READS_BEGUN (info->read) // a read is in progress
|
#define READS_BEGUN (info->read) // a read is in progress
|
||||||
|
|
||||||
// next 2 MUST be kept in sync with highest value enum
|
// next MUST be kept in sync with highest value enum
|
||||||
enum pids_item PROCPS_PIDS_logical_end = PROCPS_PIDS_WCHAN_NAME + 1;
|
enum pids_item PROCPS_PIDS_logical_end = PROCPS_PIDS_WCHAN_NAME + 1;
|
||||||
enum pids_item PROCPS_PIDS_physical_end = PROCPS_PIDS_WCHAN_NAME + 2;
|
|
||||||
|
|
||||||
// these represent the proc_t fields whose storage cannot be managed
|
// these represent the proc_t fields whose storage cannot be managed
|
||||||
// optimally if they are ever referenced more than once in any stack
|
// optimally if they are ever referenced more than once in any stack
|
||||||
@ -67,7 +66,7 @@ enum rel_ref {
|
|||||||
|
|
||||||
struct stacks_extent {
|
struct stacks_extent {
|
||||||
struct pids_stack **stacks;
|
struct pids_stack **stacks;
|
||||||
int ext_numitems; // includes 'physical_end' delimiter
|
int ext_numitems; // includes 'logical_end' delimiter
|
||||||
int ext_numstacks;
|
int ext_numstacks;
|
||||||
struct stacks_extent *next;
|
struct stacks_extent *next;
|
||||||
};
|
};
|
||||||
@ -82,9 +81,9 @@ struct fetch_support {
|
|||||||
|
|
||||||
struct procps_pidsinfo {
|
struct procps_pidsinfo {
|
||||||
int refcount;
|
int refcount;
|
||||||
int maxitems; // includes 'physical_end' delimiter
|
int maxitems; // includes 'logical_end' delimiter
|
||||||
int curitems; // includes 'logical_end' delimiter
|
int curitems; // includes 'logical_end' delimiter
|
||||||
enum pids_item *items; // includes 'phy/log_end' delimiters
|
enum pids_item *items; // includes 'logical_end' delimiter
|
||||||
struct stacks_extent *extents; // anchor for all resettable extents
|
struct stacks_extent *extents; // anchor for all resettable extents
|
||||||
struct stacks_extent *otherexts; // anchor for single stack invariant extents
|
struct stacks_extent *otherexts; // anchor for single stack invariant extents
|
||||||
struct fetch_support reap; // support for procps_pids_reap
|
struct fetch_support reap; // support for procps_pids_reap
|
||||||
@ -509,7 +508,7 @@ static struct {
|
|||||||
{ RS(VSIZE_PGS), f_stat, NULL, QS(ul_int), 0, -1 },
|
{ RS(VSIZE_PGS), f_stat, NULL, QS(ul_int), 0, -1 },
|
||||||
{ RS(WCHAN_ADDR), f_stat, NULL, QS(ul_int), 0, -1 },
|
{ RS(WCHAN_ADDR), f_stat, NULL, QS(ul_int), 0, -1 },
|
||||||
{ RS(WCHAN_NAME), 0, FF(str), QS(str), 0, -1 }, // oldflags: tid already free
|
{ RS(WCHAN_NAME), 0, FF(str), QS(str), 0, -1 }, // oldflags: tid already free
|
||||||
// dummy entry never referenced ( makes future additions 'comma' worry free )...
|
// dummy entry corresponding to PROCPS_PIDS_logical_end ...
|
||||||
{ NULL, 0, NULL, NULL, 0, -1 }
|
{ NULL, 0, NULL, NULL, 0, -1 }
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -933,14 +932,17 @@ static inline int items_check_failed (
|
|||||||
static inline void libflags_set (
|
static inline void libflags_set (
|
||||||
struct procps_pidsinfo *info)
|
struct procps_pidsinfo *info)
|
||||||
{
|
{
|
||||||
|
enum pids_item e;
|
||||||
int i, n;
|
int i, n;
|
||||||
|
|
||||||
memset (info->ref_counts, 0, sizeof(info->ref_counts));
|
memset (info->ref_counts, 0, sizeof(info->ref_counts));
|
||||||
info->flags = info->history_yes = 0;
|
info->flags = info->history_yes = 0;
|
||||||
for (i = 0; i < info->curitems; i++) {
|
for (i = 0; i < info->curitems; i++) {
|
||||||
info->flags |= Item_table[info->items[i]].oldflags;
|
if (((e = info->items[i])) >= PROCPS_PIDS_logical_end)
|
||||||
info->history_yes |= Item_table[info->items[i]].needhist;
|
break;
|
||||||
n = Item_table[info->items[i]].refcount;
|
info->flags |= Item_table[e].oldflags;
|
||||||
|
info->history_yes |= Item_table[e].needhist;
|
||||||
|
n = Item_table[e].refcount;
|
||||||
if (n > -1) ++info->ref_counts[n];
|
if (n > -1) ++info->ref_counts[n];
|
||||||
}
|
}
|
||||||
if (info->flags & f_either) {
|
if (info->flags & f_either) {
|
||||||
@ -1203,7 +1205,7 @@ PROCPS_EXPORT int procps_pids_new (
|
|||||||
|
|
||||||
if (!(p = calloc(1, sizeof(struct procps_pidsinfo))))
|
if (!(p = calloc(1, sizeof(struct procps_pidsinfo))))
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
// allow for our PROCPS_PIDS_physical_end
|
// allow for our PROCPS_PIDS_logical_end
|
||||||
if (!(p->items = calloc((maxitems + 1), sizeof(enum pids_item)))) {
|
if (!(p->items = calloc((maxitems + 1), sizeof(enum pids_item)))) {
|
||||||
free(p);
|
free(p);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
@ -1215,7 +1217,7 @@ PROCPS_EXPORT int procps_pids_new (
|
|||||||
}
|
}
|
||||||
|
|
||||||
memcpy(p->items, items, sizeof(enum pids_item) * maxitems);
|
memcpy(p->items, items, sizeof(enum pids_item) * maxitems);
|
||||||
p->items[maxitems] = PROCPS_PIDS_physical_end;
|
p->items[maxitems] = PROCPS_PIDS_logical_end;
|
||||||
p->curitems = p->maxitems = maxitems + 1;
|
p->curitems = p->maxitems = maxitems + 1;
|
||||||
libflags_set(p);
|
libflags_set(p);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user