about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2022-05-14 03:24:41 +0000
committerLaurent Bercot <ska@appnovation.com>2022-05-14 03:24:41 +0000
commit1ec92330e16bdbaa2d5e2a5dfb9274124c767214 (patch)
tree4b8041cb83a6721b157ab83fdfae5134e53819b4
parent7fde494f57985bba16e255b03a6cee6db44fdc8a (diff)
downloadmdevd-1ec92330e16bdbaa2d5e2a5dfb9274124c767214.tar.gz
mdevd-1ec92330e16bdbaa2d5e2a5dfb9274124c767214.tar.xz
mdevd-1ec92330e16bdbaa2d5e2a5dfb9274124c767214.zip
Fix for the end-of-event detection
Signed-off-by: Laurent Bercot <ska@appnovation.com>
-rw-r--r--src/mdevd/mdevd.c17
1 files changed, 7 insertions, 10 deletions
diff --git a/src/mdevd/mdevd.c b/src/mdevd/mdevd.c
index d6fd6c3..c64e960 100644
--- a/src/mdevd/mdevd.c
+++ b/src/mdevd/mdevd.c
@@ -141,11 +141,10 @@ struct udata_s
   int mmaj ;
   int mmin ;
   pid_t pid ;
-  unsigned int i ;
+  unsigned short i ;
   char buf[UEVENT_MAX_SIZE] ;
-  unsigned char done : 1 ;
 } ;
-#define UDATA_ZERO { .devname = 0, .devtype = 0, .action = 0, .mmaj = -1, .mmin = -1, .pid = 0, .i = 0, .buf = "", .done = 0 }
+#define UDATA_ZERO { .devname = 0, .devtype = 0, .action = 0, .mmaj = -1, .mmin = -1, .pid = 0, .i = 0, .buf = "" }
 
 
  /* Utility functions */
@@ -839,15 +838,14 @@ static inline int run_scriptelem (struct uevent_s *event, scriptelem const *elem
     else unlink_void(node) ;
   }
 
-  ud->done = !elem->flagcont ;
-  return ud->done || !!ud->pid ;
+  return !elem->flagcont ;
 }
 
 static int run_script (struct uevent_s *event, scriptelem const *script, unsigned short scriptlen, char const *storage, struct envmatch_s const *envmatch, udata *ud)
 {
-  for (;; ud->i++)  /* last elem is the catchall with flagcont=0 */
-    if (run_scriptelem(event, script + ud->i, storage, envmatch, ud)) break ;
-  return ud->done && !ud->pid ;
+  for (; ud->i < scriptlen && !ud->pid ; ud->i++)
+    if (run_scriptelem(event, script + ud->i, storage, envmatch, ud)) ud->i = scriptlen - 1 ;
+  return ud->i >= scriptlen && !ud->pid ;
 }
 
 static inline int act_on_event (struct uevent_s *event, char *sysdevpath, size_t sysdevpathlen, unsigned int action, scriptelem const *script, unsigned short scriptlen, char const *storage, struct envmatch_s const *envmatch, udata *ud)
@@ -916,7 +914,6 @@ static inline int act_on_event (struct uevent_s *event, char *sysdevpath, size_t
     if (x && str_start(x, "block")) ud->devtype = S_IFBLK ;
   }
   ud->i = 0 ;
-  ud->done = 0 ;
   return run_script(event, script, scriptlen, storage, envmatch, ud) ;
 }
 
@@ -970,7 +967,7 @@ static inline int handle_signals (struct uevent_s *event, scriptelem const *scri
             else break ;
           else if (!r) break ;
           ud->pid = 0 ;
-          e = ud->done ? 1 : run_script(event, script, scriptlen, storage, envmatch, ud) ;
+          e = run_script(event, script, scriptlen, storage, envmatch, ud) ;
         }
         break ;
       default :