#! /bin/sh
# PCP QA Test No. 193
# bogus pdus attacking pmcd causing core dump or looping pmcd
# pv 935490
#
# Copyright (c) 2005 Silicon Graphics, Inc.  All Rights Reserved.
#

seq=`basename $0`
echo "QA output created by $seq"

# get standard environment, filters and checks
. ./common.product
. ./common.filter
. ./common.check

status=0	# success is the default!
$sudo rm -rf $tmp.* $seq.full
trap "_cleanup; rm -f $tmp.*; exit \$status" 0 1 2 3 15

_stop_auto_restart pmcd

# and NO malloc() hardening ...
# vm33:
#   false match on DoAttributes() -> __pmSendAttr() -> __pmUnpinPDUBuf() -> free()
#   code path
#
case $PCP_PLATFORM
in
    openbsd)
    	unset MALLOC_OPTIONS
	;;
esac

_cleanup()
{
    pmstore pmcd.control.debug 0 >>$seq.full 2>&1 # pdu==1
    _restore_auto_restart pmcd
}

_service pcp stop >/dev/null 2>&1
sleep 2
_service pcp start >/dev/null 2>&1
_wait_for_pmcd
_wait_for_pmlogger

# real QA test starts here
pmstore pmcd.control.debug 1 >>$seq.full 2>&1 # pdu==1
src/crashpmcd

# give pmcd a chance to deal with PDUs from crashpmcd
sleep 2

echo "$PCP_PMCDLOG_PATH" >>$seq.full
cat $PCP_PMCDLOG_PATH >>$seq.full
_filter_pmcd_log <$PCP_PMCDLOG_PATH \
| sed \
    -e '1,/ok FD /d' \
    -e '/ok FD /d' \
    -e '/pmXmitPDU: ERROR/d' \
    -e '/pmGetPDU: TYPE/d' \
    -e '/^000:/d' \
    -e 's/fd=[0-9][0-9]*/fd=N/' \
    -e '/HandleClientInput/s/client\[[0-9][0-9]*]/client[N]/' \
    -e 's/len=-1: Connection reset by peer.*/END-OF-FILE/' \
    -e 's/Connection reset by peer/Broken pipe/' \
    -e 's/have .*, want .*, got 0/END-OF-FILE/' \
    -e '/PMNS file "DEFAULT" is unchanged/d' \
    #end

# success, all done
exit
