# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=889170
# needs to be submitted upstream
--- apr-util.orig/dbm/apr_dbm_gdbm.c
+++ apr-util/dbm/apr_dbm_gdbm.c
@@ -36,13 +36,22 @@
 static apr_status_t g2s(int gerr)
 {
     if (gerr == -1) {
-        /* ### need to fix this */
-        return APR_EGENERAL;
+        return APR_OS_START_USEERR + gdbm_errno;
     }
 
     return APR_SUCCESS;
 }
 
+static apr_status_t gdat2s(datum d)
+{
+    if (d.dptr == NULL) {
+        return APR_OS_START_USEERR + gdbm_errno;
+    }
+
+    return APR_SUCCESS;
+}
+
+
 static apr_status_t datum_cleanup(void *dptr)
 {
     if (dptr)
@@ -55,19 +64,15 @@ static apr_status_t set_error(apr_dbm_t
 {
     apr_status_t rv = APR_SUCCESS;
 
-    /* ### ignore whatever the DBM said (dbm_said); ask it explicitly */
-
-    if ((dbm->errcode = gdbm_errno) == GDBM_NO_ERROR) {
+    if (dbm_said == APR_SUCCESS) {
+        dbm->errcode = GDBM_NO_ERROR;
         dbm->errmsg = NULL;
     }
     else {
+        dbm->errcode = dbm_said;
         dbm->errmsg = gdbm_strerror(gdbm_errno);
-        rv = APR_EGENERAL;        /* ### need something better */
     }
 
-    /* captured it. clear it now. */
-    gdbm_errno = GDBM_NO_ERROR;
-
     return rv;
 }
 
@@ -144,7 +149,7 @@ static apr_status_t vt_gdbm_fetch(apr_db
 
     /* store the error info into DBM, and return a status code. Also, note
        that *pvalue should have been cleared on error. */
-    return set_error(dbm, APR_SUCCESS);
+    return set_error(dbm, gdat2s(rd));
 }
 
 static apr_status_t vt_gdbm_store(apr_dbm_t *dbm, apr_datum_t key,
@@ -203,7 +208,7 @@ static apr_status_t vt_gdbm_firstkey(apr
                                   apr_pool_cleanup_null);
 
     /* store any error info into DBM, and return a status code. */
-    return set_error(dbm, APR_SUCCESS);
+    return set_error(dbm, gdat2s(rd));
 }
 
 static apr_status_t vt_gdbm_nextkey(apr_dbm_t *dbm, apr_datum_t *pkey)
@@ -223,7 +228,7 @@ static apr_status_t vt_gdbm_nextkey(apr_
                                   apr_pool_cleanup_null);
 
     /* store any error info into DBM, and return a status code. */
-    return set_error(dbm, APR_SUCCESS);
+    return set_error(dbm, gdat2s(rd));
 }
 
 static void vt_gdbm_freedatum(apr_dbm_t *dbm, apr_datum_t data)
