Hi Timo,

   I am running Dovecot 2.4.4 under FreeBSD 15.x, and I noticed that the IMAP
   hibernation feature fails to work natively on this platform.

  The Problem

   Under FreeBSD, running fstat() on a network socket
   returns NODEV (UINT64_MAX or 18446744073709551615) for
   both major()and minor() device numbers.

   When imap-hibernate tries to serialize these values, they are printed as
   64-bit unsigned integers. However, Dovecot's internal parser
   in imap-master-client.c uses standard 32-bit integers (unsigned int)
   and str_to_uint(). This causes an integer overflow, triggering the
   following error during hibernation: Failed to parse client input: Invalid
   peer_dev_major value: 18446744073709551615

  The Solution

   I've created a patch for src/imap/imap-master-client.c that scales the
   parser variables to uint64_t and switches the parsing function
   to str_to_uint64(). Additionally, it updates the verification assertion to
   prevent BUG crashes due to the expected dev_tbehavior of virtual network
   sockets under FreeBSD.

   Here is the combined patch that fixes the issue completely:

   Fragment ot kod

 --- src/imap/imap-master-client.c.orig  2026-05-12 10:48:57 UTC
 +++ src/imap/imap-master-client.c
 @@ -75,7 +75,7 @@ imap_master_client_parse_input(const char *const *args
                                const char **error_r)
  {
         const char *key, *value;
 -       unsigned int peer_dev_major = 0, peer_dev_minor = 0;
 +       uint64_t peer_dev_major = 0, peer_dev_minor = 0;

         i_zero(input_r);
         i_zero(stats_r);
 @@ -128,13 +128,13 @@ imap_master_client_parse_input(const char *const *args
                                 return -1;
                         }
                 } else if (strcmp(key, "peer_dev_major") == 0) {
 -                       if (str_to_uint(value, &peer_dev_major) < 0) {
 +                       if (str_to_uint64(value, &peer_dev_major) < 0) {
                                 *error_r = t_strdup_printf(
                                         "Invalid peer_dev_major value: %s", 
value);
                                 return -1;
                         }
                 } else if (strcmp(key, "peer_dev_minor") == 0) {
 -                       if (str_to_uint(value, &peer_dev_minor) < 0) {
 +                       if (str_to_uint64(value, &peer_dev_minor) < 0) {
                                 *error_r = t_strdup_printf(
                                         "Invalid peer_dev_minor value: %s", 
value);
                                 return -1;
 @@ -265,7 +265,7 @@ imap_master_client_parse_input(const char *const *args
         }
         if (peer_dev_major != 0 || peer_dev_minor != 0) {
                 master_input_r->peer_dev =
 -                       makedev(peer_dev_major, peer_dev_minor);
 +                       makedev((unsigned long)peer_dev_major, (unsigned 
long)peer_dev_minor);
         }
         return 0;
  }
 @@ -410,7 +410,8 @@ static int imap_master_client_verify(const struct imap
                 return -1;
         }
         if (peer_st.st_ino != master_input->peer_ino ||
 -           !CMP_DEV_T(peer_st.st_dev, master_input->peer_dev)) {
 +           (!CMP_DEV_T(peer_st.st_dev, master_input->peer_dev) &&
 +            major(peer_st.st_dev) != (unsigned long)-1)) {
                 *error_r = t_strdup_printf(
                         "BUG: Expected peer device=%lu,%lu inode=%s doesn't 
match "
                         "client fd's actual device=%lu,%lu inode=%s",

  Result

   With this patch applied, hibernation works flawlessly under FreeBSD:

 # doveadm who
 username            # service (pids)  (ips)
 [email protected] 1 imap    (26000) (46.10.221.52)
 [email protected] 2 imap-hibernate (26260) (46.10.221.52)

   No error messages are logged by dovecot when it hibernates and restores
   clients. I hope this can be integrated into the upstream code.

   Best regards,

   Jordan

     On 25 Jun 2026, at 15:50, Jordan Ostrev <[email protected]> wrote:
     Hi Timo,
     i'm not programmer at all but here is my understanding of the problem:

 In src/imap/imap-client-hibernate.c, the code serializes peer_dev_major and 
peer_dev_minor using major() and minor() macros:

 str_printfa(cmd, "\tpeer_dev_major=%lu\tpeer_dev_minor=%lu\tpeer_ino=%llu",
             (unsigned long)major(peer_st.st_dev),
             (unsigned long)minor(peer_st.st_dev),
             (unsigned long long)peer_st.st_ino);

 On FreeBSD, major() and minor() can return UINT64_MAX (18446744073709551615) 
for file descriptors that are not block/character devices (such as sockets on 
tmpfs/devfs). This value exceeds UINT_MAX and cannot be parsed by str_to_uint() 
in imap-master-client.c, causing hibernation to fail.

       On 25 Jun 2026, at 14:37, Jordan Ostrev <[email protected]> wrote:
       Hi Timo,

       I've made freebsd port patch which looks like that:

       # cat files/patch-configure.ac
       --- configure.ac.orig   2026-06-25 11:03:42 UTC
       +++ configure.ac
       @@ -363,7 +363,7 @@ AS_CASE(
       DOVECOT_IOLOOP
       DOVECOT_NOTIFY
       AS_CASE(
       -   ["$notify"],
       +   ["$have_notify"],
          [none],   [BUILD_IMAP_HIBERNATE=0],
          [kqueue], [BUILD_IMAP_HIBERNATE=0],
          [BUILD_IMAP_HIBERNATE=1])

       I'm simulating the situation with telnet:
       c idle
       + idling
       * 4228 EXPUNGE
       * 0 RECENT
       * OK Still here
       * OK Still here
       * 4228 EXISTS
       * 1 RECENT
       * 4228 EXPUNGE
       * 0 RECENT
       * 4228 EXISTS
       * 1 RECENT
       * 4228 EXPUNGE
       * 0 RECENT
       * OK Still here
       * OK Still here
       * OK Still here
       * OK Still here
       * 4228 EXISTS
       * 1 RECENT
       * 4228 EXPUNGE
       * 0 RECENT
       * OK Still here
       * OK Still here
       d idle
       c BAD Idle completed.
       + idling
       * OK Still here
       * 4228 EXISTS
       * 1 RECENT
       * 4228 EXPUNGE
       * 0 RECENT
       * OK Still here
       * 4228 EXISTS
       * 4227 FETCH (FLAGS (\Seen $NotJunk NotJunk))
       * 4228 EXPUNGE
       * OK Still here

       in the log I see following:

       Jun 25 14:21:17 classic dovecot[29292]: imap-hibernate: Error: conn
       unix:imap-hibernate (uid=125): Failed to parse client input: Invalid
       peer_dev_major value: 18446744073709551615
       Jun 25 14:21:17 classic dovecot[29292]:
       imap([email protected])<29454><CLP/EhJVqIguCt00>: Error: Couldn't
       hibernate imap client: /var/run/dovecot/imap-hibernate returned
       failure: Failed to parse client input: Invalid peer_dev_major value:
       18446744073709551615
       Jun 25 14:21:17 classic dovecot[29292]: imap-hibernate: Error: conn
       unix:imap-hibernate (uid=125): Failed to parse client input: Invalid
       peer_dev_major value: 18446744073709551615
       Jun 25 14:21:17 classic dovecot[29292]:
       imap([email protected])<30943><EJZELRJVp5QuCt00>: Error: Couldn't
       hibernate imap client: /var/run/dovecot/imap-hibernate returned
       failure: Failed to parse client input: Invalid peer_dev_major value:
       18446744073709551615
       Jun 25 14:26:03 classic dovecot[29292]: imap-hibernate: Error: conn
       unix:imap-hibernate (uid=125): Failed to parse client input: Invalid
       peer_dev_major value: 18446744073709551615
       Jun 25 14:26:03 classic dovecot[29292]:
       imap([email protected])<30943><EJZELRJVp5QuCt00>: Error: Couldn't
       hibernate imap client: /var/run/dovecot/imap-hibernate returned
       failure: Failed to parse client input: Invalid peer_dev_major value:
       18446744073709551615
       Jun 25 14:26:03 classic dovecot[29292]: imap-hibernate: Error: conn
       unix:imap-hibernate (uid=125): Failed to parse client input: Invalid
       peer_dev_major value: 18446744073709551615
       Jun 25 14:26:03 classic dovecot[29292]:
       imap([email protected])<29454><CLP/EhJVqIguCt00>: Error: Couldn't
       hibernate imap client: /var/run/dovecot/imap-hibernate returned
       failure: Failed to parse client input: Invalid peer_dev_major value:
       18446744073709551615
       Jun 25 14:29:28 classic dovecot[29292]: imap-hibernate: Error: conn
       unix:imap-hibernate (uid=125): Failed to parse client input: Invalid
       peer_dev_major value: 18446744073709551615
       Jun 25 14:29:28 classic dovecot[29292]:
       imap([email protected])<29454><CLP/EhJVqIguCt00>: Error: Couldn't
       hibernate imap client: /var/run/dovecot/imap-hibernate returned
       failure: Failed to parse client input: Invalid peer_dev_major value:
       18446744073709551615
       Jun 25 14:33:36 classic dovecot[29292]: imap-hibernate: Error: conn
       unix:imap-hibernate (uid=125): Failed to parse client input: Invalid
       peer_dev_major value: 18446744073709551615
       Jun 25 14:33:36 classic dovecot[29292]:
       imap([email protected])<33114><cX5QWRJVrZguCt00>: Error: Couldn't
       hibernate imap client: /var/run/dovecot/imap-hibernate returned
       failure: Failed to parse client input: Invalid peer_dev_major value:
       18446744073709551615
       Jun 25 14:33:37 classic dovecot[29292]: imap-hibernate: Error: conn
       unix:imap-hibernate (uid=125): Failed to parse client input: Invalid
       peer_dev_major value: 18446744073709551615
       Jun 25 14:33:37 classic dovecot[29292]:
       imap([email protected])<33112><NlVOWRJVkbEuCt00>: Error: Couldn't
       hibernate imap client: /var/run/dovecot/imap-hibernate returned
       failure: Failed to parse client input: Invalid peer_dev_major value:
       18446744073709551615
       Jun 25 14:34:40 classic dovecot[29292]: imap-hibernate: Error: conn
       unix:imap-hibernate (uid=125): Failed to parse client input: Invalid
       peer_dev_major value: 18446744073709551615
       Jun 25 14:34:40 classic dovecot[29292]:
       imap([email protected])<33112><NlVOWRJVkbEuCt00>: Error: Couldn't
       hibernate imap client: /var/run/dovecot/imap-hibernate returned
       failure: Failed to parse client input: Invalid peer_dev_major value:
       18446744073709551615

       Here is my piece of my config:
       # dovecot -a | grep hibernate
       imap_hibernate_timeout = 1 mins
       service imap-hibernate {
        unix_listener imap-hibernate {

       What we can do more?

       KR,
       Jordan

         On 25 Jun 2026, at 12:34, Timo Sirainen <[email protected]> wrote:

         On 24. Jun 2026, at 21.34, Jordan Ostrev via dovecot
         <[email protected]> wrote:

           Hi,
           IMAP hibernation compiles and attempts to run on FreeBSD 15.x
           (tested with
           Dovecot 2.4.4 and FreeBSD 15.1), but fails at runtime with:
           plain

           imap-hibernate: Error: conn unix:imap-hibernate (uid=125): Failed
           to parse client input: Invalid peer_dev_major value:
           18446744073709551615

           Jun 24 21:27:08 classic dovecot[36888]: imap-hibernate: Error:
           conn unix:imap-hibernate (uid=125): Failed to parse client input:
           Invalid peer_dev_major value: 18446744073709551615
           Jun 24 21:27:08 classic dovecot[36888]:
           imap([email protected])<37120><ExaV/gNVAdt/AAAB>: Error:
           Couldn't hibernate imap client: /var/run/dovecot/imap-hibernate
           returned failure: Failed to parse client input: Invalid
           peer_dev_major value: 18446744073709551615

         ..

            1. Disable hibernation at compile time for kqueue systems, or

         It was already supposed to be done, but looks like there's a bug.
         Can you verify if this works? :

         diff --git a/configure.ac b/configure.ac
         index 9beacaa299..04f9c8edd6 100644
         --- a/configure.ac
         +++ b/configure.ac
         @@ -363,7 +363,7 @@ DOVECOT_TYPEOF
         DOVECOT_IOLOOP
         DOVECOT_NOTIFY
         AS_CASE(
         -   ["$notify"],
         +   ["$have_notify"],
           [none],   [BUILD_IMAP_HIBERNATE=0],
           [kqueue], [BUILD_IMAP_HIBERNATE=0],
           [BUILD_IMAP_HIBERNATE=1])
_______________________________________________
dovecot mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to