]> granicus.if.org Git - pgbouncer/commitdiff
proper usage of flexible array
authorMarko Kreen <markokr@gmail.com>
Fri, 4 Jan 2008 07:57:01 +0000 (07:57 +0000)
committerMarko Kreen <markokr@gmail.com>
Fri, 4 Jan 2008 07:57:01 +0000 (07:57 +0000)
include/bouncer.h
include/sbuf.h
include/system.h
src/main.c
src/sbuf.c

index ff02358033ddcdb335df1abf4fb8a0223506278d..47dfdb926577e825ee942ab9518f6a58968c29f7 100644 (file)
@@ -257,7 +257,8 @@ struct PgSocket {
        SBuf            sbuf;           /* stream buffer, must be last */
 };
 
-#define PG_SOCKET_SIZE (sizeof(PgSocket) + cf_sbuf_len + SBUF_MAX_REWRITE)
+#define RAW_SOCKET_SIZE offsetof(struct PgSocket, sbuf.buf)
+#define PG_SOCKET_SIZE (RAW_SOCKET_SIZE + cf_sbuf_len + SBUF_MAX_REWRITE)
 
 /* where to store old fd info during SHOW FDS result processing */
 #define tmp_sk_oldfd   request_time
index 18a2c743179ee426030b798d1c39f748ec211814..b21e5bab164df747d71ae057385e83012943234a 100644 (file)
@@ -85,9 +85,11 @@ struct SBuf {
 
        SBuf *dst;              /* target SBuf for current packet */
 
-       uint8_t buf[0];         /* data buffer follows (cf_sbuf_len + SBUF_MAX_REWRITE) */
+       uint8_t buf[FLEX_ARRAY];/* data buffer follows (cf_sbuf_len + SBUF_MAX_REWRITE) */
 };
 
+#define RAW_SBUF_SIZE offsetof(struct SBuf, buf)
+
 #define sbuf_socket(sbuf) ((sbuf)->sock)
 
 void sbuf_init(SBuf *sbuf, sbuf_cb_t proto_fn, void *arg);
index 58568ed03e0d93fa17245f3e892762b5cf69fb9b..0838101948c592a6c971d19cccb87e04831fe19f 100644 (file)
 #include <crypt.h>
 #endif
 
+/* how to specify array with unknown length */
+#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
+#define FLEX_ARRAY
+#elif defined(__GNUC__)
+#define FLEX_ARRAY
+#else
+#define FLEX_ARRAY 1
+#endif
+
 /* gcc has hew positive aspects too */
 #ifdef __GNUC__
 
index 9a3d3e78af41c45b3c4082256f0d0c52490afcec..38f4773f9313a590c2cd1e9e6a2231e5e41c727e 100644 (file)
@@ -435,9 +435,8 @@ static void check_limits(void)
        List *item;
        PgDatabase *db;
 
-       log_noise("event: %lu, SBuf: %lu, PgSocket: %lu, Full PgSocket: %lu, buf ofs: %lu",
-                 sizeof(struct event), sizeof(SBuf), sizeof(PgSocket),
-                 PG_SOCKET_SIZE, offsetof(SBuf, buf));
+       log_noise("event: %lu, SBuf: %lu, PgSocket: %lu, Full PgSocket: %lu",
+                 sizeof(struct event), RAW_SBUF_SIZE, RAW_SOCKET_SIZE, PG_SOCKET_SIZE);
 
        /* load limits */
        err = getrlimit(RLIMIT_NOFILE, &lim);
index c1662efce3ccafbd08267c2216d959fd424ea331..7b66739724329281ba8d2768138a068b3278d248 100644 (file)
@@ -71,7 +71,7 @@ static bool sbuf_after_connect_check(SBuf *sbuf)  _MUSTCHECK;
 /* initialize SBuf with proto handler */
 void sbuf_init(SBuf *sbuf, sbuf_cb_t proto_fn, void *arg)
 {
-       memset(sbuf, 0, sizeof(*sbuf));
+       memset(sbuf, 0, RAW_SBUF_SIZE);
        sbuf->proto_cb_arg = arg;
        sbuf->proto_cb = proto_fn;
 }