package launchctx import "strconv" // encoding/json replaces unpaired UTF-16 escapes with U+FFFD. Refuse that // lossy conversion before decoding identities and paths. func validSurrogates(raw []byte) bool { quoted := false for i := 0; i < len(raw); i++ { if raw[i] == '"' { quoted = !quoted continue } if !quoted || raw[i] != '\\' { continue } i++ if i >= len(raw) { return false } if raw[i] != 'u' { continue } if i+4 >= len(raw) { return false } n, err := strconv.ParseUint(string(raw[i+1:i+5]), 16, 16) if err != nil { return false } i += 4 if n >= 0xdc00 && n <= 0xdfff { return false } if n < 0xd800 || n > 0xdbff { continue } if i+6 >= len(raw) || raw[i+1] != '\\' || raw[i+2] != 'u' { return false } low, err := strconv.ParseUint(string(raw[i+3:i+7]), 16, 16) if err != nil || low < 0xdc00 || low > 0xdfff { return false } i += 6 } return true }