Signed-off-by: wangzhiqiang <wangzhiqiang95@huawei.com> (cherry picked from commit 3715862511e40e92ca8a6f5e5e8fe8a093d8b302)
61 lines
1.9 KiB
Diff
61 lines
1.9 KiB
Diff
From 3e63a788d4c7b5cb1173937118135c2bcca35a02 Mon Sep 17 00:00:00 2001
|
|
From: Sergey Poznyakoff <gray@gnu.org>
|
|
Date: Fri, 3 Mar 2023 13:52:56 +0200
|
|
Subject: [PATCH] Minor fix in the compatibility library.
|
|
|
|
* compat/dbmopen.c (ndbm_open_dir_file0): Don't try to unlink
|
|
the 1.8-compatible dir file or create a missing one if the database
|
|
is being opened read-only.
|
|
---
|
|
compat/dbmopen.c | 26 +++++++++++++++++++++-----
|
|
1 file changed, 21 insertions(+), 5 deletions(-)
|
|
|
|
diff --git a/compat/dbmopen.c b/compat/dbmopen.c
|
|
index b11af98..cb979b5 100644
|
|
--- a/compat/dbmopen.c
|
|
+++ b/compat/dbmopen.c
|
|
@@ -81,12 +81,21 @@ ndbm_open_dir_file0 (const char *file_name, int pagfd, int mode)
|
|
{
|
|
if (st.st_dev == pagst.st_dev && st.st_ino == pagst.st_ino)
|
|
{
|
|
- if (unlink (file_name))
|
|
+ if (flags == O_RDONLY)
|
|
{
|
|
- if ((mode & GDBM_OPENMASK) == GDBM_READER)
|
|
- /* Ok, try to cope with it. */
|
|
- return pagfd;
|
|
- else if (errno != ENOENT)
|
|
+ /*
|
|
+ * Don't touch the link if the database is opened read-only.
|
|
+ * Return a meaningful file descriptor for the sake
|
|
+ * of those programs that compare it with pagfd trying
|
|
+ * to detect old GDBM versions (as Sendmail does).
|
|
+ */
|
|
+ if ((fd = open ("/dev/null", flags)) == -1)
|
|
+ gdbm_set_errno (NULL, GDBM_FILE_OPEN_ERROR, TRUE);
|
|
+ return fd;
|
|
+ }
|
|
+ else if (unlink (file_name))
|
|
+ {
|
|
+ if (errno != ENOENT)
|
|
{
|
|
gdbm_set_errno (NULL, GDBM_FILE_OPEN_ERROR, TRUE);
|
|
return -1;
|
|
@@ -138,6 +147,13 @@ ndbm_open_dir_file0 (const char *file_name, int pagfd, int mode)
|
|
return -1;
|
|
}
|
|
}
|
|
+ else if (flags == O_RDONLY)
|
|
+ {
|
|
+ /* See the comment above. */
|
|
+ if ((fd = open ("/dev/null", flags)) == -1)
|
|
+ gdbm_set_errno (NULL, GDBM_FILE_OPEN_ERROR, TRUE);
|
|
+ return fd;
|
|
+ }
|
|
|
|
/* File does not exist. Create it. */
|
|
fd = open (file_name, flags | O_CREAT, pagst.st_mode & 0777);
|
|
--
|
|
2.33.0
|
|
|