!69 [sync] PR-68: fix dbm_open error when the dir file is missing

From: @openeuler-sync-bot 
Reviewed-by: @liuzhiqiang26 
Signed-off-by: @liuzhiqiang26
This commit is contained in:
openeuler-ci-bot 2023-03-17 11:43:40 +00:00 committed by Gitee
commit eac827f0e5
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
2 changed files with 65 additions and 1 deletions

View File

@ -0,0 +1,60 @@
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

View File

@ -1,6 +1,6 @@
Name: gdbm
Version: 1.23
Release: 1
Release: 2
Epoch: 1
Summary: A library of database functions that work similar to the standard UNIX dbm
License: GPLv3+
@ -15,6 +15,7 @@ Patch4: Fix-semantics-of-gdbm_load-r.patch
Patch5: Improve-handling-of-u-in-gdbm_load.patch
Patch6: Fix-allocated-memory-not-released.patch
Patch7: Restore-accidentally-removed-parameter-and-New-macro.patch
Patch8: Minor-fix-in-the-compatibility-library.patch
BuildRequires: gcc libtool gettext readline-devel bison flex texinfo
@ -106,6 +107,9 @@ fi
%{_infodir}/*.info*
%changelog
* Thu Mar 16 2023 wangzhiqiang <wangzhiqiang95@huawei.com> - 1:1.23-2
- DESC:backport upstream patch
* Thu Dec 8 2022 wangzhiqiang <wangzhiqiang95@huawei.com> - 1:1.23-1
- DESC: update to version 1.23