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

