Skip to content

Commit a40b22a

Browse files
authored
Merge pull request #48 from haskellari/ffi-safe
Remove all unsafe FFI imports
2 parents 5a7d295 + d7a3a7d commit a40b22a

File tree

3 files changed

+64
-52
lines changed

3 files changed

+64
-52
lines changed

CHANGELOG.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,16 @@
1+
0.10.0.0
2+
--------
3+
4+
There are technicallly two breaking changes in this release,
5+
but they shouldn't affect anyone not doing anything weird.
6+
7+
- Binary parameters are passed without copying.
8+
- FFI functions are imported without `unsafe`. Most uses were incorrect.
9+
We make all calls "safe", as checking whether libpq functions do IO
10+
or may call a notifier (potentially calling back into Haskell),
11+
is virtually impossible for all versions of libpq.
12+
(The above properties are not specified in the documentation).
13+
114
0.9.5.0
215
-------
316

postgresql-libpq.cabal

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
cabal-version: 2.4
22
name: postgresql-libpq
3-
version: 0.9.5.0
4-
x-revision: 1
3+
version: 0.10.0.0
54
synopsis: low-level binding to libpq
65
description:
76
This is a binding to libpq: the C application

src/Database/PostgreSQL/LibPQ/FFI.hs

Lines changed: 50 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -35,53 +35,53 @@ foreign import capi "hs-libpq.h PQconnectStart"
3535
foreign import capi "hs-libpq.h PQconnectPoll"
3636
c_PQconnectPoll :: Ptr PGconn -> IO CInt
3737

38-
foreign import capi unsafe "hs-libpq.h PQdb"
38+
foreign import capi "hs-libpq.h PQdb"
3939
c_PQdb :: Ptr PGconn -> IO CString
4040

41-
foreign import capi unsafe "hs-libpq.h PQuser"
41+
foreign import capi "hs-libpq.h PQuser"
4242
c_PQuser :: Ptr PGconn -> IO CString
4343

44-
foreign import capi unsafe "hs-libpq.h PQpass"
44+
foreign import capi "hs-libpq.h PQpass"
4545
c_PQpass :: Ptr PGconn -> IO CString
4646

47-
foreign import capi unsafe "hs-libpq.h PQhost"
47+
foreign import capi "hs-libpq.h PQhost"
4848
c_PQhost :: Ptr PGconn -> IO CString
4949

50-
foreign import capi unsafe "hs-libpq.h PQport"
50+
foreign import capi "hs-libpq.h PQport"
5151
c_PQport :: Ptr PGconn -> IO CString
5252

53-
foreign import capi unsafe "hs-libpq.h PQoptions"
53+
foreign import capi "hs-libpq.h PQoptions"
5454
c_PQoptions :: Ptr PGconn -> IO CString
5555

56-
foreign import capi unsafe "hs-libpq.h PQbackendPID"
56+
foreign import capi "hs-libpq.h PQbackendPID"
5757
c_PQbackendPID :: Ptr PGconn -> IO CInt
5858

59-
foreign import capi unsafe "hs-libpq.h PQconnectionNeedsPassword"
59+
foreign import capi "hs-libpq.h PQconnectionNeedsPassword"
6060
c_PQconnectionNeedsPassword :: Ptr PGconn -> IO CInt
6161

62-
foreign import capi unsafe "hs-libpq.h PQconnectionUsedPassword"
62+
foreign import capi "hs-libpq.h PQconnectionUsedPassword"
6363
c_PQconnectionUsedPassword :: Ptr PGconn -> IO CInt
6464

65-
foreign import capi unsafe "hs-libpq.h PQstatus"
65+
foreign import capi "hs-libpq.h PQstatus"
6666
c_PQstatus :: Ptr PGconn -> IO CInt
6767

68-
foreign import capi unsafe "hs-libpq.h PQtransactionStatus"
68+
foreign import capi "hs-libpq.h PQtransactionStatus"
6969
c_PQtransactionStatus :: Ptr PGconn -> IO CInt
7070

7171
-- TODO: GHC #22043
7272
foreign import ccall "hs-libpq.h PQparameterStatus"
7373
c_PQparameterStatus :: Ptr PGconn -> CString -> IO CString
7474

75-
foreign import capi unsafe "hs-libpq.h PQprotocolVersion"
75+
foreign import capi "hs-libpq.h PQprotocolVersion"
7676
c_PQprotocolVersion :: Ptr PGconn -> IO CInt
7777

78-
foreign import capi unsafe "hs-libpq.h PQserverVersion"
78+
foreign import capi "hs-libpq.h PQserverVersion"
7979
c_PQserverVersion :: Ptr PGconn -> IO CInt
8080

81-
foreign import capi unsafe "hs-libpq.h PQlibVersion"
81+
foreign import capi "hs-libpq.h PQlibVersion"
8282
c_PQlibVersion :: IO CInt
8383

84-
foreign import capi unsafe "hs-libpq.h PQsocket"
84+
foreign import capi "hs-libpq.h PQsocket"
8585
c_PQsocket :: Ptr PGconn -> IO CInt
8686

8787
foreign import capi "hs-libpq.h PQerrorMessage"
@@ -99,7 +99,7 @@ foreign import capi "hs-libpq.h PQresetStart"
9999
foreign import capi "hs-libpq.h PQresetPoll"
100100
c_PQresetPoll :: Ptr PGconn -> IO CInt
101101

102-
foreign import capi unsafe "hs-libpq.h PQclientEncoding"
102+
foreign import capi "hs-libpq.h PQclientEncoding"
103103
c_PQclientEncoding :: Ptr PGconn -> IO CInt
104104

105105
-- TODO: GHC #22043
@@ -110,7 +110,7 @@ foreign import capi "hs-libpq.h PQsetClientEncoding"
110110
c_PQsetClientEncoding :: Ptr PGconn -> CString -> IO CInt
111111

112112
type PGVerbosity = CInt
113-
foreign import capi unsafe "hs-libpq.h PQsetErrorVerbosity"
113+
foreign import capi "hs-libpq.h PQsetErrorVerbosity"
114114
c_PQsetErrorVerbosity :: Ptr PGconn -> PGVerbosity -> IO PGVerbosity
115115

116116
foreign import capi "hs-libpq.h PQputCopyData"
@@ -159,22 +159,22 @@ foreign import capi "hs-libpq.h &PQfreeCancel"
159159
foreign import capi "hs-libpq.h PQcancel"
160160
c_PQcancel :: Ptr PGcancel -> CString -> CInt -> IO CInt
161161

162-
foreign import capi unsafe "hs-libpq.h PQnotifies"
162+
foreign import capi "hs-libpq.h PQnotifies"
163163
c_PQnotifies :: Ptr PGconn -> IO (Ptr Notify)
164164

165165
foreign import capi "hs-libpq.h PQconsumeInput"
166166
c_PQconsumeInput :: Ptr PGconn -> IO CInt
167167

168-
foreign import capi unsafe "hs-libpq.h PQisBusy"
168+
foreign import capi "hs-libpq.h PQisBusy"
169169
c_PQisBusy :: Ptr PGconn -> IO CInt
170170

171171
foreign import capi "hs-libpq.h PQsetnonblocking"
172172
c_PQsetnonblocking :: Ptr PGconn -> CInt -> IO CInt
173173

174-
foreign import capi unsafe "hs-libpq.h PQisnonblocking"
174+
foreign import capi "hs-libpq.h PQisnonblocking"
175175
c_PQisnonblocking :: Ptr PGconn -> IO CInt
176176

177-
foreign import capi unsafe "hs-libpq.h PQsetSingleRowMode"
177+
foreign import capi "hs-libpq.h PQsetSingleRowMode"
178178
c_PQsetSingleRowMode :: Ptr PGconn -> IO CInt
179179

180180
foreign import capi "hs-libpq.h PQgetResult"
@@ -207,67 +207,67 @@ foreign import capi "hs-libpq.h PQdescribePortal"
207207
foreign import capi "hs-libpq.h &PQclear"
208208
p_PQclear :: FunPtr (Ptr PGresult -> IO ())
209209

210-
foreign import capi unsafe "hs-libpq.h PQresultStatus"
210+
foreign import capi "hs-libpq.h PQresultStatus"
211211
c_PQresultStatus :: Ptr PGresult -> IO CInt
212212

213-
foreign import capi unsafe "hs-libpq.h PQresStatus"
213+
foreign import capi "hs-libpq.h PQresStatus"
214214
c_PQresStatus :: CInt -> IO CString
215215

216-
foreign import capi unsafe "hs-libpq.h PQresultErrorMessage"
216+
foreign import capi "hs-libpq.h PQresultErrorMessage"
217217
c_PQresultErrorMessage :: Ptr PGresult -> IO CString
218218

219219
foreign import capi "hs-libpq.h PQresultErrorField"
220220
c_PQresultErrorField :: Ptr PGresult -> CInt -> IO CString
221221

222-
foreign import capi unsafe "hs-libpq.h PQntuples"
222+
foreign import capi "hs-libpq.h PQntuples"
223223
c_PQntuples :: Ptr PGresult -> CInt
224224

225-
foreign import capi unsafe "hs-libpq.h PQnfields"
225+
foreign import capi "hs-libpq.h PQnfields"
226226
c_PQnfields :: Ptr PGresult -> CInt
227227

228-
foreign import capi unsafe "hs-libpq.h PQfname"
228+
foreign import capi "hs-libpq.h PQfname"
229229
c_PQfname :: Ptr PGresult -> CInt -> IO CString
230230

231-
foreign import capi unsafe "hs-libpq.h PQfnumber"
231+
foreign import capi "hs-libpq.h PQfnumber"
232232
c_PQfnumber :: Ptr PGresult -> CString -> IO CInt
233233

234-
foreign import capi unsafe "hs-libpq.h PQftable"
234+
foreign import capi "hs-libpq.h PQftable"
235235
c_PQftable :: Ptr PGresult -> CInt -> IO Oid
236236

237-
foreign import capi unsafe "hs-libpq.h PQftablecol"
237+
foreign import capi "hs-libpq.h PQftablecol"
238238
c_PQftablecol :: Ptr PGresult -> CInt -> IO CInt
239239

240-
foreign import capi unsafe "hs-libpq.h PQfformat"
240+
foreign import capi "hs-libpq.h PQfformat"
241241
c_PQfformat :: Ptr PGresult -> CInt -> IO CInt
242242

243-
foreign import capi unsafe "hs-libpq.h PQftype"
243+
foreign import capi "hs-libpq.h PQftype"
244244
c_PQftype :: Ptr PGresult -> CInt -> IO Oid
245245

246-
foreign import capi unsafe "hs-libpq.h PQfmod"
246+
foreign import capi "hs-libpq.h PQfmod"
247247
c_PQfmod :: Ptr PGresult -> CInt -> IO CInt
248248

249-
foreign import capi unsafe "hs-libpq.h PQfsize"
249+
foreign import capi "hs-libpq.h PQfsize"
250250
c_PQfsize :: Ptr PGresult -> CInt -> IO CInt
251251

252-
foreign import capi unsafe "hs-libpq.h PQgetvalue"
252+
foreign import capi "hs-libpq.h PQgetvalue"
253253
c_PQgetvalue :: Ptr PGresult -> CInt -> CInt -> IO CString
254254

255-
foreign import capi unsafe "hs-libpq.h PQgetisnull"
255+
foreign import capi "hs-libpq.h PQgetisnull"
256256
c_PQgetisnull :: Ptr PGresult -> CInt -> CInt -> IO CInt
257257

258-
foreign import capi unsafe "hs-libpq.h PQgetlength"
258+
foreign import capi "hs-libpq.h PQgetlength"
259259
c_PQgetlength :: Ptr PGresult -> CInt -> CInt -> IO CInt
260260

261-
foreign import capi unsafe "hs-libpq.h PQnparams"
261+
foreign import capi "hs-libpq.h PQnparams"
262262
c_PQnparams :: Ptr PGresult -> IO CInt
263263

264-
foreign import capi unsafe "hs-libpq.h PQparamtype"
264+
foreign import capi "hs-libpq.h PQparamtype"
265265
c_PQparamtype :: Ptr PGresult -> CInt -> IO Oid
266266

267-
foreign import capi unsafe "hs-libpq.h PQcmdStatus"
267+
foreign import capi "hs-libpq.h PQcmdStatus"
268268
c_PQcmdStatus :: Ptr PGresult -> IO CString
269269

270-
foreign import capi unsafe "hs-libpq.h PQcmdTuples"
270+
foreign import capi "hs-libpq.h PQcmdTuples"
271271
c_PQcmdTuples :: Ptr PGresult -> IO CString
272272

273273
foreign import capi "hs-libpq.h PQescapeStringConn"
@@ -290,38 +290,38 @@ foreign import capi "hs-libpq.h PQunescapeBytea"
290290
-> Ptr CSize
291291
-> IO (Ptr Word8) -- Actually (IO (Ptr CUChar))
292292

293-
foreign import capi unsafe "hs-libpq.h PQescapeIdentifier"
293+
foreign import capi "hs-libpq.h PQescapeIdentifier"
294294
c_PQescapeIdentifier :: Ptr PGconn
295295
-> CString
296296
-> CSize
297297
-> IO CString
298298

299-
foreign import capi unsafe "hs-libpq.h &PQfreemem"
299+
foreign import capi "hs-libpq.h &PQfreemem"
300300
p_PQfreemem :: FunPtr (Ptr a -> IO ())
301301

302-
foreign import capi unsafe "hs-libpq.h PQfreemem"
302+
foreign import capi "hs-libpq.h PQfreemem"
303303
c_PQfreemem :: Ptr a -> IO ()
304304

305305
-------------------------------------------------------------------------------
306306
-- FFI imports: noticebuffers
307307
-------------------------------------------------------------------------------
308308

309-
foreign import capi unsafe "hs-libpq.h hs_postgresql_libpq_malloc_noticebuffer"
309+
foreign import capi "hs-libpq.h hs_postgresql_libpq_malloc_noticebuffer"
310310
c_malloc_noticebuffer :: IO (Ptr CNoticeBuffer)
311311

312-
foreign import capi unsafe "hs-libpq.h hs_postgresql_libpq_free_noticebuffer"
312+
foreign import capi "hs-libpq.h hs_postgresql_libpq_free_noticebuffer"
313313
c_free_noticebuffer :: Ptr CNoticeBuffer -> IO ()
314314

315-
foreign import capi unsafe "hs-libpq.h hs_postgresql_libpq_get_notice"
315+
foreign import capi "hs-libpq.h hs_postgresql_libpq_get_notice"
316316
c_get_notice :: Ptr CNoticeBuffer -> IO (Ptr PGnotice)
317317

318-
foreign import capi unsafe "hs-libpq.h &hs_postgresql_libpq_discard_notices"
318+
foreign import capi "hs-libpq.h &hs_postgresql_libpq_discard_notices"
319319
p_discard_notices :: FunPtr NoticeReceiver
320320

321-
foreign import capi unsafe "hs-libpq.h &hs_postgresql_libpq_store_notices"
321+
foreign import capi "hs-libpq.h &hs_postgresql_libpq_store_notices"
322322
p_store_notices :: FunPtr NoticeReceiver
323323

324-
foreign import capi unsafe "hs-libpq.h PQsetNoticeReceiver"
324+
foreign import capi "hs-libpq.h PQsetNoticeReceiver"
325325
c_PQsetNoticeReceiver :: Ptr PGconn -> FunPtr NoticeReceiver -> Ptr CNoticeBuffer -> IO (FunPtr NoticeReceiver)
326326

327327
-------------------------------------------------------------------------------

0 commit comments

Comments
 (0)