[makefile] Add -Wformat-nonliteral as an extra warning category
authorMichael Brown <mcb30@etherboot.org>
Fri, 10 Oct 2008 17:41:24 +0000 (18:41 +0100)
committerMichael Brown <mcb30@etherboot.org>
Fri, 10 Oct 2008 17:41:24 +0000 (18:41 +0100)
-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>.

src/Makefile.housekeeping
src/drivers/net/3c595.c
src/drivers/net/forcedeth.c
src/drivers/net/via-rhine.c
src/include/gpxe/xfer.h
src/net/tcp/ftp.c

index ae0bae8..14d07fb 100644 (file)
@@ -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)
index 7138f93..198e12e 100644 (file)
@@ -363,7 +363,7 @@ vxgetlink(void)
         if (n > 0) {
           printf("/");
        }
-        printf(conn_tab[k].name);
+        printf("%s", conn_tab[k].name );
         n++;
       }
     }
index 54fadbd..a30f137 100644 (file)
@@ -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);
index fb43a92..bceaec6 100644 (file)
@@ -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);
index 9575bf6..e592fa3 100644 (file)
@@ -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 );
index 3b88f7b..82dc19c 100644 (file)
@@ -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 },
 };
 
 /**
@@ -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 );
+       }
 }
 
 /**