mirror of
				https://github.com/SwallowOS/xorg_lib_libXdmcp
				synced 2025-11-04 22:56:17 +08:00 
			
		
		
		
	alloc/realloc/free calls are encapsulated in libXdmcp, so there is no need to wrap allocation functions even under Windows Signed-off-by: Mikhail Gusarov <dottedmag@dottedmag.net> Signed-off-by: Alan Coopersmith <alan.coopersmith@oracle.com>
		
			
				
	
	
		
			248 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			248 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
Copyright 1989, 1998  The Open Group
 | 
						|
 | 
						|
Permission to use, copy, modify, distribute, and sell this software and its
 | 
						|
documentation for any purpose is hereby granted without fee, provided that
 | 
						|
the above copyright notice appear in all copies and that both that
 | 
						|
copyright notice and this permission notice appear in supporting
 | 
						|
documentation.
 | 
						|
 | 
						|
The above copyright notice and this permission notice shall be included in
 | 
						|
all copies or substantial portions of the Software.
 | 
						|
 | 
						|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
						|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 | 
						|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
 | 
						|
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 | 
						|
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
						|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
						|
 | 
						|
Except as contained in this notice, the name of The Open Group shall not be
 | 
						|
used in advertising or otherwise to promote the sale, use or other dealings
 | 
						|
in this Software without prior written authorization from The Open Group.
 | 
						|
 *
 | 
						|
 * Author:  Keith Packard, MIT X Consortium
 | 
						|
 */
 | 
						|
 | 
						|
#ifdef HAVE_CONFIG_H
 | 
						|
#include <config.h>
 | 
						|
#endif
 | 
						|
#include <X11/Xos.h>
 | 
						|
#include <X11/X.h>
 | 
						|
#include <X11/Xmd.h>
 | 
						|
#include <X11/Xdmcp.h>
 | 
						|
#include <stdint.h>
 | 
						|
#include <stdlib.h>
 | 
						|
 | 
						|
/*
 | 
						|
 * This variant of malloc does not return NULL if zero size is passed into.
 | 
						|
 */
 | 
						|
static void *
 | 
						|
xmalloc(size_t size)
 | 
						|
{
 | 
						|
    return malloc(size ? size : 1);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * This variant of realloc does not return NULL if zero size is passed into
 | 
						|
 */
 | 
						|
static void *
 | 
						|
xrealloc(void *ptr, size_t size)
 | 
						|
{
 | 
						|
    return realloc(ptr, size ? size : 1);
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
XdmcpAllocARRAY8 (ARRAY8Ptr array, int length)
 | 
						|
{
 | 
						|
    CARD8Ptr	newData;
 | 
						|
 | 
						|
    /* length defined in ARRAY8 struct is a CARD16 (not CARD8 like the rest) */
 | 
						|
    if (length > UINT16_MAX)
 | 
						|
	return FALSE;
 | 
						|
 | 
						|
    newData = (CARD8Ptr) xmalloc(length * sizeof (CARD8));
 | 
						|
    if (!newData)
 | 
						|
	return FALSE;
 | 
						|
    array->length = (CARD16) length;
 | 
						|
    array->data = newData;
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
XdmcpAllocARRAY16 (ARRAY16Ptr array, int length)
 | 
						|
{
 | 
						|
    CARD16Ptr	newData;
 | 
						|
 | 
						|
    /* length defined in ARRAY16 struct is a CARD8 */
 | 
						|
    if (length > UINT8_MAX)
 | 
						|
	return FALSE;
 | 
						|
 | 
						|
    newData = (CARD16Ptr) xmalloc(length * sizeof (CARD16));
 | 
						|
    if (!newData)
 | 
						|
	return FALSE;
 | 
						|
    array->length = (CARD8) length;
 | 
						|
    array->data = newData;
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
XdmcpAllocARRAY32 (ARRAY32Ptr array, int length)
 | 
						|
{
 | 
						|
    CARD32Ptr	newData;
 | 
						|
 | 
						|
    /* length defined in ARRAY32 struct is a CARD8 */
 | 
						|
    if (length > UINT8_MAX)
 | 
						|
	return FALSE;
 | 
						|
 | 
						|
    newData = (CARD32Ptr) xmalloc(length * sizeof (CARD32));
 | 
						|
    if (!newData)
 | 
						|
	return FALSE;
 | 
						|
    array->length = (CARD8) length;
 | 
						|
    array->data = newData;
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
XdmcpAllocARRAYofARRAY8 (ARRAYofARRAY8Ptr array, int length)
 | 
						|
{
 | 
						|
    ARRAY8Ptr	newData;
 | 
						|
 | 
						|
    /* length defined in ARRAYofARRAY8 struct is a CARD8 */
 | 
						|
    if (length > UINT8_MAX)
 | 
						|
	return FALSE;
 | 
						|
 | 
						|
    newData = (ARRAY8Ptr) xmalloc(length * sizeof (ARRAY8));
 | 
						|
    if (!newData)
 | 
						|
	return FALSE;
 | 
						|
    array->length = (CARD8) length;
 | 
						|
    array->data = newData;
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
XdmcpARRAY8Equal (const ARRAY8Ptr array1, const ARRAY8Ptr array2)
 | 
						|
{
 | 
						|
    if (array1->length != array2->length)
 | 
						|
	return FALSE;
 | 
						|
    if (memcmp(array1->data, array2->data, array1->length) != 0)
 | 
						|
	return FALSE;
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
XdmcpCopyARRAY8 (const ARRAY8Ptr src, ARRAY8Ptr dst)
 | 
						|
{
 | 
						|
    dst->length = src->length;
 | 
						|
    dst->data = (CARD8 *) xmalloc(dst->length * sizeof (CARD8));
 | 
						|
    if (!dst->data)
 | 
						|
	return FALSE;
 | 
						|
    memmove (dst->data, src->data, src->length * sizeof (CARD8));
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
XdmcpReallocARRAY8 (ARRAY8Ptr array, int length)
 | 
						|
{
 | 
						|
    CARD8Ptr	newData;
 | 
						|
 | 
						|
    /* length defined in ARRAY8 struct is a CARD16 (not CARD8 like the rest) */
 | 
						|
    if (length > UINT16_MAX)
 | 
						|
	return FALSE;
 | 
						|
 | 
						|
    newData = (CARD8Ptr) xrealloc(array->data, length * sizeof (CARD8));
 | 
						|
    if (!newData)
 | 
						|
	return FALSE;
 | 
						|
    array->length = (CARD16) length;
 | 
						|
    array->data = newData;
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
XdmcpReallocARRAYofARRAY8 (ARRAYofARRAY8Ptr array, int length)
 | 
						|
{
 | 
						|
    ARRAY8Ptr	newData;
 | 
						|
 | 
						|
    /* length defined in ARRAYofARRAY8 struct is a CARD8 */
 | 
						|
    if (length > UINT8_MAX)
 | 
						|
	return FALSE;
 | 
						|
 | 
						|
    newData = (ARRAY8Ptr) xrealloc(array->data, length * sizeof (ARRAY8));
 | 
						|
    if (!newData)
 | 
						|
	return FALSE;
 | 
						|
    array->length = (CARD8) length;
 | 
						|
    array->data = newData;
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
XdmcpReallocARRAY16 (ARRAY16Ptr array, int length)
 | 
						|
{
 | 
						|
    CARD16Ptr	newData;
 | 
						|
 | 
						|
    /* length defined in ARRAY16 struct is a CARD8 */
 | 
						|
    if (length > UINT8_MAX)
 | 
						|
	return FALSE;
 | 
						|
    newData = (CARD16Ptr) xrealloc(array->data, length * sizeof (CARD16));
 | 
						|
    if (!newData)
 | 
						|
	return FALSE;
 | 
						|
    array->length = (CARD8) length;
 | 
						|
    array->data = newData;
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
int
 | 
						|
XdmcpReallocARRAY32 (ARRAY32Ptr array, int length)
 | 
						|
{
 | 
						|
    CARD32Ptr	newData;
 | 
						|
 | 
						|
    /* length defined in ARRAY32 struct is a CARD8 */
 | 
						|
    if (length > UINT8_MAX)
 | 
						|
	return FALSE;
 | 
						|
 | 
						|
    newData = (CARD32Ptr) xrealloc(array->data, length * sizeof (CARD32));
 | 
						|
    if (!newData)
 | 
						|
	return FALSE;
 | 
						|
    array->length = (CARD8) length;
 | 
						|
    array->data = newData;
 | 
						|
    return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
XdmcpDisposeARRAY8 (ARRAY8Ptr array)
 | 
						|
{
 | 
						|
    free(array->data);
 | 
						|
    array->length = 0;
 | 
						|
    array->data = NULL;
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
XdmcpDisposeARRAY16 (ARRAY16Ptr array)
 | 
						|
{
 | 
						|
    free(array->data);
 | 
						|
    array->length = 0;
 | 
						|
    array->data = NULL;
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
XdmcpDisposeARRAY32 (ARRAY32Ptr array)
 | 
						|
{
 | 
						|
    free(array->data);
 | 
						|
    array->length = 0;
 | 
						|
    array->data = NULL;
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
XdmcpDisposeARRAYofARRAY8 (ARRAYofARRAY8Ptr array)
 | 
						|
{
 | 
						|
    int	i;
 | 
						|
 | 
						|
    if (array->data != NULL) {
 | 
						|
	for (i = 0; i < (int)array->length; i++)
 | 
						|
	    XdmcpDisposeARRAY8 (&array->data[i]);
 | 
						|
	free(array->data);
 | 
						|
    }
 | 
						|
    array->length = 0;
 | 
						|
    array->data = NULL;
 | 
						|
}
 |