Files
ipsw/internal/commands/kernel/diff.go

68 lines
1.7 KiB
Go

package kernel
import (
"fmt"
"github.com/blacktop/go-macho"
"github.com/blacktop/go-macho/types"
mcmd "github.com/blacktop/ipsw/internal/commands/macho"
"github.com/blacktop/ipsw/pkg/signature"
)
// Diff compares two MH_FILESET kernelcache files
func Diff(k1, k2 *macho.File, conf *mcmd.DiffConfig) (*mcmd.MachoDiff, error) {
diff := &mcmd.MachoDiff{
Updated: make(map[string]string),
}
/* PREVIOUS KERNEL */
prev := make(map[string]*mcmd.DiffInfo)
if k1.FileTOC.FileHeader.Type == types.MH_FILESET {
for _, fe := range k1.FileSets() {
mfe, err := k1.GetFileSetFileByName(fe.EntryID)
if err != nil {
return nil, fmt.Errorf("failed to parse entry %s: %v", fe.EntryID, err)
}
var smaps []signature.SymbolMap
if conf.SymMap != nil {
smap, ok := conf.SymMap[k1.UUID().String()]
if !ok {
return nil, fmt.Errorf("failed to find symbol map for kernelcache %s", k1.UUID().String())
}
smaps = append(smaps, smap)
}
prev[fe.EntryID] = mcmd.GenerateDiffInfo(mfe, conf, smaps...)
}
}
/* NEXT KERNEL */
next := make(map[string]*mcmd.DiffInfo)
if k2.FileTOC.FileHeader.Type == types.MH_FILESET {
for _, fe := range k2.FileSets() {
mfe, err := k2.GetFileSetFileByName(fe.EntryID)
if err != nil {
return nil, fmt.Errorf("failed to parse entry %s: %v", fe.EntryID, err)
}
var smaps []signature.SymbolMap
if conf.SymMap != nil {
smap, ok := conf.SymMap[k2.UUID().String()]
if !ok {
return nil, fmt.Errorf("failed to find symbol map for kernelcache %s", k2.UUID().String())
}
smaps = append(smaps, smap)
}
next[fe.EntryID] = mcmd.GenerateDiffInfo(mfe, conf, smaps...)
}
}
if err := diff.Generate(prev, next, conf); err != nil {
return nil, err
}
return diff, nil
}