Ethereal-dev: [ethereal-dev] macro expansion protection
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Jun-ichiro itojun Hagino <itojun@xxxxxxxxxx>
Date: Tue, 22 Aug 2000 16:51:43 +0900
packet.h does not have protection against macro argument evaluation. for example, if we have some code like: guint32_t *p; printf("%x", pntohl(p + 1)); it will get evaluated incorrectly. i believe we need more parens in macros, for example like this. opinions? itojun Index: packet.h =================================================================== RCS file: /usr/local/cvsroot/ethereal/packet.h,v retrieving revision 1.197 diff -c -r1.197 packet.h *** packet.h 2000/08/21 15:45:21 1.197 --- packet.h 2000/08/22 07:40:53 *************** *** 41,87 **** */ #define pntohs(p) ((guint16) \ ! ((guint16)*((guint8 *)p+0)<<8| \ ! (guint16)*((guint8 *)p+1)<<0)) ! #define pntohl(p) ((guint32)*((guint8 *)p+0)<<24| \ ! (guint32)*((guint8 *)p+1)<<16| \ ! (guint32)*((guint8 *)p+2)<<8| \ ! (guint32)*((guint8 *)p+3)<<0) #ifdef G_HAVE_GINT64 ! #define pntohll(p) ((guint64)*((guint8 *)p+0)<<56| \ ! (guint64)*((guint8 *)p+1)<<48| \ ! (guint64)*((guint8 *)p+2)<<40| \ ! (guint64)*((guint8 *)p+3)<<32| \ ! (guint64)*((guint8 *)p+4)<<24| \ ! (guint64)*((guint8 *)p+5)<<16| \ ! (guint64)*((guint8 *)p+6)<<8| \ ! (guint64)*((guint8 *)p+7)<<0) #endif #define pletohs(p) ((guint16) \ ! ((guint16)*((guint8 *)p+1)<<8| \ ! (guint16)*((guint8 *)p+0)<<0)) ! #define pletohl(p) ((guint32)*((guint8 *)p+3)<<24| \ ! (guint32)*((guint8 *)p+2)<<16| \ ! (guint32)*((guint8 *)p+1)<<8| \ ! (guint32)*((guint8 *)p+0)<<0) #ifdef G_HAVE_GINT64 ! #define pletohll(p) ((guint64)*((guint8 *)p+7)<<56| \ ! (guint64)*((guint8 *)p+6)<<48| \ ! (guint64)*((guint8 *)p+5)<<40| \ ! (guint64)*((guint8 *)p+4)<<32| \ ! (guint64)*((guint8 *)p+3)<<24| \ ! (guint64)*((guint8 *)p+2)<<16| \ ! (guint64)*((guint8 *)p+1)<<8| \ ! (guint64)*((guint8 *)p+0)<<0) #endif ! #define hi_nibble(b) ((b & 0xf0) >> 4) ! #define lo_nibble(b) (b & 0x0f) /* Useful when you have an array whose size you can tell at compile-time */ #define array_length(x) (sizeof x / sizeof x[0]) --- 41,87 ---- */ #define pntohs(p) ((guint16) \ ! ((guint16)*((guint8 *)(p)+0)<<8| \ ! (guint16)*((guint8 *)(p)+1)<<0)) ! #define pntohl(p) ((guint32)*((guint8 *)(p)+0)<<24| \ ! (guint32)*((guint8 *)(p)+1)<<16| \ ! (guint32)*((guint8 *)(p)+2)<<8| \ ! (guint32)*((guint8 *)(p)+3)<<0) #ifdef G_HAVE_GINT64 ! #define pntohll(p) ((guint64)*((guint8 *)(p)+0)<<56| \ ! (guint64)*((guint8 *)(p)+1)<<48| \ ! (guint64)*((guint8 *)(p)+2)<<40| \ ! (guint64)*((guint8 *)(p)+3)<<32| \ ! (guint64)*((guint8 *)(p)+4)<<24| \ ! (guint64)*((guint8 *)(p)+5)<<16| \ ! (guint64)*((guint8 *)(p)+6)<<8| \ ! (guint64)*((guint8 *)(p)+7)<<0) #endif #define pletohs(p) ((guint16) \ ! ((guint16)*((guint8 *)(p)+1)<<8| \ ! (guint16)*((guint8 *)(p)+0)<<0)) ! #define pletohl(p) ((guint32)*((guint8 *)(p)+3)<<24| \ ! (guint32)*((guint8 *)(p)+2)<<16| \ ! (guint32)*((guint8 *)(p)+1)<<8| \ ! (guint32)*((guint8 *)(p)+0)<<0) #ifdef G_HAVE_GINT64 ! #define pletohll(p) ((guint64)*((guint8 *)(p)+7)<<56| \ ! (guint64)*((guint8 *)(p)+6)<<48| \ ! (guint64)*((guint8 *)(p)+5)<<40| \ ! (guint64)*((guint8 *)(p)+4)<<32| \ ! (guint64)*((guint8 *)(p)+3)<<24| \ ! (guint64)*((guint8 *)(p)+2)<<16| \ ! (guint64)*((guint8 *)(p)+1)<<8| \ ! (guint64)*((guint8 *)(p)+0)<<0) #endif ! #define hi_nibble(b) (((b) & 0xf0) >> 4) ! #define lo_nibble(b) ((b) & 0x0f) /* Useful when you have an array whose size you can tell at compile-time */ #define array_length(x) (sizeof x / sizeof x[0])
- Follow-Ups:
- Re: [ethereal-dev] macro expansion protection
- From: Guy Harris
- Re: [ethereal-dev] macro expansion protection
- Prev by Date: Re: [ethereal-dev] Two "bug" reports
- Next by Date: Re: [ethereal-dev] macro expansion protection
- Previous by thread: Re: [ethereal-dev] Two "bug" reports
- Next by thread: Re: [ethereal-dev] macro expansion protection
- Index(es):