wmail: handle allocation failures.
Check the return values of some invocations of malloc and strdup and ensure that any NULL's are handled correctly.
This commit is contained in:
parent
dbc178ec3f
commit
c4eb6d91d2
|
@ -460,8 +460,11 @@ static bool ReadString( const char *from, unsigned int line, char **to )
|
||||||
char *to_c;
|
char *to_c;
|
||||||
|
|
||||||
// disposing of "to" is up to the caller...
|
// disposing of "to" is up to the caller...
|
||||||
*to = malloc( trailingQuote - from + 1 );
|
to_c = malloc( trailingQuote - from + 1 );
|
||||||
to_c = *to;
|
if( to_c == NULL )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
*to = to_c;
|
||||||
|
|
||||||
for( c = from; c != trailingQuote; ++c )
|
for( c = from; c != trailingQuote; ++c )
|
||||||
{
|
{
|
||||||
|
@ -502,8 +505,8 @@ static bool ReadString( const char *from, unsigned int line, char **to )
|
||||||
}
|
}
|
||||||
|
|
||||||
*to_c = '\0';
|
*to_c = '\0';
|
||||||
TRACE( "ReadString read \"%s\"\n", *to );
|
|
||||||
|
|
||||||
|
TRACE( "ReadString read \"%s\"\n", *to );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -316,7 +316,7 @@ static DAProgramOption options[] =
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// prototypes
|
// prototypes
|
||||||
|
|
||||||
static void PreparePixmaps( bool freeThemFirst );
|
static int PreparePixmaps( bool freeMem );
|
||||||
static void ExitHandler( int sig );
|
static void ExitHandler( int sig );
|
||||||
static void TimedOut( void );
|
static void TimedOut( void );
|
||||||
static void CheckTimeOut( bool force );
|
static void CheckTimeOut( bool force );
|
||||||
|
@ -330,14 +330,14 @@ static void ParseMaildirFile( const char *fileName, unsigned long checksum,
|
||||||
struct stat *fileStat, bool isNewMail );
|
struct stat *fileStat, bool isNewMail );
|
||||||
static char *ParseFromField( char *buf );
|
static char *ParseFromField( char *buf );
|
||||||
static bool SkipSender( char *address );
|
static bool SkipSender( char *address );
|
||||||
static void InsertName( char *name, unsigned long checksum, flag_t flag );
|
static int InsertName( char *name, unsigned long checksum, flag_t flag );
|
||||||
static void RemoveLastName( void );
|
static void RemoveLastName( void );
|
||||||
static void ClearAllNames( void );
|
static void ClearAllNames( void );
|
||||||
static void DrawTickerX11Font( void );
|
static void DrawTickerX11Font( void );
|
||||||
static void DrawTickerBuildinFont( void );
|
static void DrawTickerBuildinFont( void );
|
||||||
static void ButtonPressed( int button, int state, int x, int y );
|
static void ButtonPressed( int button, int state, int x, int y );
|
||||||
static void ButtonReleased( int button, int state, int x, int y );
|
static void ButtonReleased( int button, int state, int x, int y );
|
||||||
static char *XpmColorLine( const char *colorName, char *colorLine,
|
static int XpmColorLine( const char *colorName, char **colorLine,
|
||||||
bool disposeLine );
|
bool disposeLine );
|
||||||
static void ReadChecksumFile( void );
|
static void ReadChecksumFile( void );
|
||||||
static void WriteChecksumFile( bool writeAll );
|
static void WriteChecksumFile( bool writeAll );
|
||||||
|
@ -476,7 +476,11 @@ int main( int argc, char **argv )
|
||||||
DAInitialize( config.display, "wmail", 64, 64, argc, argv );
|
DAInitialize( config.display, "wmail", 64, 64, argc, argv );
|
||||||
|
|
||||||
outPixmap = DAMakePixmap();
|
outPixmap = DAMakePixmap();
|
||||||
PreparePixmaps( false );
|
if( PreparePixmaps( false ) < 0 )
|
||||||
|
{
|
||||||
|
WARNING( "Cannot allocate color.\n" );
|
||||||
|
exit( EXIT_FAILURE );
|
||||||
|
}
|
||||||
|
|
||||||
if( sigaction( SIGINT, &sa, NULL ) == -1 )
|
if( sigaction( SIGINT, &sa, NULL ) == -1 )
|
||||||
{
|
{
|
||||||
|
@ -504,11 +508,17 @@ int main( int argc, char **argv )
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void PreparePixmaps( bool freeMem )
|
static int PreparePixmaps( bool freeMem )
|
||||||
{
|
{
|
||||||
// simple recoloring of the raw xpms befor creating Pixmaps of them
|
// simple recoloring of the raw xpms befor creating Pixmaps of them
|
||||||
// this works as long as you don't "touch" the images...
|
// this works as long as you don't "touch" the images...
|
||||||
|
|
||||||
|
bool freeSymColor = freeMem && ( config.colorsUsed & SYM_COLOR );
|
||||||
|
bool freeFntColor = freeMem && ( config.colorsUsed & FNT_COLOR );
|
||||||
|
bool freeBckColor = freeMem && ( config.colorsUsed & BCK_COLOR );
|
||||||
|
bool freeOffColor = freeMem && ( config.colorsUsed & OFF_COLOR );
|
||||||
|
bool freeBgrColor = freeMem && ( config.colorsUsed & BGR_COLOR );
|
||||||
|
|
||||||
#if DA_VERSION < 20030126
|
#if DA_VERSION < 20030126
|
||||||
unsigned dummy;
|
unsigned dummy;
|
||||||
#else
|
#else
|
||||||
|
@ -522,14 +532,16 @@ static void PreparePixmaps( bool freeMem )
|
||||||
*/
|
*/
|
||||||
if( config.symbolColor != NULL )
|
if( config.symbolColor != NULL )
|
||||||
{
|
{
|
||||||
symbols_xpm[2] = XpmColorLine( config.symbolColor, symbols_xpm[2],
|
if( XpmColorLine( config.symbolColor, &symbols_xpm[2], freeSymColor) < 0 )
|
||||||
freeMem && ( config.colorsUsed & SYM_COLOR ));
|
return -1;
|
||||||
|
|
||||||
config.colorsUsed |= SYM_COLOR;
|
config.colorsUsed |= SYM_COLOR;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
symbols_xpm[2] = XpmColorLine( "#20B2AA", symbols_xpm[2],
|
if( XpmColorLine( "#20B2AA", &symbols_xpm[2], freeSymColor) < 0 )
|
||||||
freeMem && ( config.colorsUsed & SYM_COLOR ));
|
return -1;
|
||||||
|
|
||||||
config.colorsUsed |= SYM_COLOR;
|
config.colorsUsed |= SYM_COLOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -538,18 +550,22 @@ static void PreparePixmaps( bool freeMem )
|
||||||
*/
|
*/
|
||||||
if( config.fontColor != NULL )
|
if( config.fontColor != NULL )
|
||||||
{
|
{
|
||||||
chars_xpm[3] = XpmColorLine( config.fontColor, chars_xpm[3],
|
if( XpmColorLine( config.fontColor, &chars_xpm[3], freeFntColor) < 0 )
|
||||||
freeMem && ( config.colorsUsed & FNT_COLOR ));
|
return -1;
|
||||||
numbers_xpm[3] = XpmColorLine( config.fontColor, numbers_xpm[3],
|
|
||||||
freeMem && ( config.colorsUsed & FNT_COLOR ));
|
if( XpmColorLine( config.fontColor, &numbers_xpm[3], freeFntColor) < 0 )
|
||||||
|
return -1;
|
||||||
|
|
||||||
config.colorsUsed |= FNT_COLOR;
|
config.colorsUsed |= FNT_COLOR;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
chars_xpm[3] = XpmColorLine( "#D3D3D3", chars_xpm[3],
|
if( XpmColorLine( "#D3D3D3", &chars_xpm[3], freeFntColor) < 0 )
|
||||||
freeMem && ( config.colorsUsed & FNT_COLOR ));
|
return -1;
|
||||||
numbers_xpm[3] = XpmColorLine( "#D3D3D3", numbers_xpm[3],
|
|
||||||
freeMem && ( config.colorsUsed & FNT_COLOR ));
|
if( XpmColorLine( "#D3D3D3", &numbers_xpm[3], freeFntColor) < 0 )
|
||||||
|
return -1;
|
||||||
|
|
||||||
config.colorsUsed |= FNT_COLOR;
|
config.colorsUsed |= FNT_COLOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -558,26 +574,34 @@ static void PreparePixmaps( bool freeMem )
|
||||||
*/
|
*/
|
||||||
if( config.backColor != NULL )
|
if( config.backColor != NULL )
|
||||||
{
|
{
|
||||||
main_xpm[3] = XpmColorLine( config.backColor, main_xpm[3],
|
if( XpmColorLine( config.backColor, &main_xpm[3], freeBckColor) < 0 )
|
||||||
freeMem && ( config.colorsUsed & BCK_COLOR ));
|
return -1;
|
||||||
symbols_xpm[3] = XpmColorLine( config.backColor, symbols_xpm[3],
|
|
||||||
freeMem && ( config.colorsUsed & BCK_COLOR ));
|
if( XpmColorLine( config.backColor, &symbols_xpm[3], freeBckColor) < 0 )
|
||||||
chars_xpm[2] = XpmColorLine( config.backColor, chars_xpm[2],
|
return -1;
|
||||||
freeMem && ( config.colorsUsed & BCK_COLOR ));
|
|
||||||
numbers_xpm[2] = XpmColorLine( config.backColor, numbers_xpm[2],
|
if( XpmColorLine( config.backColor, &chars_xpm[2], freeBckColor) < 0 )
|
||||||
freeMem && ( config.colorsUsed & BCK_COLOR ));
|
return -1;
|
||||||
|
|
||||||
|
if( XpmColorLine( config.backColor, &numbers_xpm[2], freeBckColor) < 0 )
|
||||||
|
return -1;
|
||||||
|
|
||||||
config.colorsUsed |= BCK_COLOR;
|
config.colorsUsed |= BCK_COLOR;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
main_xpm[3] = XpmColorLine( "#282828", main_xpm[3],
|
if( XpmColorLine( "#282828", &main_xpm[3], freeBckColor) < 0 )
|
||||||
freeMem && ( config.colorsUsed & BCK_COLOR ));
|
return -1;
|
||||||
symbols_xpm[3] = XpmColorLine( "#282828", symbols_xpm[3],
|
|
||||||
freeMem && ( config.colorsUsed & BCK_COLOR ));
|
if( XpmColorLine( "#282828", &symbols_xpm[3], freeBckColor) < 0 )
|
||||||
chars_xpm[2] = XpmColorLine( "#282828", chars_xpm[2],
|
return -1;
|
||||||
freeMem && ( config.colorsUsed & BCK_COLOR ));
|
|
||||||
numbers_xpm[2] = XpmColorLine( "#282828", numbers_xpm[2],
|
if( XpmColorLine( "#282828", &chars_xpm[2], freeBckColor) < 0 )
|
||||||
freeMem && ( config.colorsUsed & BCK_COLOR ));
|
return -1;
|
||||||
|
|
||||||
|
if( XpmColorLine( "#282828", &numbers_xpm[2], freeBckColor) < 0 )
|
||||||
|
return -1;
|
||||||
|
|
||||||
config.colorsUsed |= BCK_COLOR;
|
config.colorsUsed |= BCK_COLOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -586,18 +610,22 @@ static void PreparePixmaps( bool freeMem )
|
||||||
*/
|
*/
|
||||||
if( config.offlightColor != NULL )
|
if( config.offlightColor != NULL )
|
||||||
{
|
{
|
||||||
main_xpm[2] = XpmColorLine( config.offlightColor, main_xpm[2],
|
if( XpmColorLine( config.offlightColor, &main_xpm[2], freeOffColor) < 0 )
|
||||||
freeMem && ( config.colorsUsed & OFF_COLOR ));
|
return -1;
|
||||||
numbers_xpm[4] = XpmColorLine( config.offlightColor, numbers_xpm[4],
|
|
||||||
freeMem && ( config.colorsUsed & OFF_COLOR ));
|
if( XpmColorLine( config.offlightColor, &numbers_xpm[4], freeOffColor) < 0 )
|
||||||
|
return -1;
|
||||||
|
|
||||||
config.colorsUsed |= OFF_COLOR;
|
config.colorsUsed |= OFF_COLOR;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
main_xpm[2] = XpmColorLine( "#000000", main_xpm[2],
|
if( XpmColorLine( "#000000", &main_xpm[2], freeOffColor) < 0 )
|
||||||
freeMem && ( config.colorsUsed & OFF_COLOR ));
|
return -1;
|
||||||
numbers_xpm[4] = XpmColorLine( "#000000", numbers_xpm[4],
|
|
||||||
freeMem && ( config.colorsUsed & OFF_COLOR ));
|
if( XpmColorLine( "#000000", &numbers_xpm[4], freeOffColor) < 0 )
|
||||||
|
return -1;
|
||||||
|
|
||||||
config.colorsUsed |= OFF_COLOR;
|
config.colorsUsed |= OFF_COLOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -606,8 +634,9 @@ static void PreparePixmaps( bool freeMem )
|
||||||
*/
|
*/
|
||||||
if( config.backgroundColor != NULL )
|
if( config.backgroundColor != NULL )
|
||||||
{
|
{
|
||||||
main_xpm[1] = XpmColorLine( config.backgroundColor, main_xpm[1],
|
if( XpmColorLine( config.backgroundColor, &main_xpm[1], freeBgrColor) < 0 )
|
||||||
freeMem && ( config.colorsUsed & BGR_COLOR ));
|
return -1;
|
||||||
|
|
||||||
config.colorsUsed |= BGR_COLOR;
|
config.colorsUsed |= BGR_COLOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -666,6 +695,8 @@ static void PreparePixmaps( bool freeMem )
|
||||||
DASetShape( None );
|
DASetShape( None );
|
||||||
else
|
else
|
||||||
DASetShape( mainPixmap_mask );
|
DASetShape( mainPixmap_mask );
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void MarkName( unsigned long checksum )
|
static void MarkName( unsigned long checksum )
|
||||||
|
@ -1099,7 +1130,11 @@ static void ParseMBoxFile( struct stat *fileStat )
|
||||||
WARNING( "Could not parse From field\n" );
|
WARNING( "Could not parse From field\n" );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
InsertName( name, checksum, FLAG_INITIAL );
|
if ( InsertName( name, checksum, FLAG_INITIAL ) < 0 )
|
||||||
|
{
|
||||||
|
WARNING( "Could not allocate name\n" );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
++numMails;
|
++numMails;
|
||||||
fromFound = 0;
|
fromFound = 0;
|
||||||
|
@ -1152,7 +1187,12 @@ static void ParseMaildirFile( const char *fileName, unsigned long checksum,
|
||||||
WARNING( "Could not parse From field\n" );
|
WARNING( "Could not parse From field\n" );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
InsertName( name, checksum, isNewMail ? FLAG_INITIAL : FLAG_READ );
|
if ( InsertName( name, checksum,
|
||||||
|
isNewMail ? FLAG_INITIAL : FLAG_READ ) < 0 )
|
||||||
|
{
|
||||||
|
WARNING( "Could not allocate name\n" );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
//++numMails;
|
//++numMails;
|
||||||
}
|
}
|
||||||
|
@ -1388,7 +1428,7 @@ static bool SkipSender( char *address )
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void InsertName( char *name, unsigned long checksum, flag_t flag )
|
static int InsertName( char *name, unsigned long checksum, flag_t flag )
|
||||||
{
|
{
|
||||||
name_t *item;
|
name_t *item;
|
||||||
|
|
||||||
|
@ -1396,10 +1436,10 @@ static void InsertName( char *name, unsigned long checksum, flag_t flag )
|
||||||
if(( item = malloc( sizeof( name_t ))) == NULL )
|
if(( item = malloc( sizeof( name_t ))) == NULL )
|
||||||
{
|
{
|
||||||
free( name );
|
free( name );
|
||||||
return;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
item->name = name; /*strdup( name );*/
|
item->name = name;
|
||||||
item->checksum = checksum;
|
item->checksum = checksum;
|
||||||
item->flag = flag;
|
item->flag = flag;
|
||||||
item->visited = true;
|
item->visited = true;
|
||||||
|
@ -1407,6 +1447,7 @@ static void InsertName( char *name, unsigned long checksum, flag_t flag )
|
||||||
names = item;
|
names = item;
|
||||||
|
|
||||||
namesChanged = true;
|
namesChanged = true;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void RemoveLastName( void )
|
static void RemoveLastName( void )
|
||||||
|
@ -1605,29 +1646,42 @@ static void GetHexColorString( const char *colorName, char *xpmLine )
|
||||||
WARNING( "unknown colorname: \"%s\"\n", colorName );
|
WARNING( "unknown colorname: \"%s\"\n", colorName );
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *XpmColorLine( const char *colorName, char *colorLine,
|
static int XpmColorLine( const char *colorName, char **colorLine,
|
||||||
bool disposeLine )
|
bool disposeLine )
|
||||||
{
|
{
|
||||||
char *newLine = strdup( colorLine );
|
char *newLine, *from;
|
||||||
char *from = strrchr( newLine, '#' );
|
|
||||||
|
|
||||||
|
newLine = strdup( *colorLine );
|
||||||
|
if ( newLine == NULL )
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
from = strrchr( newLine, '#' );
|
||||||
if( from == NULL &&
|
if( from == NULL &&
|
||||||
strcasecmp( &colorLine[ strlen( colorLine ) - 4 ], "none" ) == 0 )
|
strcasecmp( &(*colorLine)[ strlen( *colorLine ) - 4 ], "none" ) == 0 )
|
||||||
{
|
{
|
||||||
// if no # found, it should be a None-color line
|
/*
|
||||||
|
* if no # found, it should be a None-color line
|
||||||
|
*/
|
||||||
free( newLine );
|
free( newLine );
|
||||||
newLine = malloc( 12 );
|
newLine = malloc( 12 );
|
||||||
|
if ( newLine != NULL )
|
||||||
|
{
|
||||||
strcpy( newLine, " \tc #" );
|
strcpy( newLine, " \tc #" );
|
||||||
newLine[11] = '\0';
|
newLine[11] = '\0';
|
||||||
from = newLine + 4;
|
from = newLine + 4;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( newLine == NULL)
|
||||||
|
return -1;
|
||||||
|
|
||||||
if( disposeLine )
|
if( disposeLine )
|
||||||
free( colorLine );
|
free( *colorLine );
|
||||||
|
|
||||||
GetHexColorString( colorName, from + 1 );
|
GetHexColorString( colorName, from + 1 );
|
||||||
|
|
||||||
return newLine;
|
*colorLine = newLine;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void UpdateConfiguration( void )
|
static void UpdateConfiguration( void )
|
||||||
|
@ -1651,7 +1705,8 @@ static void UpdateConfiguration( void )
|
||||||
|
|
||||||
TRACE( "mailbox is of type %s\n", isMaildir ? "maildir" : "mbox" );
|
TRACE( "mailbox is of type %s\n", isMaildir ? "maildir" : "mbox" );
|
||||||
|
|
||||||
PreparePixmaps( true );
|
if( PreparePixmaps( true ) < 0 )
|
||||||
|
WARNING( "Cannot allocate color.\n" );
|
||||||
|
|
||||||
DASetTimeout( 1000 / config.fps );
|
DASetTimeout( 1000 / config.fps );
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue