pqclear-pqfinish-set-null-v2.patch
text/x-patch
Filename: pqclear-pqfinish-set-null-v2.patch
Type: text/x-patch
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
Series: patch v2
| File | + | − |
|---|---|---|
| doc/src/sgml/libpq.sgml | 44 | 0 |
| src/interfaces/libpq/libpq-fe.h | 6 | 0 |
diff -durpN postgresql.3/doc/src/sgml/libpq.sgml postgresql.4/doc/src/sgml/libpq.sgml
--- postgresql.3/doc/src/sgml/libpq.sgml 2012-11-30 09:29:49.703286090 +0100
+++ postgresql.4/doc/src/sgml/libpq.sgml 2013-01-02 16:54:43.783565292 +0100
@@ -588,6 +588,27 @@ void PQfinish(PGconn *conn);
</listitem>
</varlistentry>
+ <varlistentry id="libpq-pqfinishsafe">
+ <term><function>PQfinishSafe</function><indexterm><primary>PQfinishSafe</></></term>
+ <listitem>
+ <para>
+ A macro that calls <function>PQfinish</function> and sets
+ the pointer to NULL afterwards.
+<synopsis>
+#define PQfinishSafe(conn) do { PQfinish(conn); conn = NULL; } while (0)
+</synopsis>
+ </para>
+
+ <para>
+ The <structname>PGconn</> pointer (being NULL) is safe to use
+ after this macro. Every function that deals with a
+ <structname>PGconn</> pointer considers a non-NULL pointer as valid.
+ Using a stale pointer may result in a crash. Setting the pointer
+ to NULL makes calling such functions a no-op instead.
+ </para>
+ </listitem>
+ </varlistentry>
+
<varlistentry id="libpq-pqreset">
<term><function>PQreset</function><indexterm><primary>PQreset</></></term>
<listitem>
@@ -2753,6 +2774,29 @@ void PQclear(PGresult *res);
</para>
</listitem>
</varlistentry>
+
+ <varlistentry id="libpq-pqclearsafe">
+ <term><function>PQclearSafe</function><indexterm><primary>PQclearSafe</></></term>
+ <listitem>
+ <para>
+ A macro to call <function>PQclear</function> and set
+ the pointer to NULL afterwards.
+<synopsis>
+#define PQclearSafe(res) do { PQclear(res); res = NULL; } while (0)
+</synopsis>
+ </para>
+
+ <para>
+ Calling <function>PQclear</function> leaves a stale
+ <structname>PGresult</structname> pointer. Calling
+ functions that deal with <structname>PGresult</structname>
+ objects afterwards may result in a crash. Setting the
+ <structname>PGresult</structname> pointer to NULL makes
+ calling such functions a no-op instead.
+ </para>
+ </listitem>
+ </varlistentry>
+
</variablelist>
</para>
</sect2>
diff -durpN postgresql.3/src/interfaces/libpq/libpq-fe.h postgresql.4/src/interfaces/libpq/libpq-fe.h
--- postgresql.3/src/interfaces/libpq/libpq-fe.h 2013-01-02 09:19:03.929522614 +0100
+++ postgresql.4/src/interfaces/libpq/libpq-fe.h 2013-01-02 16:52:41.236683245 +0100
@@ -256,6 +256,9 @@ extern PGconn *PQsetdbLogin(const char *
/* close the current connection and free the PGconn data structure */
extern void PQfinish(PGconn *conn);
+/* macro to close the current connection and set the conn pointer to NULL */
+#define PQfinishSafe(conn) do { PQfinish(conn); conn = NULL; } while (0)
+
/* get info about connection options known to PQconnectdb */
extern PQconninfoOption *PQconndefaults(void);
@@ -472,6 +475,9 @@ extern int PQsendDescribePortal(PGconn *
/* Delete a PGresult */
extern void PQclear(PGresult *res);
+/* Macro to delete a PGresult and set the res pointer to NULL */
+#define PQclearSafe(res) do { PQclear(res); res = NULL; } while (0)
+
/* For freeing other alloc'd results, such as PGnotify structs */
extern void PQfreemem(void *ptr);