]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix removal of file locks on MS-Windows 9X
authorEli Zaretskii <eliz@gnu.org>
Thu, 13 Jun 2024 07:24:21 +0000 (10:24 +0300)
committerEshel Yaron <me@eshelyaron.com>
Sat, 15 Jun 2024 17:21:10 +0000 (19:21 +0200)
A new Windows-specific function for validating process ID
is introduced that does TRT with possibly negative PID
values returned by 'getpid' on Windows 9X and also with
values larger than INT_MAX, since PID on Windows is
actually an unsigned 32-bit value.
* src/w32proc.c (w32_valid_process_id): New function.
* src/w32common.h (VALID_PROCESS_ID): Define for WINDOWSNT.
* src/filelock.c [WINDOWSNT]: Include w32common.h.  (Bug#71477)

(cherry picked from commit 0007231a7805abce945349c7c9c75b45155bda5c)

src/filelock.c
src/w32common.h
src/w32proc.c

index d4a4747955a031a6f5c2ef624d95b2d68c133c46..43ede30975e129429ecede04f4074ecb099a4909 100644 (file)
@@ -47,6 +47,7 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 #ifdef WINDOWSNT
 #include <share.h>
 #include <sys/socket.h>        /* for fcntl */
+#include "w32common.h"
 #endif
 
 #ifndef MSDOS
@@ -353,7 +354,7 @@ integer_prefixed (char const *s)
 
 /* Whether the integer P could identify an individual process.  On most
    platforms this simply checks for positive pid_t, but on some
-   Microsoft ports our headers #define it to to some other test.  */
+   MS-Windows ports our headers #define it to to some other test.  */
 #ifndef VALID_PROCESS_ID
 # define VALID_PROCESS_ID(p) (0 < (p) && (p) <= TYPE_MAXIMUM (pid_t))
 #endif
index 9475481b64e21b8768547cda2efe9a62b11cd8a9..8a5c7c03bca9cda89d6705e2a9e2e5e4a9cec7eb 100644 (file)
@@ -53,6 +53,8 @@ extern void cache_system_info (void);
 #ifdef WINDOWSNT
 /* Return a static buffer with the MS-Windows version string.  */
 extern char * w32_version_string (void);
+extern bool w32_valid_process_id (intmax_t);
+# define VALID_PROCESS_ID(p) w32_valid_process_id(p)
 #endif
 
 typedef void (* VOIDFNPTR) (void);
index 55ead13647b5e99f061284fd10831cd2dd126772..4d237992b14e8b38487e13086e1e96a501b8d3c5 100644 (file)
@@ -2676,6 +2676,19 @@ count_children:
   return nr;
 }
 
+/* This is called from filelock.c:current_lock_owner to validate a PID.
+   Return true if PID could identify a process on the current host,
+   false otherwise.  */
+bool
+w32_valid_process_id (intmax_t id)
+{
+  if (id == -1 || id == 0      /* always invalid */
+      || id > UINT32_MAX       /* PID is actually a DWORD */
+      || id < INT32_MIN)       /* Windows 9X can report negative PIDs */
+    return false;
+  return true;
+}
+
 /* Substitute for certain kill () operations */
 
 static BOOL CALLBACK