apinames: Fix a buffer overrun for VMS platform.

Some output formats may rewrite symbol names during the output,
like the concatenation of "64__" suffix on VMS.  To estimate
sufficient size to store symbol name, pass the output format
info to `names_add`.  For VMS, `names_add` allocates longer
buffer to append "64__".

* apinames.c (SUFFIX_VMS_64ADDR): New macro of "64__".
(main): Pass the format info to `read_header_file`.
(read_header_file): Pass the format info to `names_add`.
(names_add): Receive the format info, and reserve the symbol
name buffer 4 byte longer in the case of VMS, to append the
suffix in `names_dump`.
This commit is contained in:
suzuki toshiya 2024-10-13 10:20:42 +09:00
parent 26b545f368
commit 5f20c89215

View File

@ -42,6 +42,7 @@ typedef enum OutputFormat_
} OutputFormat;
#define SUFFIX_VMS_64ADDR "64__"
static void
panic( const char* fmt,
@ -76,11 +77,12 @@ static int max_names;
static void
names_add( const char* name,
const char* end )
names_add( const char* name,
const char* end,
OutputFormat format )
{
unsigned int h;
int nn, len;
int nn, len, len_suffix;
Name nm;
@ -116,8 +118,18 @@ names_add( const char* name,
}
nm = &the_names[num_names++];
switch ( format )
{
case OUTPUT_VMS_OPT:
/* VMS mode would join the symbol name with a suffix */
len_suffix = sizeof ( SUFFIX_VMS_64ADDR );
break;
default:
len_suffix = 0;
}
nm->hash = h;
nm->name = (char*)malloc( len + 1 );
nm->name = (char*)malloc( len + len_suffix + 1 );
if ( !nm->name )
panic( "not enough memory" );
@ -229,7 +241,7 @@ names_dump( FILE* out,
/* Also emit a 64-bit symbol, as created by the `vms_auto64` tool. */
/* It has the string '64__' appended to its name. */
strcat( the_names[nn].name , "64__" );
strcat( the_names[nn].name , SUFFIX_VMS_64ADDR );
if ( vms_shorten_symbol( the_names[nn].name, short_symbol, 1 ) == -1 )
panic( "could not shorten name '%s'", the_names[nn].name );
fprintf( out, "symbol_vector = ( %s = PROCEDURE)\n", short_symbol );
@ -277,8 +289,9 @@ typedef enum State_
static int
read_header_file( FILE* file,
int verbose )
read_header_file( FILE* file,
int verbose,
OutputFormat format )
{
static char buff[LINEBUFF_SIZE + 1];
State state = STATE_START;
@ -350,7 +363,7 @@ read_header_file( FILE* file,
if ( verbose )
fprintf( stderr, ">>> %.*s\n", (int)( p - name ), name );
names_add( name, p );
names_add( name, p, format );
}
state = STATE_START;
@ -519,7 +532,7 @@ main( int argc,
} /* end of while loop */
if ( from_stdin )
read_header_file( stdin, verbose );
read_header_file( stdin, verbose, format );
else
{
for ( --argc, argv++; argc > 0; argc--, argv++ )
@ -534,7 +547,7 @@ main( int argc,
if ( verbose )
fprintf( stderr, "opening '%s'\n", argv[0] );
read_header_file( file, verbose );
read_header_file( file, verbose, format );
fclose( file );
}
}