Blame src/sm_process.c

Packit Service 752078
/*
Packit Service 752078
Packit Service 752078
Copyright 1993, 1998  The Open Group
Packit Service 752078
Packit Service 752078
Permission to use, copy, modify, distribute, and sell this software and its
Packit Service 752078
documentation for any purpose is hereby granted without fee, provided that
Packit Service 752078
the above copyright notice appear in all copies and that both that
Packit Service 752078
copyright notice and this permission notice appear in supporting
Packit Service 752078
documentation.
Packit Service 752078
Packit Service 752078
The above copyright notice and this permission notice shall be included in
Packit Service 752078
all copies or substantial portions of the Software.
Packit Service 752078
Packit Service 752078
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit Service 752078
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit Service 752078
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
Packit Service 752078
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
Packit Service 752078
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
Packit Service 752078
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Packit Service 752078
Packit Service 752078
Except as contained in this notice, the name of The Open Group shall not be
Packit Service 752078
used in advertising or otherwise to promote the sale, use or other dealings
Packit Service 752078
in this Software without prior written authorization from The Open Group.
Packit Service 752078
Packit Service 752078
*/
Packit Service 752078
Packit Service 752078
/*
Packit Service 752078
 * Author: Ralph Mor, X Consortium
Packit Service 752078
 */
Packit Service 752078
Packit Service 752078
#ifdef HAVE_CONFIG_H
Packit Service 752078
#include <config.h>
Packit Service 752078
#endif
Packit Service 752078
#include <X11/SM/SMlib.h>
Packit Service 752078
#include <limits.h>
Packit Service 752078
#include "SMlibint.h"
Packit Service 752078
Packit Service 752078
Packit Service 752078
/*
Packit Service 752078
 * Check for bad length
Packit Service 752078
 */
Packit Service 752078
Packit Service 752078
#define CHECK_SIZE_MATCH(_iceConn, _majorOp, _minorOp, _expected_len, _actual_len, _severity) \
Packit Service 752078
    if ((((_actual_len) - SIZEOF (iceMsg)) >> 3) != _expected_len) \
Packit Service 752078
    { \
Packit Service 752078
       _IceErrorBadLength (_iceConn, _majorOp, _minorOp, _severity); \
Packit Service 752078
       return; \
Packit Service 752078
    }
Packit Service 752078
Packit Service 752078
#define CHECK_AT_LEAST_SIZE(_iceConn, _majorOp, _minorOp, _expected_len, _actual_len, _severity) \
Packit Service 752078
    if ((((_actual_len) - SIZEOF (iceMsg)) >> 3) > _expected_len) \
Packit Service 752078
    { \
Packit Service 752078
       _IceErrorBadLength (_iceConn, _majorOp, _minorOp, _severity); \
Packit Service 752078
       return; \
Packit Service 752078
    }
Packit Service 752078
Packit Service 752078

Packit Service 752078
static char *
Packit Service 752078
extractArray8(char **pBuf, char *pEnd, Bool swap, int *len)
Packit Service 752078
{
Packit Service 752078
    char	*p;
Packit Service 752078
    int		n;
Packit Service 752078
Packit Service 752078
    if (pEnd - *pBuf < 4)
Packit Service 752078
	return NULL;
Packit Service 752078
    EXTRACT_CARD32 (*pBuf, swap, n);
Packit Service 752078
    if (n < 0 || n > INT_MAX - 7)
Packit Service 752078
	return NULL;
Packit Service 752078
Packit Service 752078
    if ((p = malloc (n + 1)) == NULL)
Packit Service 752078
	return NULL;
Packit Service 752078
    memcpy(p, *pBuf, n);
Packit Service 752078
    p[n] = '\0';
Packit Service 752078
Packit Service 752078
    *pBuf += n + PAD64 (4 + n);
Packit Service 752078
    if (len != NULL)
Packit Service 752078
	*len = n;
Packit Service 752078
Packit Service 752078
    return p;
Packit Service 752078
}
Packit Service 752078
Packit Service 752078

Packit Service 752078
static SmProp **
Packit Service 752078
extractListofProperty(char *pBuf, char *pEnd, Bool swap, int *count)
Packit Service 752078
{
Packit Service 752078
    int		i, j, n;
Packit Service 752078
    SmProp	**props;
Packit Service 752078
Packit Service 752078
    if (pEnd - pBuf < 4)
Packit Service 752078
	return NULL;
Packit Service 752078
    EXTRACT_CARD32 (pBuf, swap, n);
Packit Service 752078
    if (n < 0 || n > INT_MAX / sizeof (SmProp *))
Packit Service 752078
	return NULL;
Packit Service 752078
    pBuf += 4;
Packit Service 752078
Packit Service 752078
    props = malloc (n * sizeof(SmProp *));
Packit Service 752078
    if (props == NULL)
Packit Service 752078
	return NULL;
Packit Service 752078
Packit Service 752078
    for (i = 0; i < n; i++)
Packit Service 752078
    {
Packit Service 752078
	props[i] = calloc (1, sizeof (SmProp));
Packit Service 752078
	if (props[i] == NULL)
Packit Service 752078
	    goto fail;
Packit Service 752078
	if ((props[i]->name = extractArray8 (&pBuf, pEnd, swap, NULL)) == NULL)
Packit Service 752078
	    goto fail;
Packit Service 752078
	if ((props[i]->type = extractArray8 (&pBuf, pEnd, swap, NULL)) == NULL)
Packit Service 752078
	    goto fail;
Packit Service 752078
Packit Service 752078
	if (pEnd - pBuf < 4)
Packit Service 752078
	    goto fail;
Packit Service 752078
	EXTRACT_CARD32 (pBuf, swap, props[i]->num_vals);
Packit Service 752078
	if (props[i]->num_vals < 0)
Packit Service 752078
	    goto fail;
Packit Service 752078
	pBuf += 4;
Packit Service 752078
	props[i]->vals = calloc (props[i]->num_vals, sizeof (SmPropValue));
Packit Service 752078
	if (props[i]->vals == NULL)
Packit Service 752078
	    goto fail;
Packit Service 752078
Packit Service 752078
	for (j = 0; j < props[i]->num_vals; j++)
Packit Service 752078
	{
Packit Service 752078
	    props[i]->vals[j].value = extractArray8 (&pBuf, pEnd, swap,
Packit Service 752078
		&props[i]->vals[j].length);
Packit Service 752078
	    if (props[i]->vals[j].value == NULL)
Packit Service 752078
		goto fail;
Packit Service 752078
	}
Packit Service 752078
    }
Packit Service 752078
Packit Service 752078
    *count = n;
Packit Service 752078
    return props;
Packit Service 752078
Packit Service 752078
fail:
Packit Service 752078
    for (; i >= 0; i--)
Packit Service 752078
    {
Packit Service 752078
	if (props[i] != NULL)
Packit Service 752078
	{
Packit Service 752078
	    free (props[i]->name);
Packit Service 752078
	    free (props[i]->type);
Packit Service 752078
	    if (props[i]->vals != NULL)
Packit Service 752078
	    {
Packit Service 752078
		for (j = 0; j < props[i]->num_vals; j++)
Packit Service 752078
		    free (props[i]->vals[j].value);
Packit Service 752078
		free (props[i]->vals);
Packit Service 752078
	    }
Packit Service 752078
	    free (props[i]);
Packit Service 752078
	}
Packit Service 752078
    }
Packit Service 752078
    free (props);
Packit Service 752078
    return NULL;
Packit Service 752078
}
Packit Service 752078
Packit Service 752078

Packit Service 752078
static Bool
Packit Service 752078
validErrorMessage(char *pData, char *pEnd, int errorClass, Bool swap)
Packit Service 752078
{
Packit Service 752078
    if (errorClass == IceBadValue)
Packit Service 752078
    {
Packit Service 752078
	unsigned int length;
Packit Service 752078
Packit Service 752078
	if (pEnd - pData < 8)
Packit Service 752078
	    return False;
Packit Service 752078
Packit Service 752078
	pData += 4;
Packit Service 752078
	EXTRACT_CARD32 (pData, swap, length);
Packit Service 752078
	if (length > pEnd - pData)
Packit Service 752078
	    return False;
Packit Service 752078
    }
Packit Service 752078
Packit Service 752078
    return True;
Packit Service 752078
}
Packit Service 752078
Packit Service 752078

Packit Service 752078
void
Packit Service 752078
_SmcProcessMessage(IceConn iceConn, IcePointer clientData, int opcode,
Packit Service 752078
		   unsigned long length, Bool swap,
Packit Service 752078
		   IceReplyWaitInfo *replyWait, Bool *replyReadyRet)
Packit Service 752078
{
Packit Service 752078
    SmcConn	smcConn = (SmcConn) clientData;
Packit Service 752078
Packit Service 752078
    if (replyWait)
Packit Service 752078
	*replyReadyRet = False;
Packit Service 752078
Packit Service 752078
    if (!smcConn->client_id &&
Packit Service 752078
        opcode != SM_RegisterClientReply && opcode != SM_Error)
Packit Service 752078
    {
Packit Service 752078
	_IceReadSkip (iceConn, length << 3);
Packit Service 752078
Packit Service 752078
	_IceErrorBadState (iceConn, _SmcOpcode, opcode, IceFatalToProtocol);
Packit Service 752078
	return;
Packit Service 752078
    }
Packit Service 752078
Packit Service 752078
    switch (opcode)
Packit Service 752078
    {
Packit Service 752078
    case SM_Error:
Packit Service 752078
    {
Packit Service 752078
	iceErrorMsg 	*pMsg;
Packit Service 752078
	char	    	*pData, *pEnd;
Packit Service 752078
Packit Service 752078
	CHECK_AT_LEAST_SIZE (iceConn, _SmcOpcode, opcode,
Packit Service 752078
	    length, SIZEOF (iceErrorMsg), IceFatalToProtocol);
Packit Service 752078
Packit Service 752078
	IceReadCompleteMessage (iceConn, SIZEOF (iceErrorMsg),
Packit Service 752078
	    iceErrorMsg, pMsg, pData);
Packit Service 752078
Packit Service 752078
	if (!IceValidIO (iceConn))
Packit Service 752078
	{
Packit Service 752078
	    IceDisposeCompleteMessage (iceConn, pData);
Packit Service 752078
	    return;
Packit Service 752078
	}
Packit Service 752078
Packit Service 752078
	if (swap)
Packit Service 752078
	{
Packit Service 752078
	    pMsg->errorClass = lswaps (pMsg->errorClass);
Packit Service 752078
	    pMsg->offendingSequenceNum = lswapl (pMsg->offendingSequenceNum);
Packit Service 752078
	}
Packit Service 752078
Packit Service 752078
	pEnd = pData + (length << 3) - (SIZEOF (iceErrorMsg) - SIZEOF(iceMsg));
Packit Service 752078
Packit Service 752078
	if (replyWait &&
Packit Service 752078
	    replyWait->minor_opcode_of_request == SM_RegisterClient &&
Packit Service 752078
            pMsg->errorClass == IceBadValue &&
Packit Service 752078
	    pMsg->offendingMinorOpcode == SM_RegisterClient &&
Packit Service 752078
	    pMsg->offendingSequenceNum == replyWait->sequence_of_request)
Packit Service 752078
	{
Packit Service 752078
	    /*
Packit Service 752078
	     * For Register Client, the previous ID was bad.
Packit Service 752078
	     */
Packit Service 752078
Packit Service 752078
	    _SmcRegisterClientReply *reply =
Packit Service 752078
		(_SmcRegisterClientReply *) (replyWait->reply);
Packit Service 752078
Packit Service 752078
	    reply->status = 0;
Packit Service 752078
Packit Service 752078
	    *replyReadyRet = True;
Packit Service 752078
	}
Packit Service 752078
	else if (!validErrorMessage(pData, pEnd, pMsg->errorClass, swap))
Packit Service 752078
	{
Packit Service 752078
	    _IceErrorBadLength (iceConn, _SmcOpcode, opcode,
Packit Service 752078
		IceFatalToProtocol);
Packit Service 752078
	    IceDisposeCompleteMessage (iceConn, pData);
Packit Service 752078
	    return;
Packit Service 752078
	}
Packit Service 752078
	else
Packit Service 752078
	{
Packit Service 752078
	    (*_SmcErrorHandler) (smcConn, swap,
Packit Service 752078
		pMsg->offendingMinorOpcode,
Packit Service 752078
	        pMsg->offendingSequenceNum,
Packit Service 752078
		pMsg->errorClass, pMsg->severity,
Packit Service 752078
		(SmPointer) pData);
Packit Service 752078
	}
Packit Service 752078
Packit Service 752078
	IceDisposeCompleteMessage (iceConn, pData);
Packit Service 752078
	break;
Packit Service 752078
    }
Packit Service 752078
Packit Service 752078
    case SM_RegisterClientReply:
Packit Service 752078
Packit Service 752078
	if (!replyWait ||
Packit Service 752078
	    replyWait->minor_opcode_of_request != SM_RegisterClient)
Packit Service 752078
	{
Packit Service 752078
	    _IceReadSkip (iceConn, length << 3);
Packit Service 752078
Packit Service 752078
	    _IceErrorBadState (iceConn, _SmcOpcode,
Packit Service 752078
		SM_RegisterClientReply, IceFatalToProtocol);
Packit Service 752078
	}
Packit Service 752078
        else
Packit Service 752078
	{
Packit Service 752078
	    smRegisterClientReplyMsg 	*pMsg;
Packit Service 752078
	    char			*pData, *pStart, *pEnd;
Packit Service 752078
	    _SmcRegisterClientReply 	*reply =
Packit Service 752078
	        (_SmcRegisterClientReply *) (replyWait->reply);
Packit Service 752078
Packit Service 752078
	    CHECK_AT_LEAST_SIZE (iceConn, _SmcOpcode, opcode,
Packit Service 752078
		length, SIZEOF (smRegisterClientReplyMsg), IceFatalToProtocol);
Packit Service 752078
Packit Service 752078
	    IceReadCompleteMessage (iceConn, SIZEOF (smRegisterClientReplyMsg),
Packit Service 752078
		smRegisterClientReplyMsg, pMsg, pStart);
Packit Service 752078
Packit Service 752078
	    if (!IceValidIO (iceConn))
Packit Service 752078
	    {
Packit Service 752078
		IceDisposeCompleteMessage (iceConn, pStart);
Packit Service 752078
		return;
Packit Service 752078
	    }
Packit Service 752078
Packit Service 752078
	    pData = pStart;
Packit Service 752078
	    pEnd = pStart + (length << 3) -
Packit Service 752078
		(SIZEOF (smRegisterClientReplyMsg) - SIZEOF (iceMsg));
Packit Service 752078
Packit Service 752078
	    reply->client_id = extractArray8(&pData, pEnd, swap, NULL);
Packit Service 752078
	    if (reply->client_id == NULL) {
Packit Service 752078
		_IceErrorBadLength (iceConn, _SmcOpcode, opcode,
Packit Service 752078
		    IceFatalToProtocol);
Packit Service 752078
		IceDisposeCompleteMessage (iceConn, pStart);
Packit Service 752078
		return;
Packit Service 752078
	    }
Packit Service 752078
Packit Service 752078
	    reply->status = 1;
Packit Service 752078
	    *replyReadyRet = True;
Packit Service 752078
Packit Service 752078
	    IceDisposeCompleteMessage (iceConn, pStart);
Packit Service 752078
	}
Packit Service 752078
	break;
Packit Service 752078
Packit Service 752078
    case SM_SaveYourself:
Packit Service 752078
    {
Packit Service 752078
	smSaveYourselfMsg 	*pMsg;
Packit Service 752078
	unsigned char		errVal;
Packit Service 752078
	int			errOffset = -1;
Packit Service 752078
Packit Service 752078
	CHECK_SIZE_MATCH (iceConn, _SmcOpcode, opcode,
Packit Service 752078
	    length, SIZEOF (smSaveYourselfMsg),
Packit Service 752078
	    IceFatalToProtocol);
Packit Service 752078
Packit Service 752078
	IceReadMessageHeader (iceConn, SIZEOF (smSaveYourselfMsg),
Packit Service 752078
	    smSaveYourselfMsg, pMsg);
Packit Service 752078
Packit Service 752078
	if (!IceValidIO (iceConn))
Packit Service 752078
	{
Packit Service 752078
	    return;
Packit Service 752078
	}
Packit Service 752078
Packit Service 752078
	if (pMsg->saveType != SmSaveGlobal &&
Packit Service 752078
	    pMsg->saveType != SmSaveLocal &&
Packit Service 752078
	    pMsg->saveType != SmSaveBoth)
Packit Service 752078
	{
Packit Service 752078
	    errVal = pMsg->saveType;
Packit Service 752078
	    errOffset = 8;
Packit Service 752078
	}
Packit Service 752078
	else if (pMsg->shutdown != 1 && pMsg->shutdown != 0)
Packit Service 752078
	{
Packit Service 752078
	    errVal = pMsg->shutdown;
Packit Service 752078
	    errOffset = 9;
Packit Service 752078
	}
Packit Service 752078
	else if (pMsg->interactStyle != SmInteractStyleNone &&
Packit Service 752078
	    pMsg->interactStyle != SmInteractStyleErrors &&
Packit Service 752078
	    pMsg->interactStyle != SmInteractStyleAny)
Packit Service 752078
	{
Packit Service 752078
	    errVal = pMsg->interactStyle;
Packit Service 752078
	    errOffset = 10;
Packit Service 752078
	}
Packit Service 752078
	else if (pMsg->fast != 1 && pMsg->fast != 0)
Packit Service 752078
	{
Packit Service 752078
	    errVal = pMsg->fast;
Packit Service 752078
	    errOffset = 11;
Packit Service 752078
	}
Packit Service 752078
Packit Service 752078
	if (errOffset >= 0)
Packit Service 752078
	{
Packit Service 752078
	    _IceErrorBadValue (iceConn, _SmcOpcode,
Packit Service 752078
	        SM_SaveYourself, errOffset, 1, (IcePointer) &errVal);
Packit Service 752078
	}
Packit Service 752078
	else
Packit Service 752078
	{
Packit Service 752078
	    (*smcConn->callbacks.save_yourself.callback) (smcConn,
Packit Service 752078
	        smcConn->callbacks.save_yourself.client_data,
Packit Service 752078
                pMsg->saveType, pMsg->shutdown,
Packit Service 752078
		pMsg->interactStyle, pMsg->fast);
Packit Service 752078
Packit Service 752078
	    smcConn->save_yourself_in_progress = True;
Packit Service 752078
Packit Service 752078
	    if (pMsg->shutdown)
Packit Service 752078
		smcConn->shutdown_in_progress = True;
Packit Service 752078
	}
Packit Service 752078
	break;
Packit Service 752078
    }
Packit Service 752078
Packit Service 752078
    case SM_SaveYourselfPhase2:
Packit Service 752078
Packit Service 752078
	if (!smcConn->phase2_wait)
Packit Service 752078
	{
Packit Service 752078
	    _IceErrorBadState (iceConn, _SmcOpcode,
Packit Service 752078
		SM_SaveYourselfPhase2, IceCanContinue);
Packit Service 752078
	}
Packit Service 752078
        else
Packit Service 752078
	{
Packit Service 752078
	    CHECK_SIZE_MATCH (iceConn, _SmcOpcode, opcode,
Packit Service 752078
	        length, SIZEOF (smSaveYourselfPhase2Msg),
Packit Service 752078
	        IceFatalToProtocol);
Packit Service 752078
Packit Service 752078
	    (*smcConn->phase2_wait->phase2_proc) (smcConn,
Packit Service 752078
		smcConn->phase2_wait->client_data);
Packit Service 752078
Packit Service 752078
	    free (smcConn->phase2_wait);
Packit Service 752078
	    smcConn->phase2_wait  = NULL;
Packit Service 752078
	}
Packit Service 752078
	break;
Packit Service 752078
Packit Service 752078
    case SM_Interact:
Packit Service 752078
Packit Service 752078
        if (!smcConn->interact_waits)
Packit Service 752078
	{
Packit Service 752078
	    _IceErrorBadState (iceConn, _SmcOpcode,
Packit Service 752078
		SM_Interact, IceCanContinue);
Packit Service 752078
	}
Packit Service 752078
        else
Packit Service 752078
	{
Packit Service 752078
	    _SmcInteractWait *next = smcConn->interact_waits->next;
Packit Service 752078
Packit Service 752078
	    CHECK_SIZE_MATCH (iceConn, _SmcOpcode, opcode,
Packit Service 752078
	        length, SIZEOF (smInteractMsg),
Packit Service 752078
	        IceFatalToProtocol);
Packit Service 752078
Packit Service 752078
	    (*smcConn->interact_waits->interact_proc) (smcConn,
Packit Service 752078
		smcConn->interact_waits->client_data);
Packit Service 752078
Packit Service 752078
	    free (smcConn->interact_waits);
Packit Service 752078
	    smcConn->interact_waits = next;
Packit Service 752078
	}
Packit Service 752078
	break;
Packit Service 752078
Packit Service 752078
    case SM_SaveComplete:
Packit Service 752078
Packit Service 752078
	if (!smcConn->save_yourself_in_progress)
Packit Service 752078
	{
Packit Service 752078
	    _IceErrorBadState (iceConn, _SmcOpcode,
Packit Service 752078
		SM_SaveComplete, IceCanContinue);
Packit Service 752078
	}
Packit Service 752078
	else
Packit Service 752078
	{
Packit Service 752078
	    CHECK_SIZE_MATCH (iceConn, _SmcOpcode, opcode,
Packit Service 752078
	        length, SIZEOF (smSaveCompleteMsg),
Packit Service 752078
	        IceFatalToProtocol);
Packit Service 752078
Packit Service 752078
	    smcConn->save_yourself_in_progress = False;
Packit Service 752078
Packit Service 752078
	    (*smcConn->callbacks.save_complete.callback) (smcConn,
Packit Service 752078
	        smcConn->callbacks.save_complete.client_data);
Packit Service 752078
	}
Packit Service 752078
	break;
Packit Service 752078
Packit Service 752078
    case SM_Die:
Packit Service 752078
Packit Service 752078
	CHECK_SIZE_MATCH (iceConn, _SmcOpcode, opcode,
Packit Service 752078
	    length, SIZEOF (smDieMsg),
Packit Service 752078
	    IceFatalToProtocol);
Packit Service 752078
Packit Service 752078
	(*smcConn->callbacks.die.callback) (smcConn,
Packit Service 752078
	    smcConn->callbacks.die.client_data);
Packit Service 752078
	break;
Packit Service 752078
Packit Service 752078
    case SM_ShutdownCancelled:
Packit Service 752078
Packit Service 752078
	if (!smcConn->shutdown_in_progress)
Packit Service 752078
	{
Packit Service 752078
	    _IceErrorBadState (iceConn, _SmcOpcode,
Packit Service 752078
		SM_ShutdownCancelled, IceCanContinue);
Packit Service 752078
	}
Packit Service 752078
	else
Packit Service 752078
	{
Packit Service 752078
	    CHECK_SIZE_MATCH (iceConn, _SmcOpcode, opcode,
Packit Service 752078
	        length, SIZEOF (smShutdownCancelledMsg),
Packit Service 752078
	        IceFatalToProtocol);
Packit Service 752078
Packit Service 752078
	    smcConn->shutdown_in_progress = False;
Packit Service 752078
Packit Service 752078
	    (*smcConn->callbacks.shutdown_cancelled.callback) (smcConn,
Packit Service 752078
	        smcConn->callbacks.shutdown_cancelled.client_data);
Packit Service 752078
	}
Packit Service 752078
	break;
Packit Service 752078
Packit Service 752078
    case SM_PropertiesReply:
Packit Service 752078
Packit Service 752078
        if (!smcConn->prop_reply_waits)
Packit Service 752078
	{
Packit Service 752078
	    _IceReadSkip (iceConn, length << 3);
Packit Service 752078
Packit Service 752078
	    _IceErrorBadState (iceConn, _SmcOpcode,
Packit Service 752078
		SM_PropertiesReply, IceCanContinue);
Packit Service 752078
	}
Packit Service 752078
        else
Packit Service 752078
	{
Packit Service 752078
	    smPropertiesReplyMsg 	*pMsg;
Packit Service 752078
	    char 			*pStart, *pEnd;
Packit Service 752078
	    int				numProps = 0;
Packit Service 752078
	    SmProp			**props = NULL;
Packit Service 752078
	    _SmcPropReplyWait 		*next;
Packit Service 752078
Packit Service 752078
	    CHECK_AT_LEAST_SIZE (iceConn, _SmcOpcode, opcode,
Packit Service 752078
		length, SIZEOF (smPropertiesReplyMsg), IceFatalToProtocol);
Packit Service 752078
Packit Service 752078
	    IceReadCompleteMessage (iceConn, SIZEOF (smPropertiesReplyMsg),
Packit Service 752078
		smPropertiesReplyMsg, pMsg, pStart);
Packit Service 752078
Packit Service 752078
	    if (!IceValidIO (iceConn))
Packit Service 752078
	    {
Packit Service 752078
		IceDisposeCompleteMessage (iceConn, pStart);
Packit Service 752078
		return;
Packit Service 752078
	    }
Packit Service 752078
Packit Service 752078
	    pEnd = pStart + (length << 3) -
Packit Service 752078
		(SIZEOF (smPropertiesReplyMsg) - SIZEOF (iceMsg));
Packit Service 752078
Packit Service 752078
	    props = extractListofProperty(pStart, pEnd, swap, &numProps);
Packit Service 752078
	    if (props == NULL)
Packit Service 752078
	    {
Packit Service 752078
		_IceErrorBadLength (iceConn, _SmcOpcode, opcode,
Packit Service 752078
		    IceFatalToProtocol);
Packit Service 752078
		IceDisposeCompleteMessage (iceConn, pStart);
Packit Service 752078
		return;
Packit Service 752078
	    }
Packit Service 752078
Packit Service 752078
	    next = smcConn->prop_reply_waits->next;
Packit Service 752078
Packit Service 752078
	    (*smcConn->prop_reply_waits->prop_reply_proc) (smcConn,
Packit Service 752078
		smcConn->prop_reply_waits->client_data, numProps, props);
Packit Service 752078
Packit Service 752078
	    free (smcConn->prop_reply_waits);
Packit Service 752078
	    smcConn->prop_reply_waits = next;
Packit Service 752078
Packit Service 752078
	    IceDisposeCompleteMessage (iceConn, pStart);
Packit Service 752078
	}
Packit Service 752078
	break;
Packit Service 752078
Packit Service 752078
    default:
Packit Service 752078
    {
Packit Service 752078
	_IceErrorBadMinor (iceConn, _SmcOpcode, opcode, IceCanContinue);
Packit Service 752078
	_IceReadSkip (iceConn, length << 3);
Packit Service 752078
	break;
Packit Service 752078
    }
Packit Service 752078
    }
Packit Service 752078
}
Packit Service 752078
Packit Service 752078
Packit Service 752078

Packit Service 752078
void
Packit Service 752078
_SmsProcessMessage(IceConn iceConn, IcePointer clientData, int opcode,
Packit Service 752078
		   unsigned long length, Bool swap)
Packit Service 752078
{
Packit Service 752078
    SmsConn	smsConn = (SmsConn) clientData;
Packit Service 752078
Packit Service 752078
    if (!smsConn->client_id &&
Packit Service 752078
        opcode != SM_RegisterClient && opcode != SM_Error)
Packit Service 752078
    {
Packit Service 752078
	_IceReadSkip (iceConn, length << 3);
Packit Service 752078
Packit Service 752078
	_IceErrorBadState (iceConn, _SmsOpcode, opcode, IceFatalToProtocol);
Packit Service 752078
Packit Service 752078
	return;
Packit Service 752078
    }
Packit Service 752078
Packit Service 752078
    switch (opcode)
Packit Service 752078
    {
Packit Service 752078
    case SM_Error:
Packit Service 752078
    {
Packit Service 752078
	iceErrorMsg 	*pMsg;
Packit Service 752078
	char	    	*pData, *pEnd;
Packit Service 752078
Packit Service 752078
	CHECK_AT_LEAST_SIZE (iceConn, _SmsOpcode, opcode,
Packit Service 752078
	    length, SIZEOF (iceErrorMsg), IceFatalToProtocol);
Packit Service 752078
Packit Service 752078
	IceReadCompleteMessage (iceConn, SIZEOF (iceErrorMsg),
Packit Service 752078
	    iceErrorMsg, pMsg, pData);
Packit Service 752078
Packit Service 752078
	if (!IceValidIO (iceConn))
Packit Service 752078
	{
Packit Service 752078
	    IceDisposeCompleteMessage (iceConn, pData);
Packit Service 752078
	    return;
Packit Service 752078
	}
Packit Service 752078
Packit Service 752078
	if (swap)
Packit Service 752078
	{
Packit Service 752078
	    pMsg->errorClass = lswaps (pMsg->errorClass);
Packit Service 752078
	    pMsg->offendingSequenceNum = lswapl (pMsg->offendingSequenceNum);
Packit Service 752078
	}
Packit Service 752078
Packit Service 752078
	pEnd = pData + (length << 3) - (SIZEOF (iceErrorMsg) - SIZEOF (iceMsg));
Packit Service 752078
Packit Service 752078
	if (!validErrorMessage(pData, pEnd, pMsg->errorClass, swap))
Packit Service 752078
	{
Packit Service 752078
	    _IceErrorBadLength (iceConn, _SmcOpcode, opcode,
Packit Service 752078
		IceFatalToProtocol);
Packit Service 752078
	    IceDisposeCompleteMessage (iceConn, pData);
Packit Service 752078
	    return;
Packit Service 752078
	}
Packit Service 752078
Packit Service 752078
	(*_SmsErrorHandler) (smsConn, swap,
Packit Service 752078
	    pMsg->offendingMinorOpcode,
Packit Service 752078
	    pMsg->offendingSequenceNum,
Packit Service 752078
	    pMsg->errorClass, pMsg->severity,
Packit Service 752078
            (SmPointer) pData);
Packit Service 752078
Packit Service 752078
	IceDisposeCompleteMessage (iceConn, pData);
Packit Service 752078
	break;
Packit Service 752078
    }
Packit Service 752078
Packit Service 752078
    case SM_RegisterClient:
Packit Service 752078
    {
Packit Service 752078
	smRegisterClientMsg 	*pMsg;
Packit Service 752078
	char 			*pData, *pStart, *pEnd;
Packit Service 752078
	char 			*previousId;
Packit Service 752078
	int                      idLen;
Packit Service 752078
Packit Service 752078
	CHECK_AT_LEAST_SIZE (iceConn, _SmsOpcode, opcode,
Packit Service 752078
	    length, SIZEOF (smRegisterClientMsg), IceFatalToProtocol);
Packit Service 752078
Packit Service 752078
	IceReadCompleteMessage (iceConn, SIZEOF (smRegisterClientMsg),
Packit Service 752078
	    smRegisterClientMsg, pMsg, pStart);
Packit Service 752078
Packit Service 752078
	if (!IceValidIO (iceConn))
Packit Service 752078
	{
Packit Service 752078
	    IceDisposeCompleteMessage (iceConn, pStart);
Packit Service 752078
	    return;
Packit Service 752078
	}
Packit Service 752078
Packit Service 752078
	pData = pStart;
Packit Service 752078
	pEnd = pStart + (length << 3) -
Packit Service 752078
	    (SIZEOF (smRegisterClientMsg) - SIZEOF (iceMsg));
Packit Service 752078
Packit Service 752078
	previousId = extractArray8(&pData, pEnd, swap, &idLen);
Packit Service 752078
	if (previousId == NULL)
Packit Service 752078
	{
Packit Service 752078
	    _IceErrorBadLength (iceConn, _SmcOpcode, opcode,
Packit Service 752078
		IceFatalToProtocol);
Packit Service 752078
	    IceDisposeCompleteMessage (iceConn, pStart);
Packit Service 752078
	    return;
Packit Service 752078
	}
Packit Service 752078
Packit Service 752078
	if (*previousId == '\0')
Packit Service 752078
	{
Packit Service 752078
	    free (previousId);
Packit Service 752078
	    previousId = NULL;
Packit Service 752078
	}
Packit Service 752078
Packit Service 752078
	if (!(*smsConn->callbacks.register_client.callback) (smsConn,
Packit Service 752078
            smsConn->callbacks.register_client.manager_data, previousId))
Packit Service 752078
	{
Packit Service 752078
	    /*
Packit Service 752078
	     * The previoudId was bad.  Generate BadValue error.
Packit Service 752078
	     */
Packit Service 752078
Packit Service 752078
	    _IceErrorBadValue (smsConn->iceConn, _SmsOpcode, SM_RegisterClient,
Packit Service 752078
		8, ARRAY8_BYTES (idLen), (IcePointer) pStart);
Packit Service 752078
	}
Packit Service 752078
Packit Service 752078
	IceDisposeCompleteMessage (iceConn, pStart);
Packit Service 752078
	break;
Packit Service 752078
    }
Packit Service 752078
Packit Service 752078
    case SM_InteractRequest:
Packit Service 752078
Packit Service 752078
        if (!smsConn->save_yourself_in_progress ||
Packit Service 752078
	    smsConn->interaction_allowed == SmInteractStyleNone)
Packit Service 752078
	{
Packit Service 752078
	    _IceErrorBadState (iceConn, _SmsOpcode,
Packit Service 752078
		SM_InteractRequest, IceCanContinue);
Packit Service 752078
	}
Packit Service 752078
        else
Packit Service 752078
	{
Packit Service 752078
	    smInteractRequestMsg 	*pMsg;
Packit Service 752078
Packit Service 752078
	    CHECK_SIZE_MATCH (iceConn, _SmsOpcode, opcode,
Packit Service 752078
	        length, SIZEOF (smInteractRequestMsg),
Packit Service 752078
	        IceFatalToProtocol);
Packit Service 752078
Packit Service 752078
	    IceReadSimpleMessage (iceConn, smInteractRequestMsg, pMsg);
Packit Service 752078
Packit Service 752078
	    if (pMsg->dialogType != SmDialogNormal &&
Packit Service 752078
		pMsg->dialogType != SmDialogError)
Packit Service 752078
	    {
Packit Service 752078
		unsigned char errVal = pMsg->dialogType;
Packit Service 752078
Packit Service 752078
		_IceErrorBadValue (iceConn, _SmsOpcode,
Packit Service 752078
	            SM_InteractRequest, 2, 1, (IcePointer) &errVal);
Packit Service 752078
	    }
Packit Service 752078
	    else if (pMsg->dialogType == SmDialogNormal &&
Packit Service 752078
		smsConn->interaction_allowed != SmInteractStyleAny)
Packit Service 752078
	    {
Packit Service 752078
		_IceErrorBadState (iceConn, _SmsOpcode,
Packit Service 752078
		    SM_InteractRequest, IceCanContinue);
Packit Service 752078
	    }
Packit Service 752078
	    else
Packit Service 752078
	    {
Packit Service 752078
		(*smsConn->callbacks.interact_request.callback) (smsConn,
Packit Service 752078
	            smsConn->callbacks.interact_request.manager_data,
Packit Service 752078
		    pMsg->dialogType);
Packit Service 752078
	    }
Packit Service 752078
	}
Packit Service 752078
	break;
Packit Service 752078
Packit Service 752078
    case SM_InteractDone:
Packit Service 752078
Packit Service 752078
        if (!smsConn->interact_in_progress)
Packit Service 752078
	{
Packit Service 752078
	    _IceErrorBadState (iceConn, _SmsOpcode,
Packit Service 752078
		SM_InteractDone, IceCanContinue);
Packit Service 752078
	}
Packit Service 752078
        else
Packit Service 752078
	{
Packit Service 752078
	    smInteractDoneMsg 	*pMsg;
Packit Service 752078
Packit Service 752078
	    CHECK_SIZE_MATCH (iceConn, _SmsOpcode, opcode,
Packit Service 752078
	        length, SIZEOF (smInteractDoneMsg),
Packit Service 752078
	        IceFatalToProtocol);
Packit Service 752078
Packit Service 752078
	    IceReadSimpleMessage (iceConn, smInteractDoneMsg, pMsg);
Packit Service 752078
Packit Service 752078
	    if (pMsg->cancelShutdown != 1 &&
Packit Service 752078
		pMsg->cancelShutdown != 0)
Packit Service 752078
	    {
Packit Service 752078
		unsigned char errVal = pMsg->cancelShutdown;
Packit Service 752078
Packit Service 752078
		_IceErrorBadValue (iceConn, _SmsOpcode,
Packit Service 752078
	            SM_InteractDone, 2, 1, (IcePointer) &errVal);
Packit Service 752078
	    }
Packit Service 752078
	    else if (pMsg->cancelShutdown && !smsConn->can_cancel_shutdown)
Packit Service 752078
	    {
Packit Service 752078
		_IceErrorBadState (iceConn, _SmsOpcode,
Packit Service 752078
		    SM_InteractDone, IceCanContinue);
Packit Service 752078
	    }
Packit Service 752078
	    else
Packit Service 752078
	    {
Packit Service 752078
		smsConn->interact_in_progress = False;
Packit Service 752078
Packit Service 752078
		(*smsConn->callbacks.interact_done.callback) (smsConn,
Packit Service 752078
	            smsConn->callbacks.interact_done.manager_data,
Packit Service 752078
	            pMsg->cancelShutdown);
Packit Service 752078
	    }
Packit Service 752078
	}
Packit Service 752078
	break;
Packit Service 752078
Packit Service 752078
    case SM_SaveYourselfRequest:
Packit Service 752078
    {
Packit Service 752078
	smSaveYourselfRequestMsg 	*pMsg;
Packit Service 752078
	unsigned char			errVal;
Packit Service 752078
	int				errOffset = -1;
Packit Service 752078
Packit Service 752078
	CHECK_SIZE_MATCH (iceConn, _SmsOpcode, opcode,
Packit Service 752078
	    length, SIZEOF (smSaveYourselfRequestMsg),
Packit Service 752078
	    IceFatalToProtocol);
Packit Service 752078
Packit Service 752078
	IceReadMessageHeader (iceConn, SIZEOF (smSaveYourselfRequestMsg),
Packit Service 752078
	    smSaveYourselfRequestMsg, pMsg);
Packit Service 752078
Packit Service 752078
	if (!IceValidIO (iceConn))
Packit Service 752078
	{
Packit Service 752078
	    IceDisposeCompleteMessage (iceConn, pMsg);
Packit Service 752078
	    return;
Packit Service 752078
	}
Packit Service 752078
Packit Service 752078
	if (pMsg->saveType != SmSaveGlobal &&
Packit Service 752078
	    pMsg->saveType != SmSaveLocal &&
Packit Service 752078
	    pMsg->saveType != SmSaveBoth)
Packit Service 752078
	{
Packit Service 752078
	    errVal = pMsg->saveType;
Packit Service 752078
	    errOffset = 8;
Packit Service 752078
	}
Packit Service 752078
	else if (pMsg->shutdown != 1 && pMsg->shutdown != 0)
Packit Service 752078
	{
Packit Service 752078
	    errVal = pMsg->shutdown;
Packit Service 752078
	    errOffset = 9;
Packit Service 752078
	}
Packit Service 752078
	else if (pMsg->interactStyle != SmInteractStyleNone &&
Packit Service 752078
	    pMsg->interactStyle != SmInteractStyleErrors &&
Packit Service 752078
	    pMsg->interactStyle != SmInteractStyleAny)
Packit Service 752078
	{
Packit Service 752078
	    errVal = pMsg->interactStyle;
Packit Service 752078
	    errOffset = 10;
Packit Service 752078
	}
Packit Service 752078
	else if (pMsg->fast != 1 && pMsg->fast != 0)
Packit Service 752078
	{
Packit Service 752078
	    errVal = pMsg->fast;
Packit Service 752078
	    errOffset = 11;
Packit Service 752078
	}
Packit Service 752078
	else if (pMsg->global != 1 && pMsg->global != 0)
Packit Service 752078
	{
Packit Service 752078
	    errVal = pMsg->fast;
Packit Service 752078
	    errOffset = 11;
Packit Service 752078
	}
Packit Service 752078
Packit Service 752078
	if (errOffset >= 0)
Packit Service 752078
	{
Packit Service 752078
	    _IceErrorBadValue (iceConn, _SmsOpcode,
Packit Service 752078
	        SM_SaveYourselfRequest, errOffset, 1, (IcePointer) &errVal);
Packit Service 752078
	}
Packit Service 752078
	else
Packit Service 752078
	{
Packit Service 752078
	    (*smsConn->callbacks.save_yourself_request.callback) (smsConn,
Packit Service 752078
	        smsConn->callbacks.save_yourself_request.manager_data,
Packit Service 752078
                pMsg->saveType, pMsg->shutdown, pMsg->interactStyle,
Packit Service 752078
	        pMsg->fast, pMsg->global);
Packit Service 752078
	}
Packit Service 752078
	break;
Packit Service 752078
    }
Packit Service 752078
Packit Service 752078
    case SM_SaveYourselfPhase2Request:
Packit Service 752078
Packit Service 752078
        if (!smsConn->save_yourself_in_progress)
Packit Service 752078
	{
Packit Service 752078
	    _IceErrorBadState (iceConn, _SmsOpcode,
Packit Service 752078
		SM_SaveYourselfPhase2Request, IceCanContinue);
Packit Service 752078
	}
Packit Service 752078
        else
Packit Service 752078
	{
Packit Service 752078
	    CHECK_SIZE_MATCH (iceConn, _SmsOpcode, opcode,
Packit Service 752078
	        length, SIZEOF (smSaveYourselfPhase2RequestMsg),
Packit Service 752078
	        IceFatalToProtocol);
Packit Service 752078
Packit Service 752078
	    (*smsConn->callbacks.save_yourself_phase2_request.callback) (
Packit Service 752078
		smsConn, smsConn->callbacks.
Packit Service 752078
		save_yourself_phase2_request.manager_data);
Packit Service 752078
	}
Packit Service 752078
	break;
Packit Service 752078
Packit Service 752078
    case SM_SaveYourselfDone:
Packit Service 752078
Packit Service 752078
        if (!smsConn->save_yourself_in_progress)
Packit Service 752078
	{
Packit Service 752078
	    _IceErrorBadState (iceConn, _SmsOpcode,
Packit Service 752078
		SM_SaveYourselfDone, IceCanContinue);
Packit Service 752078
	}
Packit Service 752078
        else
Packit Service 752078
	{
Packit Service 752078
	    smSaveYourselfDoneMsg 	*pMsg;
Packit Service 752078
Packit Service 752078
	    CHECK_SIZE_MATCH (iceConn, _SmsOpcode, opcode,
Packit Service 752078
	        length, SIZEOF (smSaveYourselfDoneMsg),
Packit Service 752078
	        IceFatalToProtocol);
Packit Service 752078
Packit Service 752078
	    IceReadSimpleMessage (iceConn, smSaveYourselfDoneMsg, pMsg);
Packit Service 752078
Packit Service 752078
	    if (pMsg->success != 1 && pMsg->success != 0)
Packit Service 752078
	    {
Packit Service 752078
		unsigned char errVal = pMsg->success;
Packit Service 752078
Packit Service 752078
		_IceErrorBadValue (iceConn, _SmsOpcode,
Packit Service 752078
	            SM_SaveYourselfDone, 2, 1, (IcePointer) &errVal);
Packit Service 752078
	    }
Packit Service 752078
	    else
Packit Service 752078
	    {
Packit Service 752078
		smsConn->save_yourself_in_progress = False;
Packit Service 752078
		smsConn->interaction_allowed = SmInteractStyleNone;
Packit Service 752078
Packit Service 752078
		(*smsConn->callbacks.save_yourself_done.callback) (smsConn,
Packit Service 752078
	            smsConn->callbacks.save_yourself_done.manager_data,
Packit Service 752078
		    pMsg->success);
Packit Service 752078
	    }
Packit Service 752078
	}
Packit Service 752078
	break;
Packit Service 752078
Packit Service 752078
    case SM_CloseConnection:
Packit Service 752078
    {
Packit Service 752078
	smCloseConnectionMsg 	*pMsg;
Packit Service 752078
	char 			*pData, *pStart, *pEnd;
Packit Service 752078
	int 			count, i;
Packit Service 752078
	char 			**reasonMsgs = NULL;
Packit Service 752078
Packit Service 752078
	CHECK_AT_LEAST_SIZE (iceConn, _SmsOpcode, opcode,
Packit Service 752078
	    length, SIZEOF (smCloseConnectionMsg) + 8, IceFatalToProtocol);
Packit Service 752078
Packit Service 752078
	IceReadCompleteMessage (iceConn, SIZEOF (smCloseConnectionMsg),
Packit Service 752078
	    smCloseConnectionMsg, pMsg, pStart);
Packit Service 752078
Packit Service 752078
	if (!IceValidIO (iceConn))
Packit Service 752078
	{
Packit Service 752078
	    IceDisposeCompleteMessage (iceConn, pStart);
Packit Service 752078
	    return;
Packit Service 752078
	}
Packit Service 752078
Packit Service 752078
	pData = pStart;
Packit Service 752078
	pEnd = pStart + (length << 3) -
Packit Service 752078
	    (SIZEOF (smCloseConnectionMsg) - SIZEOF (iceMsg));
Packit Service 752078
Packit Service 752078
	EXTRACT_CARD32 (pData, swap, count);
Packit Service 752078
	pData += 4;
Packit Service 752078
Packit Service 752078
	if (count < 0 || count > INT_MAX / sizeof (char *) ||
Packit Service 752078
	    (reasonMsgs = malloc (count * sizeof (char *))) == NULL)
Packit Service 752078
	{
Packit Service 752078
	    _IceErrorBadLength (iceConn, _SmcOpcode, opcode, IceFatalToProtocol);
Packit Service 752078
	    IceDisposeCompleteMessage (iceConn, pStart);
Packit Service 752078
	    return;
Packit Service 752078
	}
Packit Service 752078
Packit Service 752078
	for (i = 0; i < count; i++)
Packit Service 752078
	{
Packit Service 752078
	    reasonMsgs[i] = extractArray8(&pData, pEnd, swap, NULL);
Packit Service 752078
	    if (reasonMsgs[i] == NULL)
Packit Service 752078
		break;
Packit Service 752078
	}
Packit Service 752078
	if (i != count) {
Packit Service 752078
	    while (i-- > 0)
Packit Service 752078
		free (reasonMsgs[i]);
Packit Service 752078
	    free (reasonMsgs);
Packit Service 752078
	    _IceErrorBadLength (iceConn, _SmcOpcode, opcode,
Packit Service 752078
		IceFatalToProtocol);
Packit Service 752078
	    IceDisposeCompleteMessage (iceConn, pStart);
Packit Service 752078
	    return;
Packit Service 752078
	}
Packit Service 752078
Packit Service 752078
	IceDisposeCompleteMessage (iceConn, pStart);
Packit Service 752078
Packit Service 752078
	(*smsConn->callbacks.close_connection.callback) (smsConn,
Packit Service 752078
	    smsConn->callbacks.close_connection.manager_data,
Packit Service 752078
	    count, reasonMsgs);
Packit Service 752078
	break;
Packit Service 752078
    }
Packit Service 752078
Packit Service 752078
    case SM_SetProperties:
Packit Service 752078
    {
Packit Service 752078
	smSetPropertiesMsg 	*pMsg;
Packit Service 752078
	char 			*pStart, *pEnd;
Packit Service 752078
	SmProp			**props = NULL;
Packit Service 752078
	int 			numProps = 0;
Packit Service 752078
Packit Service 752078
	CHECK_AT_LEAST_SIZE (iceConn, _SmsOpcode, opcode,
Packit Service 752078
	    length, SIZEOF (smSetPropertiesMsg), IceFatalToProtocol);
Packit Service 752078
Packit Service 752078
	IceReadCompleteMessage (iceConn, SIZEOF (smSetPropertiesMsg),
Packit Service 752078
	    smSetPropertiesMsg, pMsg, pStart);
Packit Service 752078
Packit Service 752078
	if (!IceValidIO (iceConn))
Packit Service 752078
	{
Packit Service 752078
	    IceDisposeCompleteMessage (iceConn, pStart);
Packit Service 752078
	    return;
Packit Service 752078
	}
Packit Service 752078
Packit Service 752078
	pEnd = pStart + (length << 3) -
Packit Service 752078
	    (SIZEOF (smSetPropertiesMsg) - SIZEOF (iceMsg));
Packit Service 752078
Packit Service 752078
	props = extractListofProperty(pStart, pEnd, swap, &numProps);
Packit Service 752078
	if (props == NULL)
Packit Service 752078
	{
Packit Service 752078
	    _IceErrorBadLength (iceConn, _SmcOpcode, opcode,
Packit Service 752078
		IceFatalToProtocol);
Packit Service 752078
	    IceDisposeCompleteMessage (iceConn, pStart);
Packit Service 752078
	    return;
Packit Service 752078
	}
Packit Service 752078
Packit Service 752078
	(*smsConn->callbacks.set_properties.callback) (smsConn,
Packit Service 752078
	    smsConn->callbacks.set_properties.manager_data, numProps, props);
Packit Service 752078
Packit Service 752078
	IceDisposeCompleteMessage (iceConn, pStart);
Packit Service 752078
	break;
Packit Service 752078
    }
Packit Service 752078
Packit Service 752078
    case SM_DeleteProperties:
Packit Service 752078
    {
Packit Service 752078
	smDeletePropertiesMsg 	*pMsg;
Packit Service 752078
	char 			*pData, *pStart, *pEnd;
Packit Service 752078
	int 			count, i;
Packit Service 752078
	char 			**propNames = NULL;
Packit Service 752078
Packit Service 752078
	CHECK_AT_LEAST_SIZE (iceConn, _SmsOpcode, opcode,
Packit Service 752078
	    length, SIZEOF (smDeletePropertiesMsg) + 8, IceFatalToProtocol);
Packit Service 752078
Packit Service 752078
	IceReadCompleteMessage (iceConn, SIZEOF (smDeletePropertiesMsg),
Packit Service 752078
	    smDeletePropertiesMsg, pMsg, pStart);
Packit Service 752078
Packit Service 752078
	if (!IceValidIO (iceConn))
Packit Service 752078
	{
Packit Service 752078
	    IceDisposeCompleteMessage (iceConn, pStart);
Packit Service 752078
	    return;
Packit Service 752078
	}
Packit Service 752078
Packit Service 752078
	pData = pStart;
Packit Service 752078
	pEnd = pStart + (length << 3) -
Packit Service 752078
	    (SIZEOF (smDeletePropertiesMsg) - SIZEOF (iceMsg));
Packit Service 752078
Packit Service 752078
	EXTRACT_CARD32 (pData, swap, count);
Packit Service 752078
	pData += 4;
Packit Service 752078
Packit Service 752078
	if (count < 0 || count > INT_MAX / sizeof (char *) ||
Packit Service 752078
	    (propNames = malloc (count * sizeof (char *))) == NULL)
Packit Service 752078
	{
Packit Service 752078
	    IceDisposeCompleteMessage (iceConn, pStart);
Packit Service 752078
	    return;
Packit Service 752078
	}
Packit Service 752078
Packit Service 752078
	for (i = 0; i < count; i++)
Packit Service 752078
	{
Packit Service 752078
	    propNames[i] = extractArray8(&pData, pEnd, swap, NULL);
Packit Service 752078
	    if (propNames[i] == NULL)
Packit Service 752078
		break;
Packit Service 752078
	}
Packit Service 752078
	if (i != count)
Packit Service 752078
	{
Packit Service 752078
	    while (i-- > 0)
Packit Service 752078
		free (propNames[i]);
Packit Service 752078
	    free (propNames);
Packit Service 752078
	    _IceErrorBadLength (iceConn, _SmcOpcode, opcode,
Packit Service 752078
		IceFatalToProtocol);
Packit Service 752078
	    IceDisposeCompleteMessage (iceConn, pStart);
Packit Service 752078
	    return;
Packit Service 752078
	}
Packit Service 752078
Packit Service 752078
	IceDisposeCompleteMessage (iceConn, pStart);
Packit Service 752078
Packit Service 752078
	(*smsConn->callbacks.delete_properties.callback) (smsConn,
Packit Service 752078
	    smsConn->callbacks.delete_properties.manager_data,
Packit Service 752078
	    count, propNames);
Packit Service 752078
Packit Service 752078
	break;
Packit Service 752078
    }
Packit Service 752078
Packit Service 752078
    case SM_GetProperties:
Packit Service 752078
Packit Service 752078
	CHECK_SIZE_MATCH (iceConn, _SmsOpcode, opcode,
Packit Service 752078
	    length, SIZEOF (smGetPropertiesMsg),
Packit Service 752078
	    IceFatalToProtocol);
Packit Service 752078
Packit Service 752078
	(*smsConn->callbacks.get_properties.callback) (smsConn,
Packit Service 752078
	    smsConn->callbacks.get_properties.manager_data);
Packit Service 752078
	break;
Packit Service 752078
Packit Service 752078
    default:
Packit Service 752078
    {
Packit Service 752078
	_IceErrorBadMinor (iceConn, _SmsOpcode, opcode, IceCanContinue);
Packit Service 752078
	_IceReadSkip (iceConn, length << 3);
Packit Service 752078
	break;
Packit Service 752078
    }
Packit Service 752078
    }
Packit Service 752078
}