On 21/06/14 11:01 PM, Jérémie Courrèges-Anglas wrote:
(Redirecting this to ports@) Could you folks test this patch against dovecot from -stable? I only did compile testing on -current. I don't know how the allocator(s) handle failures nor how would i_realloc handle pwbuf_size == old_pwbuf_size, but this looks safe.
I forgot about this. I had put this in just after the new allocation style was added to Dovecot as a workaround until the libc functions were fixed. This would be Ok for 5.5.
$OpenBSD$ Hack: we avoid the actual ERANGE error case by always providing a large enough buffer. --- src/lib/ipwd.c.orig Tue Nov 19 21:36:30 2013 +++ src/lib/ipwd.c Sun Jun 22 04:31:43 2014 @@ -15,24 +15,26 @@ static size_t pwbuf_size, grbuf_size; static void pw_init(void) { size_t old_pwbuf_size = pwbuf_size; + size_t new_pwbuf_size; - if (pwbuf == NULL || errno == ERANGE) { - pwbuf_size = nearest_power(old_pwbuf_size + 1); - if (pwbuf_size < PWBUF_MIN_SIZE) - pwbuf_size = PWBUF_MIN_SIZE; - pwbuf = i_realloc(pwbuf, old_pwbuf_size, pwbuf_size); + if (pwbuf == NULL) { + new_pwbuf_size = sysconf(_SC_GETPW_R_SIZE_MAX); + pwbuf = i_realloc(pwbuf, old_pwbuf_size, new_pwbuf_size); + if (pwbuf != NULL) + pwbuf_size = new_pwbuf_size; } } static void gr_init(void) { size_t old_grbuf_size = grbuf_size; + size_t new_grbuf_size; - if (grbuf == NULL || errno == ERANGE) { - grbuf_size = nearest_power(old_grbuf_size + 1); - if (grbuf_size < PWBUF_MIN_SIZE) - grbuf_size = PWBUF_MIN_SIZE; - grbuf = i_realloc(grbuf, old_grbuf_size, grbuf_size); + if (grbuf == NULL) { + new_grbuf_size = sysconf(_SC_GETGR_R_SIZE_MAX); + grbuf = i_realloc(grbuf, old_grbuf_size, new_grbuf_size); + if (grbuf != NULL) + grbuf_size = new_grbuf_size; } } @@ -50,11 +52,6 @@ int i_getpwnam(const char *name, struct passwd *pwd_r) do { pw_init(); errno = getpwnam_r(name, pwd_r, pwbuf, pwbuf_size, &result); -#ifdef __OpenBSD__ - /* OpenBSD returns 1 for all errors, assume it's ERANGE */ - if (errno == 1) - errno = ERANGE; -#endif } while (errno == ERANGE); if (result != NULL) return 1; @@ -73,11 +70,6 @@ int i_getpwuid(uid_t uid, struct passwd *pwd_r) do { pw_init(); errno = getpwuid_r(uid, pwd_r, pwbuf, pwbuf_size, &result); -#ifdef __OpenBSD__ - /* OpenBSD returns 1 for all errors, assume it's ERANGE */ - if (errno == 1) - errno = ERANGE; -#endif } while (errno == ERANGE); if (result != NULL) return 1;
-- This message has been scanned for viruses and dangerous content by MailScanner, and is believed to be clean.