hashicorp/nomad · error
failed to convert user domain to UTF-16: %w
Error message
failed to convert user domain to UTF-16: %w
What it means
createUserToken converts the domain portion of 'DOMAIN\\user' to a UTF-16 pointer for LogonUserW. syscall.UTF16PtrFromString fails if the domain string contains an interior NUL byte, so token creation aborts before calling LogonUser.
Source
Thrown at drivers/shared/executor/executor_windows.go:88
var (
advapiDll = windows.NewLazySystemDLL("advapi32.dll")
procLogonUserW = advapiDll.NewProc("LogonUserW")
)
const (
_LOGON_SERVICE uint32 = 5
_PROVIDER_DEFAULT uint32 = 0
)
func createUserToken(domain, username string) (*syscall.Token, error) {
userw, err := syscall.UTF16PtrFromString(username)
if err != nil {
return nil, fmt.Errorf("failed to convert username to UTF-16: %w", err)
}
domainw, err := syscall.UTF16PtrFromString(domain)
if err != nil {
return nil, fmt.Errorf("failed to convert user domain to UTF-16: %w", err)
}
var token syscall.Token
ret, _, e := procLogonUserW.Call(
uintptr(unsafe.Pointer(userw)),
uintptr(unsafe.Pointer(domainw)),
uintptr(unsafe.Pointer(nil)),
uintptr(_LOGON_SERVICE),
uintptr(_PROVIDER_DEFAULT),
uintptr(unsafe.Pointer(&token)),
)
if ret == 0 {
return nil, e
}
return &token, nil
}
func (e *UniversalExecutor) ListProcesses() set.Collection[int] {View on GitHub (pinned to 482b49bf1a)
Solutions
- Inspect the domain portion of the user value for embedded NUL/control characters and fix its source.
- Sanitize the domain string to printable characters before executor setup.
- Correct the task user format, e.g. 'DOMAIN\\user'.
Example fix
// before user = "CORP\x00\\appuser" // after user = "CORP\\appuser"
Defensive patterns
Strategy: validation
Validate before calling
// Go: reject domains containing NUL before calling the executor
if strings.ContainsRune(domain, 0) {
return errors.New("domain must not contain NUL bytes")
} Type guard
func utf16Safe(s string) bool {
_, err := syscall.UTF16PtrFromString(s)
return err == nil
} Try / catch
if err := exec.SetUser(cmd, user); err != nil {
if strings.Contains(err.Error(), "convert user domain to UTF-16") {
return fmt.Errorf("malformed domain in user value %q", user)
}
return err
} Prevention
- Enforce the 'DOMAIN\\user' format with a regex at submission.
- Sanitize templated values (strip control chars) before they reach the executor.
- Unit-test user-string parsing with edge-case inputs.
When it happens
Trigger: The domain string (nameParts[0] after splitting user on '\\') contains a NUL character.
Common situations: Same as the username variant: corrupted or programmatically mangled user strings; binary contamination in config from a template or plugin.
Related errors
- failed to convert username to UTF-16: %w
- failed to convert "%s" to UTF16: %v
- failed to create user token: %w
- eventlog.level must be one of INFO, WARN, or ERROR
- running container as ContainerAdmin is unsafe; change the co
AI-assisted analysis of hashicorp/nomad@482b49bf1a (2026-09-04).
Data as JSON: /api/errors/8bbfb3af12e0064f.
Report an issue: GitHub.