Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[makefile] Add -Wformat-nonliteral as an extra warning category
-Wformat-nonliteral is not enabled by -Wall and needs to be explicitly
 specified.

Modified the few files that use nonliteral format strings to work with
this new setting in place.

Inspired by a patch from Carl Karsten <carl@personnelware.com> and an
identical patch from Rorschach <r0rschach@lavabit.com>.
  • Loading branch information
Michael Brown committed Oct 10, 2008
1 parent ac663cf commit 2e81223
Show file tree
Hide file tree
Showing 6 changed files with 47 additions and 26 deletions.
2 changes: 1 addition & 1 deletion src/Makefile.housekeeping
Expand Up @@ -265,7 +265,7 @@ ifdef BIN
#
CFLAGS += -I include -I arch/$(ARCH)/include -I .
CFLAGS += -Os -ffreestanding
CFLAGS += -Wall -W
CFLAGS += -Wall -W -Wformat-nonliteral
CFLAGS += -g
CFLAGS += $(EXTRA_CFLAGS)
ASFLAGS += $(EXTRA_ASFLAGS)
Expand Down
2 changes: 1 addition & 1 deletion src/drivers/net/3c595.c
Expand Up @@ -363,7 +363,7 @@ vxgetlink(void)
if (n > 0) {
printf("/");
}
printf(conn_tab[k].name);
printf("%s", conn_tab[k].name );
n++;
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/drivers/net/forcedeth.c
Expand Up @@ -452,7 +452,7 @@ static int reg_delay(int offset, u32 mask,
delaymax -= delay;
if (delaymax < 0) {
if (msg)
printf(msg);
printf("%s", msg);
return 1;
}
} while ((readl(base + offset) & mask) != target);
Expand Down
2 changes: 1 addition & 1 deletion src/drivers/net/via-rhine.c
Expand Up @@ -1008,7 +1008,7 @@ rhine_probe1 (struct nic *nic, struct pci_device *pci, int ioaddr, int chip_id,
unsigned char mode3_reg;

if (rhine_debug > 0 && did_version++ == 0)
printf (version);
printf ("%s",version);

// get revision id.
pci_read_config_byte(pci, PCI_REVISION, &revision_id);
Expand Down
4 changes: 2 additions & 2 deletions src/include/gpxe/xfer.h
Expand Up @@ -149,8 +149,8 @@ extern int xfer_deliver_raw ( struct xfer_interface *xfer,
const void *data, size_t len );
extern int xfer_vprintf ( struct xfer_interface *xfer,
const char *format, va_list args );
extern int xfer_printf ( struct xfer_interface *xfer,
const char *format, ... );
extern int __attribute__ (( format ( printf, 2, 3 ) ))
xfer_printf ( struct xfer_interface *xfer, const char *format, ... );
extern int xfer_seek ( struct xfer_interface *xfer, off_t offset, int whence );

extern void ignore_xfer_close ( struct xfer_interface *xfer, int rc );
Expand Down
61 changes: 41 additions & 20 deletions src/net/tcp/ftp.c
Expand Up @@ -109,23 +109,39 @@ static void ftp_done ( struct ftp_request *ftp, int rc ) {
*
*/

/** An FTP control channel string */
struct ftp_control_string {
/** Literal portion */
const char *literal;
/** Variable portion
*
* @v ftp FTP request
* @ret string Variable portion of string
*/
const char * ( *variable ) ( struct ftp_request *ftp );
};

/**
* FTP control channel strings
* Retrieve FTP pathname
*
* These are used as printf() format strings. Since only one of them
* (RETR) takes an argument, we always supply that argument to the
* snprintf() call.
* @v ftp FTP request
* @ret path FTP pathname
*/
static const char * ftp_strings[] = {
[FTP_CONNECT] = NULL,
[FTP_USER] = "USER anonymous\r\n",
[FTP_PASS] = "PASS etherboot@etherboot.org\r\n",
[FTP_TYPE] = "TYPE I\r\n",
[FTP_PASV] = "PASV\r\n",
[FTP_RETR] = "RETR %s\r\n",
[FTP_WAIT] = NULL,
[FTP_QUIT] = "QUIT\r\n",
[FTP_DONE] = NULL,
static const char * ftp_uri_path ( struct ftp_request *ftp ) {
return ftp->uri->path;
}

/** FTP control channel strings */
static struct ftp_control_string ftp_strings[] = {
[FTP_CONNECT] = { NULL, NULL },
[FTP_USER] = { "USER anonymous", NULL },
[FTP_PASS] = { "PASS etherboot@etherboot.org", NULL },
[FTP_TYPE] = { "TYPE I", NULL },
[FTP_PASV] = { "PASV", NULL },
[FTP_RETR] = { "RETR ", ftp_uri_path },
[FTP_WAIT] = { NULL, NULL },
[FTP_QUIT] = { "QUIT", NULL },
[FTP_DONE] = { NULL, NULL },
};

/**
Expand Down Expand Up @@ -178,18 +194,23 @@ static void ftp_parse_value ( char **text, uint8_t *value, size_t len ) {
*
*/
static void ftp_next_state ( struct ftp_request *ftp ) {
struct ftp_control_string *ftp_string;
const char *literal;
const char *variable;

/* Move to next state */
if ( ftp->state < FTP_DONE )
ftp->state++;

/* Send control string if needed */
if ( ftp_strings[ftp->state] != NULL ) {
DBGC ( ftp, "FTP %p sending ", ftp );
DBGC ( ftp, ftp_strings[ftp->state], ftp->uri->path );
xfer_printf ( &ftp->control, ftp_strings[ftp->state],
ftp->uri->path );
}
ftp_string = &ftp_strings[ftp->state];
literal = ftp_string->literal;
variable = ( ftp_string->variable ?
ftp_string->variable ( ftp ) : "" );
if ( literal ) {
DBGC ( ftp, "FTP %p sending %s%s\n", ftp, literal, variable );
xfer_printf ( &ftp->control, "%s%s\r\n", literal, variable );
}
}

/**
Expand Down

0 comments on commit 2e81223

Please sign in to comment.