[BACK]Return to lib.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / awk

Diff for /src/usr.bin/awk/lib.c between version 1.36 and 1.37

version 1.36, 2020/06/11 12:00:51 version 1.37, 2020/06/16 16:14:22
Line 122 
Line 122 
  */   */
 void savefs(void)  void savefs(void)
 {  {
         size_t len;          size_t len = strlen(getsval(fsloc));
         if ((len = strlen(getsval(fsloc))) < len_inputFS) {          if (len >= len_inputFS) {
                 strlcpy(inputFS, *FS, len_inputFS);     /* for subsequent field splitting */                  len_inputFS = len + 1;
                 return;                  inputFS = realloc(inputFS, len_inputFS);
                   if (inputFS == NULL)
                           FATAL("field separator %.10s... is too long", *FS);
         }          }
           if (strlcpy(inputFS, *FS, len_inputFS) >= len_inputFS)
         len_inputFS = len + 1;  
         inputFS = realloc(inputFS, len_inputFS);  
         if (inputFS == NULL)  
                 FATAL("field separator %.10s... is too long", *FS);                  FATAL("field separator %.10s... is too long", *FS);
         memcpy(inputFS, *FS, len_inputFS);  
 }  }
   
 static bool firsttime = true;  static bool firsttime = true;
Line 508 
Line 506 
            DPRINTF( ("into refldbld, rec = <%s>, pat = <%s>\n", rec, fs) );             DPRINTF( ("into refldbld, rec = <%s>, pat = <%s>\n", rec, fs) );
         tempstat = pfa->initstat;          tempstat = pfa->initstat;
         for (i = 1; ; i++) {          for (i = 1; ; i++) {
                   const size_t fss_rem = fields + fieldssize + 1 - fr;
                 if (i > nfields)                  if (i > nfields)
                         growfldtab(i);                          growfldtab(i);
                 if (freeable(fldtab[i]))                  if (freeable(fldtab[i]))
Line 516 
Line 515 
                 fldtab[i]->sval = fr;                  fldtab[i]->sval = fr;
                    DPRINTF( ("refldbld: i=%d\n", i) );                     DPRINTF( ("refldbld: i=%d\n", i) );
                 if (nematch(pfa, rec)) {                  if (nematch(pfa, rec)) {
                           const size_t reclen = patbeg - rec;
                         pfa->initstat = 2;      /* horrible coupling to b.c */                          pfa->initstat = 2;      /* horrible coupling to b.c */
                            DPRINTF( ("match %s (%d chars)\n", patbeg, patlen) );                             DPRINTF( ("match %s (%d chars)\n", patbeg, patlen) );
                         strncpy(fr, rec, patbeg-rec);                          if (reclen >= fss_rem)
                         fr += patbeg - rec + 1;                                  FATAL("out of space for fields in refldbld");
                         *(fr-1) = '\0';                          memcpy(fr, rec, reclen);
                           fr += reclen;
                           *fr++ = '\0';
                         rec = patbeg + patlen;                          rec = patbeg + patlen;
                 } else {                  } else {
                            DPRINTF( ("no match %s\n", rec) );                             DPRINTF( ("no match %s\n", rec) );
                         strlcpy(fr, rec, fields + fieldssize - fr);                          if (strlcpy(fr, rec, fss_rem) >= fss_rem)
                                   FATAL("out of space for fields in refldbld");
                         pfa->initstat = tempstat;                          pfa->initstat = tempstat;
                         break;                          break;
                 }                  }

Legend:
Removed from v.1.36  
changed lines
  Added in v.1.37