Skip to content

Commit

Permalink
caddyfile: Use full, absolute file path in token structs (fixes caddy…
Browse files Browse the repository at this point in the history
…server#1892)

When two Caddyfiles with the same name, but different paths, are
imported, it can cause a weird bug because isNewLine() returned false
when it should return true, since the files are actually different,
but it couldn't know that because only the base name was stored,
not the whole path.
  • Loading branch information
mholt committed Sep 23, 2017
1 parent e377eef commit e60400a
Showing 1 changed file with 10 additions and 5 deletions.
15 changes: 10 additions & 5 deletions caddyfile/parse.go
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,7 @@ func (p *parser) doImport() error {
// and then use glob to get list of matching filenames
absFile, err := filepath.Abs(p.Dispenser.filename)
if err != nil {
return p.Errf("Failed to get absolute path of file: %s", p.Dispenser.filename)
return p.Errf("Failed to get absolute path of file: %s: %v", p.Dispenser.filename, err)
}

var matches []string
Expand Down Expand Up @@ -246,8 +246,8 @@ func (p *parser) doImport() error {
if err != nil {
return err
}

var importLine int
importDir := filepath.Dir(importFile)
for i, token := range newTokens {
if token.Text == "import" {
importLine = token.Line
Expand All @@ -260,7 +260,7 @@ func (p *parser) doImport() error {
} else if !filepath.IsAbs(importFile) {
abs = filepath.Join(filepath.Dir(absFile), token.Text)
} else {
abs = filepath.Join(importDir, token.Text)
abs = filepath.Join(filepath.Dir(importFile), token.Text)
}
newTokens[i] = Token{
Text: abs,
Expand All @@ -269,6 +269,7 @@ func (p *parser) doImport() error {
}
}
}

importedTokens = append(importedTokens, newTokens...)
}

Expand Down Expand Up @@ -300,8 +301,12 @@ func (p *parser) doSingleImport(importFile string) ([]Token, error) {
return nil, p.Errf("Could not read tokens while importing %s: %v", importFile, err)
}

// Tack the filename onto these tokens so errors show the imported file's name
filename := filepath.Base(importFile)
// Tack the file path onto these tokens so errors show the imported file's name
// (we use full, absolute path to avoid bugs: issue #1892)
filename, err := filepath.Abs(importFile)
if err != nil {
return nil, p.Errf("Failed to get absolute path of file: %s: %v", p.Dispenser.filename, err)
}
for i := 0; i < len(importedTokens); i++ {
importedTokens[i].File = filename
}
Expand Down

0 comments on commit e60400a

Please sign in to comment.