]> git.sur5r.net Git - openldap/blobdiff - libraries/liblmdb/mdb.c
ITS#7992 Tighter utf8_to_utf16(), fix errcodes
[openldap] / libraries / liblmdb / mdb.c
index 4adbf5783fd7e932de7f2b9eeb584ba5906dec3e..4e4385c04c547846dd71d779e96bfce435524a59 100644 (file)
@@ -258,6 +258,10 @@ typedef SSIZE_T    ssize_t;
 #  define MDB_USE_ROBUST       0
 # else
 #  define MDB_USE_ROBUST       1
+# endif
+#endif /* !MDB_USE_ROBUST */
+
+#if defined(MDB_USE_POSIX_MUTEX) && (MDB_USE_ROBUST)
 /* glibc < 2.12 only provided _np API */
 #  if (defined(__GLIBC__) && GLIBC_VER < 0x02000c) || \
        (defined(PTHREAD_MUTEX_ROBUST_NP) && !defined(PTHREAD_MUTEX_ROBUST))
@@ -265,10 +269,9 @@ typedef SSIZE_T    ssize_t;
 #   define pthread_mutexattr_setrobust(attr, flag)     pthread_mutexattr_setrobust_np(attr, flag)
 #   define pthread_mutex_consistent(mutex)     pthread_mutex_consistent_np(mutex)
 #  endif
-# endif
-#endif /* MDB_USE_ROBUST */
+#endif /* MDB_USE_POSIX_MUTEX && MDB_USE_ROBUST */
 
-#if defined(MDB_OWNERDEAD) && MDB_USE_ROBUST
+#if defined(MDB_OWNERDEAD) && (MDB_USE_ROBUST)
 #define MDB_ROBUST_SUPPORTED   1
 #endif
 
@@ -1599,7 +1602,7 @@ mdb_page_list(MDB_page *mp)
                        pgno, ((MDB_meta *)METADATA(mp))->mm_txnid);
                return;
        default:
-               fprintf(stderr, "Bad page %"Z"u flags 0x%u\n", pgno, mp->mp_flags);
+               fprintf(stderr, "Bad page %"Z"u flags 0x%X\n", pgno, mp->mp_flags);
                return;
        }
 
@@ -1715,7 +1718,7 @@ static void mdb_audit(MDB_txn *txn)
                }
        }
        if (freecount + count + NUM_METAS != txn->mt_next_pgno) {
-               fprintf(stderr, "audit: %lu freecount: %lu count: %lu total: %lu next_pgno: %lu\n",
+               fprintf(stderr, "audit: %"Z"u freecount: %"Z"u count: %"Z"u total: %"Z"u next_pgno: %"Z"u\n",
                        txn->mt_txnid, freecount, count+NUM_METAS,
                        freecount+count+NUM_METAS, txn->mt_next_pgno);
        }
@@ -4496,9 +4499,9 @@ mdb_env_setup_locks(MDB_env *env, char *lpath, int mode, int *excl)
 #ifdef O_CLOEXEC       /* Linux: Open file and set FD_CLOEXEC atomically */
 #      define MDB_CLOEXEC              O_CLOEXEC
 #else
-       int fdflags;
 #      define MDB_CLOEXEC              0
 #endif
+       int fdflags;
 #endif
        int rc;
        off_t size, rsize;
@@ -4520,12 +4523,12 @@ mdb_env_setup_locks(MDB_env *env, char *lpath, int mode, int *excl)
                if (rc == MDB_ERRCODE_ROFS && (env->me_flags & MDB_RDONLY)) {
                        return MDB_SUCCESS;
                }
-               goto fail_errno;
+               goto fail;
        }
-#if ! ((MDB_CLOEXEC) || defined(_WIN32))
+#ifndef _WIN32
        /* Lose record locks when exec*() */
-       if ((fdflags = fcntl(env->me_lfd, F_GETFD) | FD_CLOEXEC) >= 0)
-                       fcntl(env->me_lfd, F_SETFD, fdflags);
+       if (!(MDB_CLOEXEC) && (fdflags = fcntl(env->me_lfd, F_GETFD)) != -1)
+                       fcntl(env->me_lfd, F_SETFD, fdflags | FD_CLOEXEC);
 #endif
 
        if (!(env->me_flags & MDB_NOTLS)) {
@@ -5925,6 +5928,7 @@ mdb_cursor_set(MDB_cursor *mc, MDB_val *key, MDB_val *data,
                                                }
                                        }
                                        rc = 0;
+                                       mc->mc_flags &= ~C_EOF;
                                        goto set2;
                                }
                        }
@@ -9390,17 +9394,12 @@ mdb_env_copy2(MDB_env *env, const char *path, unsigned int flags)
        }
 
        if (env->me_psize >= env->me_os_psize) {
-#ifdef O_DIRECT
+#ifdef F_NOCACHE       /* __APPLE__ */
+       (void) fcntl(newfd, F_NOCACHE, 1);
+#elif defined O_DIRECT
        /* Set O_DIRECT if the file system supports it */
        if ((rc = fcntl(newfd, F_GETFL)) != -1)
                (void) fcntl(newfd, F_SETFL, rc | O_DIRECT);
-#endif
-#ifdef F_NOCACHE       /* __APPLE__ */
-       rc = fcntl(newfd, F_NOCACHE, 1);
-       if (rc) {
-               rc = ErrCode();
-               goto leave;
-       }
 #endif
        }
 
@@ -10105,25 +10104,31 @@ mdb_mutex_failed(MDB_env *env, mdb_mutexref_t mutex, int rc)
        return rc;
 }
 #endif /* MDB_ROBUST_SUPPORTED */
-/** @} */
 
 #if defined(_WIN32)
-static int utf8_to_utf16(const char *src, int srcsize, wchar_t **dst, int *dstsize)
-{
-       int need;
-       wchar_t *result;
-       need = MultiByteToWideChar(CP_UTF8, 0, src, srcsize, NULL, 0);
-       if (need == 0xFFFD)
-               return EILSEQ;
-       if (need == 0)
-               return EINVAL;
-       result = malloc(sizeof(wchar_t) * need);
-       if (!result)
-               return ENOMEM;
-       MultiByteToWideChar(CP_UTF8, 0, src, srcsize, result, need);
-       if (dstsize)
-               *dstsize = need;
-       *dst = result;
-       return 0;
+static int ESECT
+utf8_to_utf16(const char *src, int srcsize, wchar_t **dst, int *dstsize)
+{
+       int rc, need = 0;
+       wchar_t *result = NULL;
+       for (;;) {                                      /* malloc result, then fill it in */
+               need = MultiByteToWideChar(CP_UTF8, 0, src, srcsize, result, need);
+               if (!need) {
+                       rc = ErrCode();
+                       free(result);
+                       return rc;
+               }
+               if (!result) {
+                       result = malloc(sizeof(wchar_t) * need);
+                       if (!result)
+                               return ENOMEM;
+                       continue;
+               }
+               if (dstsize)
+                       *dstsize = need;
+               *dst = result;
+               return MDB_SUCCESS;
+       }
 }
 #endif /* defined(_WIN32) */
+/** @} */