Warn if flags is signed instead of unsigned (bug #3279)

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@4713 65c4cc65-6c06-0410-ace0-fbb531ad65f3
1.2-netsec
Mark Spencer 21 years ago
parent 17acbf1e38
commit 87c9e1db33

@ -183,7 +183,7 @@ struct localuser {
int stillgoing; int stillgoing;
int metric; int metric;
int oldstatus; int oldstatus;
int flags; /* flag bits */ unsigned int flags; /* flag bits */
time_t lastcall; time_t lastcall;
struct member *member; struct member *member;
struct localuser *next; struct localuser *next;
@ -224,7 +224,7 @@ struct ast_call_queue {
char moh[80]; /* Name of musiconhold to be used */ char moh[80]; /* Name of musiconhold to be used */
char announce[80]; /* Announcement to play when call is answered */ char announce[80]; /* Announcement to play when call is answered */
char context[80]; /* Context for this queue */ char context[80]; /* Context for this queue */
int flags; /* flag bits */ unsigned int flags; /* flag bits */
int strategy; /* Queueing strategy */ int strategy; /* Queueing strategy */
int announcefrequency; /* How often to announce their position */ int announcefrequency; /* How often to announce their position */
int roundingseconds; /* How many seconds do we round to? */ int roundingseconds; /* How many seconds do we round to? */

@ -157,7 +157,7 @@ struct ast_vm_user {
char dialout[80]; char dialout[80];
char uniqueid[20]; /* Unique integer identifier */ char uniqueid[20]; /* Unique integer identifier */
char exit[80]; char exit[80];
int flags; /* VM_ flags */ unsigned int flags; /* VM_ flags */
int saydurationm; int saydurationm;
struct ast_vm_user *next; struct ast_vm_user *next;
}; };

@ -218,7 +218,7 @@ struct ast_channel {
unsigned int pickupgroup; unsigned int pickupgroup;
/*! channel flags of AST_FLAG_ type */ /*! channel flags of AST_FLAG_ type */
int flags; unsigned int flags;
/*! For easy linking */ /*! For easy linking */
struct ast_channel *next; struct ast_channel *next;
@ -251,7 +251,7 @@ struct ast_bridge_config {
char *end_sound; char *end_sound;
char *start_sound; char *start_sound;
int firstpass; int firstpass;
int flags; unsigned int flags;
}; };
struct chanmon; struct chanmon;

@ -18,19 +18,76 @@
#include <asterisk/lock.h> #include <asterisk/lock.h>
#include <limits.h> #include <limits.h>
#define ast_test_flag(p,flag) ((p)->flags & (flag)) /* Note:
It is very important to use only unsigned variables to hold
#define ast_set_flag(p,flag) ((p)->flags |= (flag)) bit flags, as otherwise you can fall prey to the compiler's
sign-extension antics if you try to use the top two bits in
#define ast_clear_flag(p,flag) ((p)->flags &= ~(flag)) your variable.
#define ast_copy_flags(dest,src,flagz) do { (dest)->flags &= ~(flagz); \ The flag macros below use a set of compiler tricks to verify
(dest)->flags |= ((src)->flags & (flagz)); } while(0) that the caller is using an "unsigned int" variable to hold
the flags, and nothing else. If the caller uses any other
#define ast_set2_flag(p,value,flag) ((value) ? ast_set_flag(p,flag) : ast_clear_flag(p,flag)) type of variable, a warning message similar to this:
warning: comparison of distinct pointer types lacks cast
will be generated.
The "dummy" variable below is used to make these comparisons.
Also note that at -O2 or above, this type-safety checking
does _not_ produce any additional object code at all.
*/
extern unsigned int __unsigned_int_flags_dummy;
#define ast_test_flag(p,flag) ({ \
typeof ((p)->flags) __p = (p)->flags; \
typeof (__unsigned_int_flags_dummy) __x = 0; \
(void) (&__p == &__x); \
((p)->flags & (flag)); \
})
#define ast_set_flag(p,flag) do { \
typeof ((p)->flags) __p = (p)->flags; \
typeof (__unsigned_int_flags_dummy) __x = 0; \
(void) (&__p == &__x); \
((p)->flags |= (flag)); \
} while(0)
#define ast_clear_flag(p,flag) do { \
typeof ((p)->flags) __p = (p)->flags; \
typeof (__unsigned_int_flags_dummy) __x = 0; \
(void) (&__p == &__x); \
((p)->flags &= ~(flag)); \
} while(0)
#define ast_copy_flags(dest,src,flagz) do { \
typeof ((dest)->flags) __d = (dest)->flags; \
typeof ((src)->flags) __s = (src)->flags; \
typeof (__unsigned_int_flags_dummy) __x = 0; \
(void) (&__d == &__x); \
(void) (&__s == &__x); \
(dest)->flags &= ~(flagz); \
(dest)->flags |= ((src)->flags & (flagz)); \
} while (0)
#define ast_set2_flag(p,value,flag) do { \
typeof ((p)->flags) __p = (p)->flags; \
typeof (__unsigned_int_flags_dummy) __x = 0; \
(void) (&__p == &__x); \
if (value) \
(p)->flags |= (flag); \
else \
(p)->flags &= ~(flag); \
} while (0)
#define AST_FLAGS_ALL UINT_MAX #define AST_FLAGS_ALL UINT_MAX
struct ast_flags {
unsigned int flags;
};
static inline int ast_strlen_zero(const char *s) static inline int ast_strlen_zero(const char *s)
{ {
return (*s == '\0'); return (*s == '\0');
@ -41,10 +98,6 @@ struct ast_hostent {
char buf[1024]; char buf[1024];
}; };
struct ast_flags {
unsigned int flags;
};
extern char *ast_strip(char *buf); extern char *ast_strip(char *buf);
extern struct hostent *ast_gethostbyname(const char *host, struct ast_hostent *hp); extern struct hostent *ast_gethostbyname(const char *host, struct ast_hostent *hp);
extern int ast_base64encode(char *dst, unsigned char *src, int srclen, int max); extern int ast_base64encode(char *dst, unsigned char *src, int srclen, int max);

Loading…
Cancel
Save