FreeCalypso > hg > fc-magnetite
view src/gpf2/inc/ccdapi.h @ 516:1ed9de6c90bd
src/g23m-gsm/sms/sms_for.c: bogus malloc removed
The new error handling code that was not present in TCS211 blob version
contains a malloc call that is bogus for 3 reasons:
1) The memory allocation in question is not needed in the first place;
2) libc malloc is used instead of one of the firmware's proper ways;
3) The memory allocation is made inside a function and then never freed,
i.e., a memory leak.
This bug was caught in gcc-built FreeCalypso fw projects (Citrine
and Selenite) because our gcc environment does not allow any use of
libc malloc (any reference to malloc produces a link failure),
but this code from TCS3.2 is wrong even for Magnetite: if this code
path is executed repeatedly over a long time, the many small allocations
made by this malloc call without a subsequent free will eventually
exhaust the malloc heap provided by the TMS470 environment, malloc will
start returning NULL, and the bogus code will treat it as an error.
Because the memory allocation in question is not needed at all,
the fix entails simply removing it.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 22 Jul 2018 06:04:49 +0000 |
parents | 864b8cc0cf63 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | Project : | Modul : ccdapi.h +----------------------------------------------------------------------------- | Copyright 2002 Texas Instruments Berlin, AG | All rights reserved. | | This file is confidential and a trade secret of Texas | Instruments Berlin, AG | The receipt of or possession of this file does not convey | any rights to reproduce or disclose its contents or to | manufacture, use, or sell anything it may describe, in | whole, or in part, without the specific written consent of | Texas Instruments Berlin, AG. +----------------------------------------------------------------------------- | Purpose : Condat Coder Decoder Application Interface | | Use this header to integrate the condat coder decoder | in your target system ! | | The application must define USE_DRIVER if CCD is | not linked but used as a driver +----------------------------------------------------------------------------- */ #ifndef CCDAPI_H #define CCDAPI_H #ifdef __cplusplus extern "C" { #endif /*_cplusplus*/ /************************************************************** Types and constants for CCD used in application, in stub1 (api) and in driver body **************************************************************/ /*==== CONSTANTS ==================================================*/ /* * constants for the direction-parameter for coding/decoding */ #define UPLINK 0 #define DOWNLINK 1 #define BOTH UPLINK /* ccd Error codes */ #define ccdOK 0 #define ccdWarning 1 #define ccdError 2 #ifdef _TOOLS_ #define CCD_DLL_ERROR 23 #endif /* _TOOLS_ */ /* reentrancy */ #define CCD_REENTRANT 0 /* * Error codes to use with ccd_setError() */ #define ERR_NO_MORE_ERROR 0 /* Returned by ccd_getFirst/NextError */ /* in case of the end of the error list */ #define ERR_INVALID_CALC 1 /* Invalid combination of calculations */ /* Error params: none */ #define ERR_PATTERN_MISMATCH 2 /* A spare pattern does not match with */ /* the specified content */ /* Error params[0] = bitposition */ #define ERR_COMPREH_REQUIRED 3 /* Comprehension of an unknown TAG */ /* required. */ /* Error params[0] = TAG */ /* [1] = bitposition */ #define ERR_IE_NOT_EXPECTED 4 /* Unknown or unexpected TAG found */ /* Error params[0] = TAG */ /* [1] = bitposition */ #define ERR_IE_SEQUENCE 5 /* A valid TAG is found but not in the */ /* defined sequence. */ /* Error params[0] = TAG */ /* [1] = bitposition */ #define ERR_MAX_IE_EXCEED 6 /* A repeatable TAG is found but it */ /* occurs more often than it is defined */ /* Error params[0] = TAG */ /* [1] = bitposition */ #define ERR_MAND_ELEM_MISS 7 /* A as mandatory defined element is */ /* not in the message */ /* Error params: none */ #define ERR_EOC_TAG_MISSING 8 /* A indefinite length is specified for */ /* an ASN.1 element but the correspond. */ /* End of Component TAG is missing */ /* Error params[0] = TAG */ /* [1] = bitposition */ #define ERR_INVALID_MID 9 /* The message starts with an undefined */ /* message identifier; more exactly: */ /* with the three given parameters mId, */ /* entity, and direction for the coding */ /* or decoding of a Message functions */ /* CCD was not able to identify the */ /* Message */ /* Error params[0] = Message ID */ #define ERR_INVALID_TYPE 10 /* The actual element has an invalid */ /* type e.g. S_PADDING without a spare */ /* Error params[0] = bitposition */ #define ERR_MAX_REPEAT 11 /* A repeatable element occurs to often */ /* in the message */ #define ERR_NO_MEM 12 /* Memory allocation failed. May result */ /* occur when using pointer types. */ /* (Dynamic array addition) */ #define ERR_ADDR_INFO_PART 13 /* CCD recognizes a message with a */ /* disallowed addressing option */ #define ERR_DISTRIB_PART 14 /* CCD recognizes an error during */ /* decoding of the message distribution */ /* part */ #define ERR_NON_DISTRIB_PART 15 /* CCD recognizes an error during */ /* decoding of the message non- */ /* distribution part */ #define ERR_MESSAGE_ESCAPE 16 /* CCD detects an unknown message part, */ /* which is marked whith a message */ /* escape error label being used to */ /* provide an escape for, e.g. a future */ /* modification of the message syntax */ #define ERR_IGNORE 17 /* CCD detects a part of the message */ /* that is syntactically incorrect and */ /* is allowed to ignore this part */ #define ERR_18 18 /* dummy to complete error list - */ /* may be used in furture enhancement */ #define ERR_19 19 /* dummy to complete error list - */ /* may be used in furture enhancement */ #define ERR_INTERNAL_ERROR 20 /* An internal error occured */ /* (hopefully not!) */ /* Error params[0] = none */ #define ERR_DEFECT_CCDDATA 21 /* The value read from a ccd table */ /* (one of the *.cdg files) is not */ /* expected by CCD, e.g. extGroup has */ /* another value than ' ', '+', '-', */ /* '!' or '#'. */ /* Error params[0] = bitposition */ /* this error code is needed only in */ /* the development phase. */ #define ERR_END_OF_BUF 22 /* According to the lenght indicator */ /* there must be more bits to read but */ /* end of bit buffer is reached */ #define ERR_INT_VALUE 23 /* Error on encoding of integer value. */ /* IE of coding type ASN1_INTEGER is */ /* out of the given range. */ #define ERR_LONG_MSG 24 /* UNUSED error code */ /* According to l_buf and due to an */ /* unknown message extension there are */ /* more bits to be decoded than CCD or */ /* ccddata expects. */ #define ERR_ASN1_ENCODING 25 /* Error on IE in the outermost level. */ #define ERR_ASN1_MAND_IE 26 /* Error on mandatory IE of type */ /* ASN1_INTEGER. The decoded value is */ /* out of the range given by the loaded */ /* ccd data tables. */ /* data tables. */ #define ERR_ASN1_OPT_IE 27 /* Error on optional IE of type. */ /* ASN1_INTEGER. The decoded value is */ /* out of the range given by the loaded */ /* ccd data tables. */ #define ERR_ASN1_COND_IE 28 /* UNUSED error code */ #define ERR_COND_ELEM_MISS 29 /* UNUSED error code */ /* Condition is met but the IE is not */ /* present in the message. */ #define ERR_BUFFER_OF 30 /* On coding, more bits were written, */ /* than the input l_buf suggested. */ #define ERR_NONCRITICAL_EXT 31 /* Warning (if decoding) or error (if */ /* encoding) on inappropriate usage of */ /* a nonCriticalExtensions element. */ /* The CCDTYPE_NONCRITICAL_EXTENSIONS */ /* says the IE is not extended yet from */ /* a CCD point of view. So it needs */ /* neither to be encoded nor decoded. */ /* In the latter case additional parts */ /* at the end the message will be */ /* ignored by CCD. Known extensions are */ /* to be encoded by CCD. */ #define ERR_CRITICAL_EXT 32 /* Error on inappropriate usage of a */ /* nonCriticalExtensions element. The */ /* CCDTYPE_CRITICAL_EXTENSIONS says */ /* the IE is not extended yet, from a */ /* CCD point of view. So it needs not */ /* to be encoded or decoded. In latter */ /* case message is not comprehendable */ /* and must be rejected. */ #define ERR_INVALID_CCDID 33 /* The ccd identifier for the element */ /* to be decoded did not result a valid */ /* data table entry. */ #define ERR_MSG_LEN 34 /* Decoding is just finished. But the */ /* CCD internal bit pointer is beyond */ /* the given message length, l_buf e.g. */ #define ERR_INVALID_PTR 35 /* Pointer used in C struct for encoding*/ /* is not valid. */ #define ERR_PROTOCOL_EXTENSION 36 /* IE of type S_PADDING_0 is preceded */ /* by 1 instead of 0. */ /* Error params[0] = CCDID */ /* [1] = bitposition */ #define ERR_BITSTR_COMP 37 /* Length of bit array encoded as */ /* composition is bigger than expected */ /* Error params[0] = CCDID */ /* [1] = addr in C-struct */ #define ERR_ELEM_LEN 38 /* The current information element's */ /* length doesn't match to the length */ /* required by its nested elements */ #define ERR_LEN_MISMATCH 39 /* The length of a superordinated */ /* doesn't match to read an GSM5_V */ /* element, which extends to the */ /* message end. */ #define ERR_CONCAT_LEN 40 /* Coding of a truncated concatenation */ /* doesn't fill the rest of message */ /* buffer.(length given by l_buf) */ #define ERR_UNEXPECT_PAD 41 /* an inchoate byte is filled with */ /* padding bits which are not expected */ #define ERR_CSN1_CHOICE 42 /* the number of CHOICE components */ /* doesn't match to number of possible */ /* alternatives */ #define MAX_CCD_ERROR 43 /* * max number of parameters per error for parlist * param ccd_getFirst/NextError */ #define MAX_ERR_PAR 3 #define CCD_ERR_KIND_PARA_LIST 1 #define CCD_ERR_KIND_IE_TYPE 2 /*==== TYPES ======================================================*/ /* * T_MSGBUF contains the coded message. * o_buf specified the * offset (in Bits), * where the message * starts in the buffer. * l_buf contains the * length (in Bits) of the coded message. * buf contains the * bitcoded message as an array of Bytes. * * (Do not modify this structure !) */ typedef struct { USHORT l_buf; USHORT o_buf; UBYTE buf [1]; } T_MSGBUF; /* * new style of error information container, used in umts */ #ifdef CCD_USE_ENUM_IDS #include "ccdid.h" /* to get enumeration for fault elements */ typedef T_CCD_ID T_ERR_INFO; #else typedef ULONG T_ERR_INFO; #endif typedef struct { T_ERR_INFO err_info; ULONG err_IEaddr; } T_CCD_ERR_TYPE; /* * old style of error information container, used in gsm/gprs */ #define MAX_ERR_PAR 3 typedef struct { UBYTE num_para; USHORT err_list[MAX_ERR_PAR]; } T_CCD_PARA_LIST; /* * union supports old and new type of error information container */ typedef union { T_CCD_PARA_LIST para_list; T_CCD_ERR_TYPE err_type; } T_CCD_ERR_PARA; /* * general structure for error information passed to CCD caller */ typedef struct { UBYTE error; UBYTE kind; T_CCD_ERR_PARA para; } T_CCD_ERR_ENTRY; /************************************************************** function codes for CCD interface functions used in stub1 (application side) and stub2 (driver side) **************************************************************/ #define CCD_INIT 1 #define CCD_CODMSG 2 #define CCD_DECMSG 3 #define CCD_DECBYTE 4 #define CCD_CODBYTE 5 #define CCD_DECLONG 6 #define CCD_CODLONG 7 #define CCD_BITCOPY 8 #define CCD_FIRST_ERR 9 #define CCD_NEXT_ERR 10 #if !defined (CCDDATA_PREF) #if defined (_TOOLS_) && defined (CCDDATA_LOAD) #define CCDDATA_PREF(ccd_fun) cddl_##ccd_fun #else #define CCDDATA_PREF(ccd_fun) ccd_fun #endif /* _TOOLS_ && CCDDATA_LOAD */ #endif /* !CCDDATA_PREF */ #if defined _TOOLS_ || defined (CCD_TEST) /* * Preparation for issue patching coded bits for generating * air messages with errors. This feature is not yet supported * by CCD. */ #define CCDP_NO_ERROR 0 #define CCDP_NOT_FOUND 1 #define CCDP_VALIDFLAG_SEEN 2 #define CCDP_UNKNOWN_ERROR 3 #define MAXREC 50 typedef struct { U16 elemid[MAXREC]; U16 numelems; U16 bitwidth; U8* bits; U8 errorcode; } T_patch_info; #endif /* _TOOLS_ */ /*==================== description ===================================*/ /* * ccd_init * * Initializing the ccd-Module, must be called once before * any encoding/decoding */ /* * ccd_begin * * Returns the address of the CCD buffer for decoded * messages and locks it until ccd_end() is called */ /* * ccd_end * * Unlocks the CCD buffer for decoded * messages */ /* * ccd_codeMsg * * layer : <IN> CCDENT_CMCE, CCDENT_MLE .. * direction: <IN> UPLINK, DOWNLINK * mBuf : <IN> mBuf.o_buf - Offset in Bits from the * start of mBuf.buf. * <OUT> mBuf.l_buf - Contains the length of * the message in Bits after * coding. * <OUT> mBuf.buf - Contains the bitcoded message * after coding. * mStruct: <IN> Pointer to the message specific structure. * The first element must contain the * message-type (PDU-Type) as a UBYTE value. * * pt : <IN> If pt != 0xff the CCD will not decode the * the PDU-Type from the bitstream. In this * case pt is the coding of the PDU-Type. */ /* * ccd_decodeMsg * * layer : <IN> CCDENT_CMCE, CCDENT_MLE, ... * direction: <IN> UPLINK, DOWNLINK * mBuf : <IN> mBuf.o_buf - Offset in Bits from start * of mBuf.buf where the * message starts. * <IN> mBuf.l_buf - Contains the length of the * message in Bits. * <IN> mBuf.buf - Contains the bitcoded message. * mStruct : <OUT> Pointer to the message specific structure. * The first element contains the message-type * (PDU-Type) as a UBYTE value after decoding. * pt : <IN> If pt != 0xff the CCD will not decode the * the PDU-Type from the bitstream. In this * case pt is the coding of the PDU-Type. */ /************************************************************** function prototypes for CCD interface functions used in application, stub2 (driver side) and driver body **************************************************************/ #ifndef CCD_PATCH_C #ifdef _TOOLS_ extern int CCDDATA_PREF(ccd_set_patch_infos) (T_patch_info* pinfo); #endif /* _TOOLS_ */ #endif /* CCD_PATCH_C */ #ifndef CCD_C extern BYTE CCDDATA_PREF(ccd_init) (void); extern int CCDDATA_PREF(ccd_exit) (void); extern UBYTE* CCDDATA_PREF(ccd_begin) (void); extern void CCDDATA_PREF(ccd_end) (void); extern BYTE CCDDATA_PREF(ccd_decodeMsg) (UBYTE entity, UBYTE direction, T_MSGBUF *mBuf, UBYTE *mStruct, UBYTE pt); extern S8 CCDDATA_PREF(ccd_decodeMsgPtr) (U8 entity, U8 direction, U16 l_buf, U16 o_buf, U8 *buf, U8 **mStructPtr, U8 pt); extern BYTE CCDDATA_PREF(ccd_codeMsg) (UBYTE entity, UBYTE direction, T_MSGBUF *mBuf, UBYTE *mStruct, UBYTE pt); extern S8 CCDDATA_PREF(ccd_codeMsgPtr) (U8 entity, U8 direction, U16 *l_buf, U16 o_buf, U8 *buf, U8 *mStruct, U8 pt); extern UBYTE ccd_setStore (ULONG regNo, ULONG value); #ifdef _TOOLS_ extern ULONG CCDDATA_PREF(ccd_init_ccddata) (void); #else extern int ccd_register (int decmsgbuf_size); #endif /* _TOOLS_ */ #endif /*! CCD_C */ #ifndef CCD_ELEM_C extern int CCDDATA_PREF(ccd_encodeElem) (ULONG ccdid, USHORT *l_buf, USHORT o_buf, UCHAR *buf, UCHAR *eStruct); extern int CCDDATA_PREF(ccd_decodeElem) (ULONG ccdid, USHORT l_buf, USHORT o_buf, UCHAR *buf, UCHAR *eStruct); #endif /* CCD_ELEM_C */ #ifndef CCD_ERR_C extern UBYTE CCDDATA_PREF(ccd_getFirstError) (UBYTE entity, USHORT *parlist); extern UBYTE CCDDATA_PREF(ccd_getNextError) (UBYTE entity, USHORT *parlist); extern ULONG CCDDATA_PREF(ccd_getFirstFault) (T_CCD_ERR_ENTRY **ccd_err_entry); extern ULONG CCDDATA_PREF(ccd_getNextFault) (T_CCD_ERR_ENTRY **ccd_err_entry); extern void CCDDATA_PREF(ccd_free_faultlist) (void); extern int CCDDATA_PREF(ccd_get_numFaults) (void); #endif /*! CCD_ERR_C */ #ifndef CDC_STD_C extern BYTE CCDDATA_PREF(ccd_decodeByte) (UBYTE *bitstream, USHORT startbit, USHORT bitlen, UBYTE *value); extern BYTE CCDDATA_PREF(ccd_codeByte) (UBYTE *bitstream, USHORT startbit, USHORT bitlen, UBYTE val); extern BYTE CCDDATA_PREF(ccd_codeLong) (UBYTE *bitstream, USHORT startbit, USHORT bitlen, ULONG value); extern BYTE CCDDATA_PREF(ccd_decodeLong) (UBYTE *bitstream, USHORT startbit, USHORT bitlen, ULONG *value); extern void CCDDATA_PREF(ccd_bitcopy) (UBYTE *dest, UBYTE *source, USHORT bitlen, USHORT offset); #endif /*! CCD_STD_C */ #ifdef __cplusplus } #endif /*_cplusplus*/ #endif