Projects STRLCPY reverse_ssh Commits a13d09e0
🤬
  • Allow for argument parsing to take strings with escapes

  • Loading...
  • NHAS committed 1 year ago
    a13d09e0
    1 parent 3bf1e77e
  • ■ ■ ■ ■ ■ ■
    cmd/client/main.go
    skipped 3 lines
    4 4   "fmt"
    5 5   "os"
    6 6   "path/filepath"
     7 + "strconv"
    7 8   "strings"
    8 9   
    9 10   "github.com/NHAS/reverse_ssh/internal/terminal"
    skipped 19 lines
    29 30   return
    30 31   }
    31 32   
     33 + os.Args[0] = strconv.Quote(os.Args[0])
    32 34   var argv = strings.Join(os.Args, " ")
    33 35   
    34 36   line := terminal.ParseLine(argv, 0)
    skipped 37 lines
  • ■ ■ ■ ■ ■ ■
    internal/terminal/utils.go
    skipped 2 lines
    3 3  import (
    4 4   "errors"
    5 5   "fmt"
     6 + "strings"
    6 7  )
    7 8   
    8 9  var ErrFlagNotSet = errors.New("Flag not set")
    skipped 160 lines
    169 170  }
    170 171   
    171 172  func parseSingleArg(line string, startPos int) (arg Argument, endPos int) {
     173 + 
     174 + var (
     175 + isInString = false
     176 + literalNext = false
     177 + )
     178 + 
     179 + if line[startPos] == '"' {
     180 + startPos++
     181 + isInString = true
     182 + }
     183 + 
    172 184   arg.start = startPos
    173 185   
     186 + var sb strings.Builder
     187 + 
     188 + defer func() {
     189 + arg.value = sb.String()
     190 + }()
     191 + 
    174 192   for arg.end = startPos; arg.end < len(line); arg.end++ {
    175 193   endPos = arg.end
    176 194   
    177  - if line[endPos] == ' ' {
     195 + if !literalNext {
     196 + 
     197 + if line[endPos] == '\\' {
     198 + literalNext = true
     199 + continue
     200 + }
     201 + 
     202 + if line[endPos] == '"' {
     203 + isInString = false
     204 + continue
     205 + }
     206 + }
     207 + 
     208 + if line[endPos] == ' ' && !isInString && !literalNext {
    178 209   return
    179 210   }
    180 211   
     212 + sb.WriteByte(line[endPos])
     213 + 
    181 214   arg.end = endPos
    182  - arg.value += string(line[endPos])
     215 + 
     216 + if literalNext {
     217 + literalNext = false
     218 + }
    183 219   }
    184 220   
    185 221   return
    skipped 163 lines
Please wait...
Page is in error, reload to recover