Work-around for compilers that turn on "-Wformat=2" by default. This is an

ill-advised choice, as this particular compiler options has a tendency to
generate a lot of false positives.


git-svn-id: https://shellinabox.googlecode.com/svn/trunk@62 0da03de8-d603-11dd-86c2-0f8696b7b6f9
This commit is contained in:
zodiac 2009-02-15 20:01:53 +00:00
parent 9dd2367209
commit 11d1a710f2
9 changed files with 27 additions and 13 deletions

View file

@ -56,6 +56,8 @@
#define HTTP_SUSPEND 3 #define HTTP_SUSPEND 3
#define HTTP_PARTIAL_REPLY 4 #define HTTP_PARTIAL_REPLY 4
#define NO_MSG "\001"
#define NOINTR(x) ({ int i__; while ((i__ = (x)) < 0 && errno == EINTR); i__;}) #define NOINTR(x) ({ int i__; while ((i__ = (x)) < 0 && errno == EINTR); i__;})
typedef struct HashMap HashMap; typedef struct HashMap HashMap;

View file

@ -63,8 +63,6 @@
#define MAX_HEADER_LENGTH (64<<10) #define MAX_HEADER_LENGTH (64<<10)
#define CONNECTION_TIMEOUT (10*60) #define CONNECTION_TIMEOUT (10*60)
static const char *NO_MSG;
static int httpPromoteToSSL(struct HttpConnection *http, const char *buf, static int httpPromoteToSSL(struct HttpConnection *http, const char *buf,
int len) { int len) {
if (http->ssl->enabled && !http->sslHndl) { if (http->ssl->enabled && !http->sslHndl) {
@ -1253,7 +1251,7 @@ void httpSendReply(struct HttpConnection *http, int code,
char *body; char *body;
char *title = code != 200 ? stringPrintf(NULL, "%d %s", code, msg) : NULL; char *title = code != 200 ? stringPrintf(NULL, "%d %s", code, msg) : NULL;
char *details = NULL; char *details = NULL;
if (fmt != NULL) { if (fmt != NULL && strcmp(fmt, NO_MSG)) {
va_list ap; va_list ap;
va_start(ap, fmt); va_start(ap, fmt);
details = vStringPrintf(NULL, fmt, ap); details = vStringPrintf(NULL, fmt, ap);
@ -1274,7 +1272,7 @@ void httpSendReply(struct HttpConnection *http, int code,
"%s\n" "%s\n"
"</body>\n" "</body>\n"
"</html>\n", "</html>\n",
title ? title : msg, fmt ? details : msg); title ? title : msg, fmt && strcmp(fmt, NO_MSG) ? details : msg);
free(details); free(details);
free(title); free(title);
char *response = NULL; char *response = NULL;

View file

@ -60,6 +60,8 @@
#define HTTP_SUSPEND 3 #define HTTP_SUSPEND 3
#define HTTP_PARTIAL_REPLY 4 #define HTTP_PARTIAL_REPLY 4
#define NO_MSG "\001"
struct HttpConnection { struct HttpConnection {
struct Server *server; struct Server *server;
struct ServerConnection *connection; struct ServerConnection *connection;

View file

@ -68,8 +68,6 @@
// API should be used, instead. // API should be used, instead.
#define MAX_PAYLOAD_LENGTH (64<<10) #define MAX_PAYLOAD_LENGTH (64<<10)
static const char *NO_MSG;
time_t currentTime; time_t currentTime;
struct PayLoad { struct PayLoad {

View file

@ -335,7 +335,8 @@ static int sslSNICallback(SSL *sslHndl, int *al, struct SSLSupport *ssl) {
if (context == NULL) { if (context == NULL) {
check(context = SSL_CTX_new(SSLv23_server_method())); check(context = SSL_CTX_new(SSLv23_server_method()));
check(ssl->sniCertificatePattern); check(ssl->sniCertificatePattern);
char *certificate = stringPrintf(NULL, ssl->sniCertificatePattern, char *certificate = stringPrintfUnchecked(NULL,
ssl->sniCertificatePattern,
serverName); serverName);
if (!SSL_CTX_use_certificate_file(context, certificate, SSL_FILETYPE_PEM)|| if (!SSL_CTX_use_certificate_file(context, certificate, SSL_FILETYPE_PEM)||
!SSL_CTX_use_PrivateKey_file(context, certificate, SSL_FILETYPE_PEM) || !SSL_CTX_use_PrivateKey_file(context, certificate, SSL_FILETYPE_PEM) ||

View file

@ -178,3 +178,6 @@ char *stringPrintf(char *buf, const char *fmt, ...) {
va_end(ap); va_end(ap);
return s; return s;
} }
char *stringPrintfUnchecked(char *buf, const char *fmt, ...)
__attribute__((alias("stringPrintf")));

View file

@ -89,5 +89,6 @@ void logSetLogLevel(int level);
char *vStringPrintf(char *buf, const char *fmt, va_list ap); char *vStringPrintf(char *buf, const char *fmt, va_list ap);
char *stringPrintf(char *buf, const char *fmt, ...) char *stringPrintf(char *buf, const char *fmt, ...)
__attribute__((format(printf, 2, 3))); __attribute__((format(printf, 2, 3)));
char *stringPrintfUnchecked(char *buf, const char *fmt, ...);
#endif /* LOGGING_H__ */ #endif /* LOGGING_H__ */

View file

@ -59,8 +59,6 @@
#include "libhttp/server.h" #include "libhttp/server.h"
#include "logging/logging.h" #include "logging/logging.h"
static const char *NO_MSG;
static int externalFileHttpHandler(HttpConnection *http, void *arg, static int externalFileHttpHandler(HttpConnection *http, void *arg,
const char *buf, int len) { const char *buf, int len) {
checkGraveyard(); checkGraveyard();

View file

@ -52,6 +52,7 @@
#include <limits.h> #include <limits.h>
#include <locale.h> #include <locale.h>
#include <poll.h> #include <poll.h>
#include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
@ -75,8 +76,6 @@
#define PORTNUM 4200 #define PORTNUM 4200
#define MAX_RESPONSE 2048 #define MAX_RESPONSE 2048
static const char *NO_MSG;
static int port; static int port;
static int portMin; static int portMin;
static int portMax; static int portMax;
@ -155,6 +154,18 @@ static char *jsonEscape(const char *buf, int len) {
return result; return result;
} }
static int printfUnchecked(const char *format, ...) {
// Some Linux distributions enable -Wformat=2 by default. This is a
// very unfortunate decision, as that option generates a lot of false
// positives. We try to work around the problem by defining an unchecked
// version of "printf()"
va_list ap;
va_start(ap, format);
int rc = vprintf(format, ap);
va_end(ap);
return rc;
}
static int completePendingRequest(struct Session *session, static int completePendingRequest(struct Session *session,
const char *buf, int len, int maxLength) { const char *buf, int len, int maxLength) {
// If there is no pending HTTP request, save the data and return // If there is no pending HTTP request, save the data and return
@ -970,7 +981,7 @@ int main(int argc, char * const argv[]) {
"X-ShellInABox-Pid: %d\r\n" "X-ShellInABox-Pid: %d\r\n"
"Content-type: text/html; charset=utf-8\r\n\r\n", "Content-type: text/html; charset=utf-8\r\n\r\n",
port, pid); port, pid);
printf(cgiRoot, port, cgiSessionKey); printfUnchecked(cgiRoot, port, cgiSessionKey);
fflush(stdout); fflush(stdout);
free(cgiRoot); free(cgiRoot);
check(!NOINTR(close(fds[1]))); check(!NOINTR(close(fds[1])));