Hi all,

Please code review following simple fix (6 lines changed):
http://cr.opensolaris.org/~aragorn/6873852/

Background (root cause):
========================

The problem is with uninitialized ksum_kstat in nfsstat.c file.

First, ksum_kstat is allocated using malloc() in setup(). Then, cn_print() is
called and in turn the nfsstat_kstat_sum() is invoked. As a third parameter in
the nfsstat_kstat_sum() call the ksum_kstat is passed. Please note the
cn_print()/nfsstat_kstat_sum() pair can be called multiple times in a loop.

nfsstat_kstat_sum() assumes several things for its third parameter (named sum
inside the nfsstat_kstat_sum() implementation) which are not always true:

1. sum is allocated (it is not NULL); Why? malloc() in setup() can fail and
return NULL

2. sum->ks_data is NULL when nfsstat_kstat_sum() is called first time; Why?
nobody is zeroing the ksum_kstat after malloc() in setup()

The assumption #2 caused the core reported here. libumem filled the ksum_kstat
in the malloc() by some data, then the nfsstat_kstat_sum() did not called
nfsstat_kstat_copy() leaving sum->ks_data to point to nowhere. And finally we
failed and cored in following "for" statement while trying to dereference
sum->ks_data (aliased here to knpsum).

    999 nfsstat_kstat_sum(kstat_t *kstat1, kstat_t *kstat2, kstat_t *sum)
   1000 {
   1001         int i;
   1002         kstat_named_t *knp1, *knp2, *knpsum;
   1003         if (kstat1 == NULL || kstat2 == NULL)
   1004                 return;
   1005 
   1006         knp1 = KSTAT_NAMED_PTR(kstat1);
   1007         knp2 = KSTAT_NAMED_PTR(kstat2);
   1008         if (sum->ks_data == NULL)
   1009                 nfsstat_kstat_copy(kstat1, sum, 0);
   1010         knpsum = KSTAT_NAMED_PTR(sum);
   1011 
   1012         for (i = 0; i < (kstat1->ks_ndata); i++)
   1013                 knpsum[i].value.ui64 =  knp1[i].value.ui64 + 
knp2[i].value.ui64;
   1014 }

The change aims to fix both wrong assumptions in nfsstat_kstat_sum() - see
above. In addition one small bug in safe_zalloc() is fixed too.



Thanks for the review.

-- 
Marcel Telka
Solaris RPE

Reply via email to